<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Alexander Gladchenko</title><link>http://msmvps.com/blogs/gladchenko/default.aspx</link><description>SQL Server DBA blog</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Tips for DBA: Database is in transition?!</title><link>http://msmvps.com/blogs/gladchenko/archive/2008/09/26/1648965.aspx</link><pubDate>Fri, 26 Sep 2008 13:02:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648965</guid><dc:creator>gladchenko</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gladchenko/rsscomments.aspx?PostID=1648965</wfw:commentRss><comments>http://msmvps.com/blogs/gladchenko/archive/2008/09/26/1648965.aspx#comments</comments><description>&lt;p&gt;&lt;img align="right" src="http://www.itcommunity.ru/Themes/default/RssImportImages/588/13895ef4-2f7e-468e-b724-1a96b04270cd.gif" hspace="10" alt="" /&gt;&lt;/p&gt;
&lt;div align="justify"&gt;
&lt;p align="justify"&gt;Сегодня утром на одном из серверов произошёл &amp;quot;казус&amp;quot; с пользовательской базой данных, которую мои коллеги пытались перевести в OFFLINE, но процесс пошёл не штатно, база попала в переходное состояние, став недоступной и затруднив при этом мониторинг активности других пользовательских и системных баз&amp;hellip; Ситуация точно такая же, какая была описана &lt;a href="http://ssisblog.replicationanswers.com/"&gt;Полом Ибисоном&lt;/a&gt; в группе новостей: &lt;a href="http://www.sqlnewsgroups.net/group/microsoft.public.sqlserver.server/topic12612.aspx"&gt;OFFLINING and &amp;quot;Database &amp;#39;xxx&amp;#39; is in transition. Try the statement later.&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Проблема проявляется тем, что любые попытки подключиться к объектам базы ХХХ заканчиваются следующим сообщением об ошибке:&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&amp;quot;Database &amp;#39;ХХХ&amp;#39; is in transition. Try the statement later.&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;В журнале ошибок SQL Server есть сообщение типа:&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;Дата 26.09.2008 8:47:40&lt;br /&gt;Журнал SQL Server (Текущий - 26.09.2008 8:51:00)&lt;br /&gt;Источник spid131&lt;br /&gt;Сообщение Setting database option OFFLINE to ON for database ХХХ.&lt;/span&gt;&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;Обращение к системным метаданным построенное в виде сценария:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="justify"&gt;
&lt;pre class="src"&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; * &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; &lt;span style="color:#008000;"&gt;sys.dm_exec_requests&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; command
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p align="justify"&gt;Возвращает в числе первых процесс, в колонке command которого фигурирует инструкция &lt;span style="color:#0000ff;"&gt;ALTER DATABASE&lt;/span&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Рецепт, который подсказывает Пол, простой, но действенный. Посмотрите идентификатор процесса, в контексте которого исполняется инструкция &lt;span style="color:#0000ff;"&gt;ALTER DATABASE&lt;/span&gt;, и удалите этот процесс с помощью команды &lt;span style="color:#0000ff;"&gt;KILL&lt;/span&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Для того чтобы исключить возможность возникновения описываемой проблемы, Пол предлагает предварительно переводить базу данных в однопользовательский режим READONLY или в SINGLE_USER.&lt;br /&gt;Например так:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="justify"&gt;
&lt;pre class="src"&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ХХХ] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; SINGLE_USER &lt;span style="color:#0000ff;"&gt;WITH&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ROLLBACK&lt;/span&gt; IMMEDIATE
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648965" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gladchenko/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Tips for DBA: Deadlock Event Notifications</title><link>http://msmvps.com/blogs/gladchenko/archive/2008/09/17/1648042.aspx</link><pubDate>Wed, 17 Sep 2008 12:50:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648042</guid><dc:creator>gladchenko</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gladchenko/rsscomments.aspx?PostID=1648042</wfw:commentRss><comments>http://msmvps.com/blogs/gladchenko/archive/2008/09/17/1648042.aspx#comments</comments><description>&lt;p&gt;&lt;img align="right" src="http://img.microsoft.com/rus/SystemCenter/dpm/_I/h/55x55_bulletin.gif" hspace="10" alt="" /&gt;&lt;/p&gt;
&lt;div align="justify"&gt;
&lt;p align="justify"&gt;Начиная с SQL Server 2005, на службе DBA появилась такая замечательная возможность, как &lt;a href="http://msdn.microsoft.com/en-us/library/ms190427.aspx"&gt;Event Notifications&lt;/a&gt;, что в русской версии BOL принято называть &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms190427.aspx"&gt;уведомлением о событиях&lt;/a&gt;. Этот механизм позволяет включить незаметную трассировку системных событий и извлекать информацию о заданных события из очереди для анализа или реакции со стороны администратора. Полный список событий, которые таким образом можно отслеживать, можно найти в статье: &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms190655.aspx"&gt;События трассировки для использования с уведомлениями о событии&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Давайте рассмотрим упрощённый пример организации уведомлений о тупиковой блокировке и сделаем так, чтобы по электронной почте можно было получить письмо с графом блокировок.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Подготовительные действия&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Для начала настройте на тестовом сервере &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms175887.aspx"&gt;Database Mail&lt;/a&gt; и убедитесь, что всё работает правильно. С возможными проблемами с почтой поможет статья: &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms188663.aspx"&gt;Устранение неполадок в работе компонента Database Mail&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;У меня с настройками возникла только одна проблема, пришлось учесть, что вызов системной хранимой процедуры в следующем ниже примере будет выполняться не в том контексте, в котором я привык работать :) В общем, пришлось на время сделать её доступной всем желающим. Вот один из способов это сделать:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="left"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; MSDB 
Go 
&lt;span style="color:#0000ff;"&gt;GRANT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;EXECUTE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color:#800000;"&gt;msdb.dbo.sp_send_dbmail&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TO&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;
GO
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p align="justify"&gt;Для того, чтобы задействовать очереди событий для интересующих нас баз данных, нужно включить компонент Service Broker. Как это сделать для базы AdventureWorks показано в следующем сценарии:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="left"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; master
GO
&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [AdventureWorks] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ENABLE_BROKER &lt;span style="color:#0000ff;"&gt;WITH&lt;/span&gt; NO_WAIT &lt;span style="color:#008080;"&gt;-- с базой должен работать брокер&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; name, is_broker_enabled &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; sys.databases &lt;span style="color:#008080;"&gt;-- проверка, что брокер включён&lt;/span&gt;
GO
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Создание очереди, службы, сообщения и маршрута&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;В качестве места базирования наших очередей и сообщений мы выберем системную базу данных tempdb. Она есть на любом сервере и Service Broker для неё включён по умолчанию. Первым делом мы заготавливаем процедуру, которая будет вызываться при регистрации интересующего нас события:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="left"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; tempdb
GO
&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;PROCEDURE&lt;/span&gt; [p_Notify] 
&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt;  @subject &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;&lt;b&gt;128&lt;/b&gt;&lt;/span&gt;), @body &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;) 
&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt;  @NotificationStore &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt; (message_body &lt;span style="color:#0000ff;"&gt;varbinary&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;));
&lt;span style="color:#008080;"&gt;-- извлекаем сообщения из очереди и помещаем их в табличную переменную&lt;/span&gt;
RECEIVE	&lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;) message_body &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; tempdb..DEADLOCK_Queue &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; @NotificationStore
&lt;span style="color:#008080;"&gt;-- собираем тему и содержимое электронного письма&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;	&lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;) @body = &lt;span style="color:#ff00ff;"&gt;CAST&lt;/span&gt;(message_body &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;)) &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; @NotificationStore        
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;	@subject = &lt;span style="color:#ff00ff;"&gt;CAST&lt;/span&gt;(&lt;span style="color:#ff00ff;"&gt;CURRENT_TIMESTAMP&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;) + &lt;span style="color:#ff0000;"&gt;&amp;#39; Случился DEADLOCK&amp;#39;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt; @body &lt;span style="color:#0000ff;"&gt;IS&lt;/span&gt; &lt;span style="color:#777777;"&gt;NOT&lt;/span&gt; &lt;span style="color:#777777;"&gt;NULL&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; &lt;span style="color:#800000;"&gt;msdb.dbo.sp_send_dbmail&lt;/span&gt;	 
	 @profile_name = &lt;span style="color:#ff0000;"&gt;&amp;#39;ПОЧТОВЫЙ ПРОФИЛЬ&amp;#39;&lt;/span&gt; &lt;span style="color:#008080;"&gt;-- профиль по умолчанию и не скрытый&lt;/span&gt;
	,@recipients   = &lt;span style="color:#ff0000;"&gt;&amp;#39;АДРЕСАТ@ХОСТ.ru&amp;#39;&lt;/span&gt; &lt;span style="color:#008080;"&gt;-- адресат&lt;/span&gt;
	,@subject      = @subject
	,@body         = @body
GO
&lt;span style="color:#008080;"&gt;-- создаём очередь&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt;	 QUEUE DEADLOCK_Queue &lt;span style="color:#0000ff;"&gt;WITH&lt;/span&gt;	 
	 STATUS = &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;
	,RETENTION = &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;
	,ACTIVATION (
			PROCEDURE_NAME = tempdb..p_Notify,
			MAX_QUEUE_READERS = &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;,
			&lt;span style="color:#0000ff;"&gt;EXECUTE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;dbo&amp;#39;&lt;/span&gt; 
		     )
GO
&lt;span style="color:#008080;"&gt;-- создаём службу&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; SERVICE DEADLOCK_Notify &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt; QUEUE DEADLOCK_Queue 
	([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
GO
&lt;span style="color:#008080;"&gt;-- определяем локальную маршрутизацию&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; ROUTE DEADLOCK_Route &lt;span style="color:#0000ff;"&gt;WITH&lt;/span&gt; SERVICE_NAME = &lt;span style="color:#ff0000;"&gt;&amp;#39;DEADLOCK_Notify&amp;#39;&lt;/span&gt;, ADDRESS = &lt;span style="color:#ff0000;"&gt;&amp;#39;LOCAL&amp;#39;&lt;/span&gt;;
GO
&lt;span style="color:#008080;"&gt;-- создаём уведомление уровня сервера для событий появления графа тупиковой блокировки&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; EVENT NOTIFICATION DEADLOCK_Event &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt; SERVER &lt;span style="color:#0000ff;"&gt;FOR&lt;/span&gt; DEADLOCK_GRAPH 
&lt;span style="color:#008080;"&gt;-- если нужны все виды сообщений о блокировках, используйте TRC_LOCKS&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;TO&lt;/span&gt; SERVICE &lt;span style="color:#ff0000;"&gt;&amp;#39;DEADLOCK_Notify&amp;#39;&lt;/span&gt;, &lt;span style="color:#ff0000;"&gt;&amp;#39;current database&amp;#39;&lt;/span&gt;
&lt;span style="color:#008080;"&gt;-- проверка&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; * &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; sys.server_event_notifications &lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt; name = &lt;span style="color:#ff0000;"&gt;&amp;#39;DEADLOCK_Event&amp;#39;&lt;/span&gt;;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; * &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; sys.server_events
GO
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p align="justify"&gt;После того, как представленный выше сценарий будет успешно применён на тестовом сервере, будет создано всё необходимое для получения почтовых сообщений. В теле письма будет правильный XML, у которого в теге &amp;lt;TextData&amp;gt; лежит стандартный граф взаимоблокировки, который открывается тэгом &amp;lt;deadlock-list&amp;gt;. Если его вырезать и сохранить в файле с расширением xdl, то при открытии такого файла в приложении SQL Server Management Studio, вы увидите привычную схему блокировки, обычно получаемую с помощью SQL Server Profiler.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Удаление созданных для тестовых целей объектов&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Удалить следы наших сценариев в базе данных tempdb помогут следующие команды:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="left"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#008080;"&gt;-- DROP PROCEDURE p_Notify&lt;/span&gt;
&lt;span style="color:#008080;"&gt;-- DROP EVENT NOTIFICATION DEADLOCK_Event ON SERVER &lt;/span&gt;
&lt;span style="color:#008080;"&gt;-- DROP ROUTE DEADLOCK_Route&lt;/span&gt;
&lt;span style="color:#008080;"&gt;-- DROP SERVICE DEADLOCK_Notify&lt;/span&gt;
&lt;span style="color:#008080;"&gt;-- DROP QUEUE DEADLOCK_Queue&lt;/span&gt;
&lt;span style="color:#008080;"&gt;-- ALTER DATABASE [AdventureWorks] SET  DISABLE_BROKER WITH NO_WAIT&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Бонус&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Если Вы хотите, чтобы стандартный файл взаимоблокировки приходил в письме и в качестве вложения, измените процедуру следующим образом:&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="left"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; tempdb
GO
&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;PROCEDURE&lt;/span&gt; [p_Notify] 
&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt;  @subject &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;&lt;b&gt;255&lt;/b&gt;&lt;/span&gt;), @x XML, @body &lt;span style="color:#0000ff;"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;), @query &lt;span style="color:#0000ff;"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;), @filename &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;&lt;b&gt;30&lt;/b&gt;&lt;/span&gt;) 
&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt;  @NotificationStore &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt; (message_body &lt;span style="color:#0000ff;"&gt;varbinary&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;));
&lt;span style="color:#008080;"&gt;-- извлекаем сообщения из очереди и помещаем их в табличную переменную&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;RECEIVE	TOP&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;) message_body &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; tempdb..DEADLOCK_Queue &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; @NotificationStore
&lt;span style="color:#008080;"&gt;-- собираем тему и содержимое электронного письма&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;	&lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;) @x = &lt;span style="color:#ff00ff;"&gt;CAST&lt;/span&gt;(message_body &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; XML) &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; @NotificationStore
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; @body = &lt;span style="color:#ff00ff;"&gt;CAST&lt;/span&gt;(@x &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;))
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; @x = @x.query(&lt;span style="color:#ff0000;"&gt;&amp;#39;/EVENT_INSTANCE/TextData/deadlock-list&amp;#39;&lt;/span&gt;)
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; @subject = &lt;span style="color:#ff00ff;"&gt;CONVERT&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;&lt;b&gt;19&lt;/b&gt;&lt;/span&gt;), &lt;span style="color:#ff00ff;"&gt;CURRENT_TIMESTAMP&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;&lt;b&gt;126&lt;/b&gt;&lt;/span&gt;) + &lt;span style="color:#ff0000;"&gt;&amp;#39;_DEADLOCK&amp;#39;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; @filename = &lt;span style="color:#ff00ff;"&gt;REPLACE&lt;/span&gt;(@subject,&lt;span style="color:#ff0000;"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;,&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)+ &lt;span style="color:#ff0000;"&gt;&amp;#39;.xdl&amp;#39;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt; @body &lt;span style="color:#0000ff;"&gt;IS&lt;/span&gt; &lt;span style="color:#777777;"&gt;NOT&lt;/span&gt; &lt;span style="color:#777777;"&gt;NULL&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;BEGIN&lt;/span&gt;
	&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;	@query = N&lt;span style="color:#ff0000;"&gt;&amp;#39;SET NOCOUNT ON SELECT &amp;#39;&lt;/span&gt; + N&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt; + &lt;span style="color:#ff00ff;"&gt;REPLACE&lt;/span&gt;(&lt;span style="color:#ff00ff;"&gt;CAST&lt;/span&gt;(@x &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;MAX&lt;/span&gt;)),&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) + N&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
	&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt;	&lt;span style="color:#800000;"&gt;msdb.dbo.sp_send_dbmail&lt;/span&gt;	 
	        @profile_name = &lt;span style="color:#ff0000;"&gt;&amp;#39;ПОЧТОВЫЙ ПРОФИЛЬ&amp;#39;&lt;/span&gt; &lt;span style="color:#008080;"&gt;-- профиль по умолчанию и не скрытый&lt;/span&gt;
	       ,@recipients   = &lt;span style="color:#ff0000;"&gt;&amp;#39;АДРЕСАТ@ХОСТ.ru&amp;#39;&lt;/span&gt; &lt;span style="color:#008080;"&gt;-- адресат&lt;/span&gt;
	       ,@subject      = @subject
	       ,@body         = @body
	       ,@query	      = @query
	       ,@execute_query_database      = &lt;span style="color:#ff0000;"&gt;&amp;#39;tempdb&amp;#39;&lt;/span&gt;
	       ,@query_attachment_filename   = @filename
	       ,@attach_query_result_as_file = &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;
	       ,@query_result_header = &lt;span style="color:#00008b;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;
	       ,@query_result_width = &lt;span style="color:#00008b;"&gt;&lt;b&gt;32767&lt;/b&gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;END&lt;/span&gt;
GO
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648042" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gladchenko/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Минимальные требования к размещению файлов пользовательских баз данных</title><link>http://msmvps.com/blogs/gladchenko/archive/2008/09/02/1646464.aspx</link><pubDate>Tue, 02 Sep 2008 02:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1646464</guid><dc:creator>gladchenko</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gladchenko/rsscomments.aspx?PostID=1646464</wfw:commentRss><comments>http://msmvps.com/blogs/gladchenko/archive/2008/09/02/1646464.aspx#comments</comments><description>&lt;div align="justify"&gt;
&lt;p align="justify"&gt;&lt;img align="right" src="http://msmvps.com/blogs/gladchenko/gladchenko/ss2k5.jpg" hspace="10" alt="" /&gt;Настоящие требования распространяются на тестовые и пользовательские базы данных, с размерами до 300Гб, без повышенных требований к доступности, готовности и надёжности.&lt;/p&gt;
&lt;p align="justify"&gt;Файлы пользовательских баз данных, журналов транзакций, журналов планов обслуживания и других журналов располагаются в стандартной структуре каталогов, используемой вендором. При наличии нескольких дисков (дисковых массивов), системные и серверные каталоги располагаются на диске C (в предлагаемых программой установке каталогах по умолчанию - C:\Program Files\Microsoft SQL Server), файлы данных располагаются на диске D, а файл журнала транзакций (который рекомендуется иметь один для каждой БД) располагаются на диске E. В корне каждого диска создаётся каталог MSSQL, в котором создаются подкаталоги для размещения соответствующих файлов. Для файлов данных создаётся подкаталог DATA, для файлов журналов подкаталог LOG, для файлов резервных копий подкаталог BACKUP. Нежелательно располагать на одном диске файлы с разным типом доступа, например, файлы данных и файл журнала транзакций. Для повышения живучести приложения баз данных, нежелательно располагать файлы резервных копий на одном диске с файлами данных. Например, для трёх дисков возможна такая, типовая конфигурация размещения файлов баз данных:&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;
&lt;li&gt;C:\Program Files\Microsoft SQL Server\ - фалы сервера баз данных, системные базы данных, журналы планов обслуживания и т.п.&lt;/li&gt;
&lt;li&gt;D:\MSSQL\DATA\ - Файлы данных пользовательских баз данных.&lt;/li&gt;
&lt;li&gt;E:\MSSQL\LOG\ - Файл журнала регистрации транзакций пользовательской базы данных.&lt;/li&gt;
&lt;li&gt;E:\MSSQL\BACKUP\ - Файлы резервных копий пользовательских и системных баз данных.&lt;/li&gt;
&lt;/p&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Параметры создаваемых баз данных желательно выбирать стандартными, предлагаемыми по умолчанию. Каждое изменение стандартных значений параметров должно быть обосновано и документировано (sp_addextendedproperty).&lt;/p&gt;
&lt;p align="justify"&gt;Для размещения пользовательских данных создаётся отдельная файловая группа (группы), которая делается файловой группой по умолчанию. Предлагается называть такую группу: DATAGROUP. Делается это для того, чтобы разнести по разным файлам системные и пользовательские объекты базы данных.&lt;/p&gt;
&lt;p align="justify"&gt;Если дисков для размещения файлов много, желательно в файловой группе DATAGROUP создавать несколько файлов данных (например, по числу установленных в системе сокетов центральных процессоров). В таком случае файлы размещаются на разных дисках, а SQL Server балансирует нагрузку между ними, что повышает производительность операций ввода-вывода.&lt;/p&gt;
&lt;p align="justify"&gt;Для размещения файлов журналов транзакций необходимо использовать защищённые от отказа диска массивы, например RAID1. Для файлов данных пользовательских БД использование защищённых массивов спецификацией требование ACID не является обязательным при условии использования полной модели восстановления и регулярного резервирования не только баз данных, но и журналов регистрации транзакций.&lt;/p&gt;
&lt;p align="justify"&gt;Для размещения файлов баз данных и особенно журналов транзакций нежелательно использовать массивы RAID5x или RAID6x, в силу крайне низкой скорости записи. Эти типы массивов можно использовать для размещения файлов резервных копий или файлов данных с малым процентом операций записи.&lt;/p&gt;
&lt;p align="justify"&gt;Как правило, SQL Server балансирует нагрузку ввода-вывода эффективнее аппаратных решений. Поэтому предпочтительно размещать базу данных на нескольких файлах и помещать файлы на собственные диски, чем размещать базу в одном файле данных и помещать его на массивы типа RAID10 или SAN. Рекомендуется, для принятия решения о целесообразности использования RAID10 или SAN проводить тестирование разных вариантов конфигурации дисковой подсистемы.&lt;/p&gt;
&lt;p align="justify"&gt;Если после создания БД планируется массовая загрузка данных, желательно при создании установить достаточный размер файлам данных и журнала транзакций. Автоматическое приращение файлов является ресурсоёмкой операцией и может существенно увеличить время загрузки данных. Кроме того, если на разделе диска находятся несколько файлов данных, размер которых может изменяться, это становится причиной файловой фрагментации данных и журналов. Для обеспечения высокой производительности работы приложений необходимо дефрагментировать файлы баз данных на регулярной основе. Уменьшение размеров файлов данных крайне не желательно, эта операция может применяться только для сокращения размера файла журнала транзакций, если это стало необходимо (например, после массовой журналируемой загрузки).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Пример сценария создания пользовательской базы данных:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; [master]&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;PRIMARY&lt;/span&gt;&lt;br /&gt;(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NAME = N&lt;span style="color:#ff0000;"&gt;&amp;#39;ЛогическоеИмяФайлаСистемныхДанных&amp;#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;FILENAME = N&lt;span style="color:#ff0000;"&gt;&amp;#39;D:\MSSQL\DATA\ИмяФайлаСистемныхДанных.mdf&amp;#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;SIZE&lt;/span&gt; = 131072KB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;MAXSIZE = UNLIMITED&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;FILEGROWTH = 131072KB&lt;br /&gt;),&lt;br /&gt;FILEGROUP [DATAGROUP]&lt;br /&gt;(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NAME = N&lt;span style="color:#ff0000;"&gt;&amp;#39;ЛогическоеИмяФайлаДанных&amp;#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;FILENAME = N&lt;span style="color:#ff0000;"&gt;&amp;#39;D:\MSSQL\DATA\ИмяФайлаДанных.ndf&amp;#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;SIZE&lt;/span&gt; = 131072KB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;MAXSIZE = UNLIMITED&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;FILEGROWTH = 131072KB&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:#ff00ff;"&gt;LOG&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;&lt;br /&gt;(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NAME = N&lt;span style="color:#ff0000;"&gt;&amp;#39;ЛогическоеИмяФайлаЖурнала&amp;#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;FILENAME = N&lt;span style="color:#ff0000;"&gt;&amp;#39;E:\MSSQL\LOG\ИмяФайлаЖурнала.ldf&amp;#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;SIZE&lt;/span&gt; = 131072KB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;MAXSIZE = 2048GB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&amp;nbsp;&amp;nbsp;FILEGROWTH = 131072KB&lt;br /&gt;)&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; dbo.sp_dbcmptlevel @dbname=N&lt;span style="color:#ff0000;"&gt;&amp;#39;ИмяБазыДанных&amp;#39;&lt;/span&gt;, @new_cmptlevel=&lt;span style="color:#00008b;"&gt;&lt;b&gt;90&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt; = &lt;span style="color:#ff00ff;"&gt;FULLTEXTSERVICEPROPERTY&lt;/span&gt;(&lt;span style="color:#ff0000;"&gt;&amp;#39;IsFullTextInstalled&amp;#39;&lt;/span&gt;))&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; [ИмяБазыДанных].[dbo].[sp_fulltext_database] @action = &lt;span style="color:#ff0000;"&gt;&amp;#39;disable&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;MODIFY&lt;/span&gt; FILEGROUP [DATAGROUP] &lt;span style="color:#0000ff;"&gt;DEFAULT&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_NULL_DEFAULT &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_NULLS &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_PADDING &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_WARNINGS &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ARITHABORT &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; AUTO_CLOSE &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; AUTO_CREATE_STATISTICS &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; AUTO_SHRINK &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; AUTO_UPDATE_STATISTICS &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; CURSOR_CLOSE_ON_COMMIT &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; CURSOR_DEFAULT &lt;span style="color:#0000ff;"&gt;GLOBAL&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; CONCAT_NULL_YIELDS_NULL &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; NUMERIC_ROUNDABORT &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; QUOTED_IDENTIFIER &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; RECURSIVE_TRIGGERS &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ENABLE_BROKER&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; AUTO_UPDATE_STATISTICS_ASYNC &lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; DATE_CORRELATION_OPTIMIZATION &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; TRUSTWORTHY &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ALLOW_SNAPSHOT_ISOLATION &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; PARAMETERIZATION SIMPLE&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; READ_WRITE&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; RECOVERY SIMPLE&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; MULTI_USER&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; PAGE_VERIFY NONE&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; DB_CHAINING &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; [ИмяБазыДанных]&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; sp_changedbowner &lt;span style="color:#ff0000;"&gt;&amp;#39;sa&amp;#39;&lt;/span&gt;&lt;br /&gt;GO&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; [ИмяБазыДанных].sys.sp_addextendedproperty @name=N&lt;span style="color:#ff0000;"&gt;&amp;#39;SET AUTO_UPDATE_STATISTICS_ASYNC ON&amp;#39;&lt;/span&gt;&lt;br /&gt;, @value=N&lt;span style="color:#ff0000;"&gt;&amp;#39;Стандартное значение изменено для снижения необходимости частого обновления статистики в рамках планов обслуживания БД.&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; [ИмяБазыДанных].sys.sp_addextendedproperty @name=N&lt;span style="color:#ff0000;"&gt;&amp;#39;SET PAGE_VERIFY NONE&amp;#39;&lt;/span&gt;&lt;br /&gt;, @value=N&lt;span style="color:#ff0000;"&gt;&amp;#39;Стандартное значение изменено для повышения производительности IO, включать нужно при обнаружении ошибок DBCC CHECKDB или для критических бизнесу приложений.&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;EXEC&lt;/span&gt; [ИмяБазыДанных].sys.sp_addextendedproperty @name=N&lt;span style="color:#ff0000;"&gt;&amp;#39;SET RECOVERY SIMPLE&amp;#39;&lt;/span&gt;&lt;br /&gt;, @value=N&lt;span style="color:#ff0000;"&gt;&amp;#39;Для повышения производительности не критичных приложений. Если нужно восстанавливать данные на заданый момент времени, нужно выбрать другую модель и обеспечить резервное копирование журнала транзакций.&amp;#39;&lt;/span&gt;&lt;br /&gt;GO&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Полезные ссылки:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/library/ms189638.aspx"&gt;Основные сведения о базах данных&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/library/ms176061.aspx"&gt;CREATE DATABASE (Transact-SQL)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/library/ms175987.aspx"&gt;Выбор модели восстановления для базы данных&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/library/bb402876(en-us).aspx"&gt;Place Data and Log Files on Separate Drives (SQL Server BPA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/library/bb402873(en-us).aspx"&gt;Set PAGE_VERIFY Database Option to CHECKSUM (SQL Server BPA)&lt;/a&gt;&lt;/li&gt;
&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;FAQ:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Вопрос 1.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;В представленном выше примере сценария создания БД, есть установка значений настроек по умолчанию:&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_NULLS &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_PADDING &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ANSI_WARNINGS &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; ARITHABORT &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; CONCAT_NULL_YIELDS_NULL &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DATABASE&lt;/span&gt; [ИмяБазыДанных] &lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; QUOTED_IDENTIFIER &lt;span style="color:#0000ff;"&gt;OFF&lt;/span&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Тут значения по умолчанию выставляются в OFF. Чем это обусловлено? Вопрос возник, поскольку неясны причины отклонения от ANSI стандарта, к тому же в другом регламенте рекомендуется выставлять данные настройки в ON:&lt;/p&gt;
&lt;ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;transaction&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;isolation&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;level&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;read&lt;/span&gt; committed;&lt;br /&gt;&lt;span style="color:#008080;"&gt;-- Если всё совсем уж плохо - uncommitted&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;nocount&lt;/span&gt; &lt;span style="color:#008080;"&gt;-- меньше трафик&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,quoted_identifier &lt;span style="color:#008080;"&gt;-- стандартизация кавычек&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,ansi_nulls &lt;span style="color:#008080;"&gt;-- стандартизация сравнения с NULL&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,ansi_warnings &lt;span style="color:#008080;"&gt;-- вывод ошибок агрегации NULL и деления на 0&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,ansi_padding &lt;span style="color:#008080;"&gt;-- стандартизация оконечных пробелов и нулей&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,arithabort &lt;span style="color:#008080;"&gt;-- стандартизация отката транзакций&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,xact_abort &lt;span style="color:#008080;"&gt;-- стандартизация отката транзакций&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,concat_null_yields_null &lt;span style="color:#008080;"&gt;-- сцепление с NULL&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;SET&lt;/span&gt; numeric_roundabort &lt;span style="color:#0000ff;"&gt;off&lt;/span&gt;; &lt;span style="color:#008080;"&gt;-- стандартизация потери точности&lt;/span&gt;&lt;br /&gt;GO&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ответ 1.&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Это установки по умолчанию, которые делает для новой базы данных соответствующий мастер SQL Server 2005 Management Studio. В регламенте предлагается документировать все отклонения от стандартных настроек, которые показаны в примере и там же есть образец документирования. На самом деле, если проще изменять установки по умолчанию, а не добавлять их в каждый сценарий создания объектов, можно создать базу с желаемым набором умолчаний. Однако, в таком случае нужно чётко понимать, что изменение настроек не приведёт к конфликтам с системными объектами или при промежуточной материализации в tempdb... Добавление установок в сценарии является более простым, понятным и, главное, управляемым путём настройки.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1646464" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gladchenko/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Tips for DBA: Статистика I/O файлов баз данных</title><link>http://msmvps.com/blogs/gladchenko/archive/2008/06/16/1635705.aspx</link><pubDate>Mon, 16 Jun 2008 07:16:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1635705</guid><dc:creator>gladchenko</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gladchenko/rsscomments.aspx?PostID=1635705</wfw:commentRss><comments>http://msmvps.com/blogs/gladchenko/archive/2008/06/16/1635705.aspx#comments</comments><description>&lt;div align="justify"&gt;
&lt;p&gt;&lt;img align="right" src="http://img.microsoft.com/rus/SystemCenter/dpm/_I/h/55x55_bulletin.gif" hspace="12" alt="" /&gt; Для оптимального размещения файлов баз данных на дисках необходимо понимать какой объём операций ввода-вывода SQL Server организует для каждого из этих файлов. Для подобных оценок SQL Server располагает всеми необходимыми средствами, о которых и пойдёт речь в этой статье. Приводимые ниже примеры предназначены для использования в SQL Server 2005 и выше. Для применения функции прежних версий ознакомьтесь со статьёй &amp;quot;&lt;a href="http://msdn.microsoft.com/ru-ru/library/ms187997.aspx"&gt;Соответствия между системными таблицами SQL Server 2000 и системными представлениями SQL Server 2005&lt;/a&gt;&amp;quot;.&lt;br /&gt;В первом примере используются старые функции, но работоспособен он только начиная с SQL Server 2005 (в силу отличий в возможностях). Этот пример демонстрирует наиболее ресурсоёмкие по объёму ввода-вывода файлы баз данных, обслуживаемые текущим экземпляром SQL Server 2005. Анализируя результаты исполнения представленного ниже сценария можно понять какие файлы создают наиболее весомую нагрузку, какую нагрузку создают разные базы данных и какие именно операции преобладают для каждого из десяти файлов. В примере используется системная таблица &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms181338.aspx"&gt;sysaltfiles&lt;/a&gt; и системная функция &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms187309.aspx"&gt;fn_virtualfilestats&lt;/a&gt;, которая возвращает статистику ввода-вывода для файлов базы данных, включая файлы журналов транзакций.&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; master
GO
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt; &lt;span style="color:#00008b;"&gt;&lt;b&gt;10&lt;/b&gt;&lt;/span&gt;	&lt;span style="color:#ff00ff;"&gt;DB_NAME&lt;/span&gt;(saf.dbid)			&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [База данных]
	,	saf.name				&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Логическое имя]
	,	vfs.BytesRead/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt;			&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Прочитано (Мб)]
	,	vfs.BytesWritten/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt;		&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Записано (Мб)]
	,	saf.filename 				&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Путь к файлу]
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt;		&lt;span style="color:#00aa00;"&gt;sysaltfiles&lt;/span&gt;				&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; saf
&lt;span style="color:#777777;"&gt;JOIN&lt;/span&gt;	::	&lt;span style="color:#af0000;"&gt;fn_virtualfilestats&lt;/span&gt;(&lt;span style="color:#777777;"&gt;NULL&lt;/span&gt;,&lt;span style="color:#777777;"&gt;NULL&lt;/span&gt;)		&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; vfs
&lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;		vfs.dbid = saf.dbid 
&lt;span style="color:#777777;"&gt;AND&lt;/span&gt;		vfs.fileid = saf.fileid
&lt;span style="color:#777777;"&gt;AND&lt;/span&gt;		saf.dbid &lt;span style="color:#777777;"&gt;NOT&lt;/span&gt; &lt;span style="color:#777777;"&gt;IN&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;,&lt;span style="color:#00008b;"&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;,&lt;span style="color:#00008b;"&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;)
&lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt;	vfs.BytesRead/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt; + BytesWritten/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DESC&lt;/span&gt;
GO
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;Второй пример демонстрирует суммарную нагрузку ввода-вывода всех файлов баз данных экземпляра на каждый диск,&amp;nbsp;&amp;nbsp;используемый для размещения баз данных. Здесь принято допущение, что каждый логический диск обозначен буквой, т.е. если физические диски смонтированы на каталоги или не обозначены вовсе, представленные в примере сценарий нужно соответствующим образом исправить. Для простоты демонстрации мы ограничимся наиболее типичным случаем монтирования дисков на одну букву. Если на диске несколько разделов, обозначенных каждый своей буквой, это нужно учитывать при анализе результатов, суммируя нагрузку по буквам разделов одного диска. В примере используются новое динамическое административное представление &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms190326.aspx"&gt;sys.dm_io_virtual_file_stats&lt;/a&gt;, которое заменяет функцию &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms187309.aspx"&gt;fn_virtualfilestats&lt;/a&gt;. Кроме того, старую системную таблицу &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms181338.aspx"&gt;sysaltfiles&lt;/a&gt; в примере заменяет общесистемное представление &lt;a href="http://msdn.microsoft.com/ru-ru/library/ms186782.aspx"&gt;sys.master_files&lt;/a&gt;.&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;p&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;   &lt;span style="color:#ff00ff;"&gt;SUBSTRING&lt;/span&gt;(saf.physical_name, &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;)		&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Диск]
       , &lt;span style="color:#ff00ff;"&gt;SUM&lt;/span&gt;(vfs.num_of_bytes_read/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt;)		&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Прочитано (Мб)]
       , &lt;span style="color:#ff00ff;"&gt;SUM&lt;/span&gt;(vfs.num_of_bytes_written/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt;)		&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; [Записано (Мб)]
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt;	 &lt;span style="color:#008000;"&gt;sys.master_files&lt;/span&gt;				&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; saf
&lt;span style="color:#777777;"&gt;JOIN&lt;/span&gt;	 &lt;span style="color:#008000;"&gt;sys.dm_io_virtual_file_stats&lt;/span&gt;(&lt;span style="color:#777777;"&gt;NULL&lt;/span&gt;,&lt;span style="color:#777777;"&gt;NULL&lt;/span&gt;)	&lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; vfs
&lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt;	 vfs.database_id = saf.database_id 
&lt;span style="color:#777777;"&gt;AND&lt;/span&gt;	 vfs.&lt;span style="color:#ff00ff;"&gt;file_id&lt;/span&gt; = saf.&lt;span style="color:#ff00ff;"&gt;file_id&lt;/span&gt;
&lt;span style="color:#777777;"&gt;AND&lt;/span&gt;	 saf.database_id &lt;span style="color:#777777;"&gt;NOT&lt;/span&gt; &lt;span style="color:#777777;"&gt;IN&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;,&lt;span style="color:#00008b;"&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;,&lt;span style="color:#00008b;"&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;)
&lt;span style="color:#777777;"&gt;AND&lt;/span&gt;	 saf.type &amp;lt; &lt;span style="color:#00008b;"&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;GROUP&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;SUBSTRING&lt;/span&gt;(saf.physical_name, &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;)
&lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; [Диск]
GO

&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;div align="justify"&gt;
&lt;p align="justify"&gt;В качестве бонуса - вариант сценария для SQL Server 2000.&lt;/p&gt;
&lt;table bgcolor="#ffffff" cellpadding="10" cellspacing="10"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;USE&lt;/span&gt; master
GO
&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt;   @dbid &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;, @dbname &lt;span style="color:#0000ff;"&gt;sysname&lt;/span&gt;, @fileid &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;
	, @name &lt;span style="color:#0000ff;"&gt;sysname&lt;/span&gt;, @BytesRead &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;
	, @BytesWritten &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;, @filename &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;&lt;b&gt;255&lt;/b&gt;&lt;/span&gt;)
&lt;span style="color:#0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt; ##IOfilestat 
	( [База данных] &lt;span style="color:#0000ff;"&gt;sysname&lt;/span&gt;
	, [№ файла] &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;
	, [Логическое имя] &lt;span style="color:#0000ff;"&gt;sysname&lt;/span&gt;
	, [Прочитано (Мб)] &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;
	, [Записано (Мб)] &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;
	, [Путь к файлу] &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;&lt;b&gt;255&lt;/b&gt;&lt;/span&gt;)
	)
&lt;span style="color:#0000ff;"&gt;DECLARE&lt;/span&gt;	  filestats &lt;span style="color:#0000ff;"&gt;CURSOR&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;GLOBAL&lt;/span&gt; FAST_FORWARD READ_ONLY &lt;span style="color:#0000ff;"&gt;FOR&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;	  saf.dbid
	, saf.fileid
	, saf.name
	, saf.filename
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt;	  &lt;span style="color:#00aa00;"&gt;sysaltfiles&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; saf
&lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt;	  saf.dbid &lt;span style="color:#777777;"&gt;NOT&lt;/span&gt; &lt;span style="color:#777777;"&gt;IN&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;,&lt;span style="color:#00008b;"&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;,&lt;span style="color:#00008b;"&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;)
&lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt;  saf.name

&lt;span style="color:#0000ff;"&gt;OPEN&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;GLOBAL&lt;/span&gt; filestats
&lt;span style="color:#0000ff;"&gt;WHILE&lt;/span&gt; &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;BEGIN&lt;/span&gt;
	&lt;span style="color:#0000ff;"&gt;FETCH&lt;/span&gt; filestats &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; @dbid, @fileid, @name, @filename
	&lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;@@fetch_status&lt;/span&gt; &amp;lt;&amp;gt; &lt;span style="color:#00008b;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BREAK&lt;/span&gt;
	&lt;span style="color:#0000ff;"&gt;INSERT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;INTO&lt;/span&gt; ##IOfilestat 
		(   [База данных]
		,   [№ файла]
		,   [Логическое имя]
		,   [Прочитано (Мб)]
		,   [Записано (Мб)]
		,   [Путь к файлу] 
		)
	&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;	&lt;span style="color:#ff00ff;"&gt;DB_NAME&lt;/span&gt;(@dbid)
		,  @fileid
		,  @name
		, (&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; BytesRead/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; :: &lt;span style="color:#af0000;"&gt;fn_virtualfilestats&lt;/span&gt;(@dbid, @fileid))
		, (&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; BytesWritten/&lt;span style="color:#00008b;"&gt;&lt;b&gt;1048576&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; :: &lt;span style="color:#af0000;"&gt;fn_virtualfilestats&lt;/span&gt;(@dbid, @fileid))
		,  @filename
&lt;span style="color:#0000ff;"&gt;END&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;CLOSE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;GLOBAL&lt;/span&gt; filestats
&lt;span style="color:#0000ff;"&gt;DEALLOCATE&lt;/span&gt; filestats
&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; [База данных],[№ файла],[Логическое имя],[Прочитано (Мб)],[Записано (Мб)],[Путь к файлу]
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; ##IOfilestat
&lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt; [Прочитано (Мб)] + [Записано (Мб)] &lt;span style="color:#0000ff;"&gt;DESC&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;DROP&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;TABLE&lt;/span&gt; ##IOfilestat
GO&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1635705" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gladchenko/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Разработка технической документации. Руководство для технических писателей и локализаторов ПО (+CD)</title><link>http://msmvps.com/blogs/gladchenko/archive/2008/05/05/1613699.aspx</link><pubDate>Mon, 05 May 2008 05:36:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1613699</guid><dc:creator>gladchenko</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gladchenko/rsscomments.aspx?PostID=1613699</wfw:commentRss><comments>http://msmvps.com/blogs/gladchenko/archive/2008/05/05/1613699.aspx#comments</comments><description>&lt;div align="justify"&gt;
&lt;p&gt;&lt;img hspace="12" src="http://www.piter.com/i/mail/logo1.gif" align="right" alt="" /&gt; Автор: Глаголев В. А. 1-е издание, 2008 год, 192 стр., формат 17x24 см, мягкая обложка, ISBN 978-5-388-00101-6, 280 руб.&lt;/p&gt;
&lt;table class="" cellspacing="10" cellpadding="10" bgcolor="#ffffff"&gt;

&lt;tr&gt;
&lt;td class=""&gt;
&lt;div align="justify"&gt;
&lt;p&gt;&lt;a href="http://www.piter.com/book.phtml?978538800101&amp;amp;refer=1101"&gt;&lt;img hspace="12" src="http://www.piter.com/covers_b/38800101.jpg" align="left" alt="" /&gt;&lt;/a&gt; Эта книга станет незаменимым помощником в работе технических писателей, специалистов по стандартизации и переводчиков-локализаторов программного обеспечения. Издание посвящено вопросам разработки текстовой технической документации на аппаратно-программные комплексы, автоматизированные системы и программные продукты, к которым относится большая часть современного рынка высоких технологий. Приведены общие сведения о промышленной продукции и технической документации, основные понятия о государственной системе обеспечения единства измерений (ГСИ), единых системах конструкторской, программной и технологической документации (ЕСКД, ЕСПД и ЕСТД), комплексе стандартов на автоматизированные системы (КСАС). Рассмотрен жизненный цикл технической документации. Значительное место отведено вопросам разработки основных видов текстовой технической документации на аппаратно-программные комплексы и автоматизированные системы — технического задания, технических условий, программы и методики испытаний, а также эксплуатационной документации — руководства по эксплуатации, руководства пользователя, инструкции по эксплуатации, формуляра, паспорта, этикетки ведомости эксплуатационных документов. Изложены рекомендации по переводу, локализации, оформлению и приданию юридического статуса технической документации на продукцию зарубежных производителей. Рассмотрены основные программные инструменты, предназначенные для разработки текстовой технической документации. Книга рассчитана как на получение начального образования молодыми специалистами, так и на углубление знаний опытных разработчиков текстовой технической документации. Будет представлять интерес для переводчиков и редакторов переводов иноязычной технической документации. К изданию прилагается компакт-диск с дополнительными материалами, которые могут оказаться полезными при разработке текстовой документации. В состав этих материалов включены нормативные документы, на которые даны ссылки в пособии, методические рекомендации по разработке и оформлению технической документации, а также шаблоны основных текстовых конструкторских документов.&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href="http://www.piter.com/gif1.phtml?current=&amp;amp;barcode=978538800101"&gt;Содержание.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.piter.com/gif.phtml?current=&amp;amp;barcode=978538800101"&gt;Глава 9. Перевод, локализация, редактирование, придание юридического статуса и оформление переводов иностранной технической документации.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1613699" width="1" height="1"&gt;</description></item><item><title>Как включить SQL Server 2005 в кластер</title><link>http://msmvps.com/blogs/gladchenko/archive/2008/05/04/1613126.aspx</link><pubDate>Sun, 04 May 2008 08:08:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1613126</guid><dc:creator>gladchenko</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/gladchenko/rsscomments.aspx?PostID=1613126</wfw:commentRss><comments>http://msmvps.com/blogs/gladchenko/archive/2008/05/04/1613126.aspx#comments</comments><description>&lt;p&gt;По материалам статьи Рандай Диесс (Randy Dyess): &lt;a href="http://www.dell.com/downloads/global/solutions/public/white_papers/sql2005_clustering_wp.pdf"&gt;How to Guide: SQL Server 2005 Clustering&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Введение&lt;/h1&gt;
&lt;p&gt;Этот документ, опубликованный в журнале &amp;laquo;SQL Server Magazine&amp;raquo;, предназначен для технических специалистов, которые хотят разобраться с тем, как работает отказоустойчивый кластер, как SQL Server 2005 работает в кластере, как осуществляется установка и настройка SQL Server 2005 в отказоустойчивом кластере, какая практика считается лучшей для обеспечения работоспособности SQL Server 2005 в кластере.&lt;br /&gt;Давно уже наметился переход от использования SQL Server 2005 для небольших решений к решениям корпоративного масштаба, критичным для бизнеса, а также возросла необходимость обеспечения высокой доступности обслуживаемых СУБД данных. В SQL Server 2005 встроены несколько механизмов, позволяющих обеспечить высокую доступность, но ни одно из стандартных средств и распространённых методов не позволяют обеспечить такой уровень доступности данных, который часто называемый &amp;laquo;missioncritical&amp;raquo;. Это достигается только включением SQL Server 2005 в кластер.&lt;/p&gt;
&lt;h1&gt;Основы кластеризации SQL Server: Что это такое?&lt;/h1&gt;
&lt;p&gt;Отказоустойчивые кластеры (Failover clusters) &amp;ndash; это решение для операционной системы Windows, которое позволяет администраторам создавать функциональные группы серверов, которые для приложений могут быть видимы, как суррогатные хосты, работающие на одном или более сервере, и в случае отказа этого сервера работа переносится на другой сервер группы, согласованно с прикладным уровнем. Проще говоря, кластеры обеспечивают высокую доступность приложений, работающих на серверах. Эта высокая доступность не гарантирует безостановочность работы, потому что существует некоторое время простоя, вызванное отработкой отказа; кроме того, после отказа не гарантируется тот же самый уровень работоспособности, как в штатном режиме. Включение в кластер гарантирует, что приложения кластера будут им контролироваться, и, в случае разного рода отказов, работоспособность таких приложений будет автоматически восстановлена, а они, вместе со своими ресурсами, будут запущены на другом сервере.&lt;/p&gt;
&lt;p&gt;Существует несколько типов ресурсов и компонентов, с которыми администратору нужно познакомиться до того, как приступить к планированию решения на основе кластера. Эти ресурсы и компоненты являются основой кластерной среды и представляют собой процессы, необходимые программному обеспечению кластера, ресурсы для хранения прикладного кода и службы, используемые программным обеспечением кластера для управления составляющими кластер элементами.&lt;/p&gt;
&lt;p&gt;Существует несколько типов ресурсов, используемых службой кластера Windows, но наиболее проблематичным из них для администраторов, устанавливающих SQL Server 2005, является группа дисковых ресурсов. Эта группа ресурсов (Рисунок 1) представляет собой один или несколько дисков, которые сгруппированы в один функциональный модуль. Группу дисковых ресурсов рассматривают, как модуль отказа кластера, и наличие такой группы ресурсов необходимо для каждого экземпляра SQL Server 2005, работающего в одном кластере.&lt;/p&gt;
&lt;p&gt;Каждая группа ресурсов одновременно может принадлежать только одному узлу кластера, и именно перемещение группы для монопольного использования на другой узел называется отработкой отказа (failover). Когда мы имеем дело с работающим в кластере SQL Server 2005, мы говорим о группе ресурсов, которая представляет собой цельный модуль отказа. Поскольку группа ресурсов определяет модуль отказа, каждый индивидуальный экземпляр SQL Server 2005 должен иметь свою собственную группу ресурсов. Можно использовать и несколько групп ресурсов для одной инсталляции, но в таком случае нужно установить зависимости ресурсов в разных группах, так чтобы все такие группы вели себя как единый модуль отказа.&lt;/p&gt;
&lt;p&gt;Связанные с дисковой группой ресурсы образуют зависимости, вовлеченные в отработку отказа в кластере. Такие зависимости включают и сетевые имена, и IP &amp;ndash; адреса каждого из ресурсов, и будут отрабатывать отказ вместе с дисковой группой ресурсов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Примечание: Экземпляры, которые размещают базы данных или файлы баз данных на нескольких дисковых массивах (для балансировки ввода-вывода между несколькими массивам), могут связать эти массивы с помощью зависимостей ресурсов. Зависимости ресурсов позволяют нескольким группам ресурсов выступать как единый модуль отказа, и они переносятся на другой узел вместе.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Примечание: есть специальная группа ресурсов, которая принадлежит всем узлам кластера. Эта специальная группа ресурсов называется Кворум - диском, и содержит базу данных, которая используется кластером в качестве контейнера для имён участвующих в кластере узлов, а так же для информации о состоянии каждого из узлов кластера.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msmvps.com/blogs/gladchenko/gladchenko/clu1.gif" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Какие встречаются типы кластеров?&lt;/h2&gt;
&lt;p&gt;Служба кластера Windows предлагает несколько различных типов и режимов работы кластера: кластер с одним узлом, несколько узлов в кластере, мажоритарная группа узлов (Majority NodeSet) кластера и кластер с географически разнесёнными узлами. Каждый из этих типов кластера имеет своё предназначение, а большинство кластеров, используемых для обеспечения высокой доступности SQL Server 2005, имеют один или несколько узлов, поэтому, этот документ посвящён соответствующим двум типам кластера. Для получения информации о других типах кластера обратитесь к справочной документации по Windows Server 2003.&lt;/p&gt;
&lt;h3&gt;Кластер одного узла&lt;/h3&gt;
&lt;p&gt;Кластер из одного узла (Рисунок 2) &amp;ndash; это такая кластерная конфигурация, в которой активен только один сервер, а ещё один или несколько серверов &amp;quot;не активны&amp;quot;. Неактивный сервер &amp;ndash; это такой сервер, на котором нет активных (выполняющихся) приложений, но операционная система запущена. Неактивный сервер &amp;quot;поджидает&amp;quot;, когда активный сервер попадёт в такое состояние, которое обычно вызвано выходом оборудования или программного обеспечения из строя, и начинает сам обслуживать приложение, которое в обычных условиях обслуживается активным сервером. В случае обнаружения состояния отказа, неактивный сервер становится активным сервером, и все необходимые приложениям ресурсы передаются для монопольного управления новому активному серверу, в то время как все подключения, которые существовали на старом активном сервере, повторно переустанавливаются с новым активным сервером.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msmvps.com/blogs/gladchenko/gladchenko/clu2.gif" alt="" /&gt;&lt;/p&gt;
&lt;h3&gt;Кластер нескольких узлов&lt;/h3&gt;
&lt;p&gt;Такой кластер может включать от двух до восьми активных серверов (Рисунок 3), которые работают в одной кластерной группе. Все эти активные серверы обслуживают свои приложения и каждый занят своей работой. Каждый активный сервер может быть настроен хостом приложений для одного или нескольких других активных серверов, в случае их отказа, или каждый активный сервер можно настроить так, чтобы он использовал один активный или неактивный сервер в качестве хоста приложений, если произойдёт отказ (Рисунок 4).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msmvps.com/blogs/gladchenko/gladchenko/clu3.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Кластеры из нескольких узлов позволяют администраторам использовать все или только часть ресурсов каждого сервера в группе кластера. Работая с таким кластером нужно быть предельно осторожным, поскольку работа серверов строится так, что сервер может не только быть запасным хостом для другого сервера, но он также должен обслуживать и свои собственные приложения.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msmvps.com/blogs/gladchenko/gladchenko/clu4.gif" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Три наиболее значимые проблемы кластеров&lt;/h2&gt;
&lt;p&gt;При выборе типа кластера для ваших приложений баз данных SQL Server 2005, особое внимание стоит обратить на использование ресурсов каждого отдельного узла кластера. Утилизации ресурсов СУБД нужно уделить особое внимание, а если на сервере несколько кластерных систем, то в случае отказа в модели кластера с несколькими узлами при распределении и использовании ресурсов нужно быть особенно осторожным.&lt;/p&gt;
&lt;h3&gt;Процессор&lt;/h3&gt;
&lt;p&gt;Планирование использования процессорных ресурсов - одно из трех основных направлений при создании кластера. Используемая в не кластерных системах практика выбора такой процессорной конфигурации, чтобы процессоры использовались на 60 - 80 процентов все еще приемлема, но эта норма использования теперь должна учитывать и случаи отказа.&lt;/p&gt;
&lt;p&gt;Это означает, что если оставить каждому узлу нагрузку процессоров в 60 &amp;ndash; 80 процентов, они не смогут обслужить рабочую нагрузку после отработки отказа и перемещения к ним отказавшего экземпляра. Что нужно предпринять? Чтобы правильно оценить величину нагрузки на процессоре после добавление ресурсов с отказавшего узла, нужно обеспечить такой резерв, чтобы суммарная утилизация процессоров вместе с ресурсами отказавшего узла, в самом плохом варианте развития событий, никогда не превышала 80 процентов утилизации процессоров, даже если нормальная утилизация на сервере держится ниже 40 процентов. Это позволит учесть практически все возможные последствия отказов.&lt;/p&gt;
&lt;h3&gt;Память&lt;/h3&gt;
&lt;p&gt;В кластере, как и в случае с процессорными ресурсами, для обеспечения его работы в случае отказа очень важно грамотное планирование ресурсов памяти. Администратор должен чётко понимать как память узла будет использоваться приложениями в случае отработки отказа. Интенсивно использующие память прикладные программы, такие как SQL Server 2005, при отказе используют столько памяти, сколько смогут получить, и потому после перемещения отказавший экземпляр SQL Server 2005 будет запущен и начнёт работу с таким количеством памяти, который ему достанется от других экземпляров. Если памяти мало, могут возникнуть проблемы с производительностью приложений.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Примечание: Одним из новшеств SQL Server 2005 является то, что начиная с этой версии появилась возможность использования динамической памяти в кластерной конфигурации.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;При настройке SQL Server 2005 в кластере с несколькими узлами, администраторам базы данных советуют установить значение параметра глобальной конфигурации сервера &amp;laquo;max server memory&amp;raquo; таким, чтобы оставался запас для сервера, который будет запущен на этом узле в случае отказа его оборудования. Также рекомендуется задать значение для &amp;laquo;min server memory&amp;raquo;, чтобы не позволить экземпляру с отказавшего узла захватить всю доступную память и, тем самым, повлиять на производительность уже работающих на узле приложений.&lt;/p&gt;
&lt;h3&gt;Диски&lt;/h3&gt;
&lt;p&gt;Часто, при создании кластеров нескольких узлов, администраторы сталкиваются с проблемой недостатка букв алфавита для дисковых устройств. В операционной системе Windows группам ресурсов дают разные имена дисков на разных узлах кластера. Поскольку число групп ресурсов увеличивается вместе с увеличением числа установленных экземпляров SQL Server 2005 или из-за применения дизайна с использованием для базы данных нескольких файловых групп, при увеличения числа узлов в кластере, ограничение в 26 буквенных имен дисков может стать проблемой. Администратор баз данных совместно с системным администратором, который часто устанавливает Windows - кластер до установки туда SQL Server 2005, должны убедиться, что буквенных имен дисков достаточно много, они доступны и размеры этих дисков достаточно велики, чтобы вместить файлы баз данных.&lt;/p&gt;
&lt;h2&gt;Почему нужен кластер?&lt;/h2&gt;
&lt;p&gt;Основная цель использования кластера &amp;ndash; обеспечение высокой доступности базы данных. Сегодня для приложений всё чаще выдвигаются такие бизнес &amp;ndash; требования, чтобы был обеспечен доступ к данным в режиме 24/7, и недоступность базы данных из-за выхода из строя оборудования или из-за необходимости выполнения операций по обслуживанию сервера часто просто недопустима. Использование кластера серверов баз данных может помочь предотвратить недоступность данных из-за выхода из строя сервера, вызванного сбоем в программном обеспечении, необходимостью выполнения операций по обслуживанию сервера или из-за потери сетевого соединения с сервером.&lt;/p&gt;
&lt;p&gt;Однако кластер не гарантирует, что никогда не произойдёт отказ сервера, он помогает уменьшать число выходов из строя и предоставляет администраторам базы данных и сервера возможности вывести сервер из состояния отказа без потерь.&lt;/p&gt;
&lt;h2&gt;Выгоды от кластера - Top 3&lt;/h2&gt;
&lt;p&gt;Кластер даёт довольно много преимуществ администраторам сервера и баз данных, но главными преимуществами, часто цитируемыми в контексте использования кластера серверов с SQL Server 2005, являются возможность без остановки приложений инсталлировать сервисные пакеты SQL Server 2005 или Windows, а также защита от сбоев операционной системы.&lt;/p&gt;
&lt;h3&gt;Сервисные пакеты SQL Server 2005&lt;/h3&gt;
&lt;p&gt;Несмотря на то, что команда разработки и поддержки SQL Server 2005 прилагает максимум усилий к тому, чтобы при установке сервисных пакетов не возникало простоя в работе приложений, все вышедшие на момент написания этой статьи сервисные пакеты к SQL Server 2005 требуют, чтобы администратор баз данных запланировал перезапуск обновляемых служб SQL Server 2005. При использовании кластера администраторы могут установить сервисный пакет практически без простоя приложений, инициируя отказ узла, вследствие которого база данных будет обслуживаться другим узлом, что позволит заняться установкой сервисного пакета на первом узле. В это время база данных будет доступна на втором узле, а экземпляр на первом узле может быть недоступен на время перезагрузок или иных действий. &lt;/p&gt;
&lt;h3&gt;Сервисные пакеты Windows&lt;/h3&gt;
&lt;p&gt;Как и при установке сервисных пакетов SQL Server 2005, сервисные пакеты операционной системы Windows становятся причиной простоя приложений, который может возникнуть во время установки и перезагрузки сервера после инсталляции такого пакета. Возможность инициации отказа базы данных, который переместит её ресурсы на другой узел, позволяет избежать простоя в работе с базой данных, пока операционная система Windows будет обслуживаться администратором.&lt;/p&gt;
&lt;h3&gt;Сбои Windows&lt;/h3&gt;
&lt;p&gt;Главным преимуществом от установки ваших серверов баз данных в кластер является исключение длительного простоя в работе приложений, вызванного всевозможными не фатальными отказами аппаратных средств, которые весьма вероятны для современных серверов, сложность которых постоянно растёт. Часто совсем маленькая проблема в состоянии вывести операционную систему из строя на длительный срок, причём, подобные отказы не нуждаются в тщательном расследовании или переустановке компонент или даже всего сервера, но они бывают достаточно серьезны, чтобы приложение оказалось неработоспособным на недопустимое время. Кластер может помочь в предотвращении многих подобных проблем в работе приложений, поскольку ресурсы приложения могут быть быстро переброшены на другой узел кластера, и часто сделать это можно даже без потери клиентских подключений.&lt;/p&gt;
&lt;h2&gt;Как устроен кластер?&lt;/h2&gt;
&lt;p&gt;Для связи между узлами кластер использует локальную сеть, и по ней же посылаются сигналы &amp;laquo;жизни&amp;raquo; от сервера к серверу. Такие сигналы нужны для проверки работоспособности узлов и способности их к обслуживанию приложений на уровне операционной системы и на прикладном уровне (SQL Server 2005). На уровне операционной системы этот сигнал служит для постоянного поддержания связи между узлами кластера и проверки правильности их работы.&lt;/p&gt;
&lt;p&gt;После установки SQL Server 2005 в кластере, входящий в комплект программного обеспечения кластера Service Control Manager начинает посылать каждые пять секунд сигнал каждому активному экземпляру SQL Server 2005 (Рисунок 5). Этот сигнал, называемый &amp;quot;LooksAlive&amp;quot;, практически не требует ресурсов для обработки и не выполняет других действий кроме проверки существования и работоспособности экземпляров SQL Server 2005. В задачу обмена сигналами жизни не входит проверка того, может ли экземпляр исполнять какие &amp;ndash; либо более сложные операции. Для определения фактической работоспособности экземпляра SQL Server 2005 и его способности исполнять операции, каждые 60 секунд выполняется более глубокая проверка &amp;ldquo;IsAlive&amp;rdquo;, которая включает в себя запрос SELECT @SERVERNAME, и проверку возвращаемого значения. Если ответа нет, проверка IsAlive повторяется еще пять раз, прежде чем кластер попытается запустить ресурс на другом узле.&lt;/p&gt;
&lt;p&gt;При отработке состояния отказа, кластер передаёт все необходимые ресурсы в монопольное владение другому экземпляру SQL Server 2005. Каждому экземпляру SQL Server 2005 принадлежит собственный набор дисков, называемый группой ресурсов (resource group), и именно эта группа ресурсов передаётся в монопольное владение другому узлу. После того, как группа ресурсов будет передана, экземпляр SQL Server 2005 инициирует процедуру стартовой регенерации (recovery), после исполнения recovery для системных баз данных, SQL Server 2005 переходит в состояние готовности к работе и обслуживанию запросов пользователей. Служба сервера баз данных должна быть запущена, а это значит, что должна быть доступна и база данных master. После обеспечения доступности базы данных master, служба сервера баз данных начинает запуск и регенерацию пользовательских баз данных.&lt;/p&gt;
&lt;p&gt;Клиентские приложения должны будут выполнить повторное подключение, взяв за основу нового подключение конфигурацию приложения. Когда приложение соединяется с экземпляром SQL Server 2005, они используют виртуальный, а не физический IP - адрес. Фактическая принадлежность виртуального IP - адреса управляется кластером, так что приложения никогда не будут знать, на каком узле фактически находится адресуемый экземпляр. Чтобы подключится к службе SQL Server 2005 можно использовать её физический IP - адрес, но если так сделать, к ней невозможно будет подключиться в случае аппаратного отказа, т.е. если узел, являющийся основным для службы SQL Server 2005, откажет по какой &amp;ndash; либо причине.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://msmvps.com/blogs/gladchenko/gladchenko/clu5.gif" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Как установить SQL Server 2005 в кластере&lt;/h2&gt;
&lt;p&gt;При установке SQL Server 2005 без кластера всё происходит просто и понятно, а установка SQL Server 2005 в кластер добавляет только несколько специфических шагов. Поддержка отказоустойчивого кластера осуществляется в SQL Server 2005 Enterprise Edition (поддержка до 8 узлов кластера), Developer Edition (поддержка до 8 узлов кластера) или Standard Edition (поддержка до 2 узлов кластера), а также необходима поддержка кластеризации операционной системой Windows, это следующие редакции: Windows Server 2003 Enterprise Edition, Windows 2003 Datacenter Edition, Windows 2000 Advanced Server или Windows 2000 Datacenter Edition.&lt;/p&gt;
&lt;p&gt;Администратор, устанавливающий SQL Server 2005 в кластер, должен координировать свою работу с администраторами сервера, чтобы задать правильные номера групп ресурсов, имена дисков, размеры дисков и IP - адреса, необходимые для подключения к экземпляру SQL Server 2005. Администратор баз данных должен определиться с набором компонент, которые он должен будет установить, и понять, как эти компоненты поведут себя в кластере.&lt;/p&gt;
&lt;h3&gt;Установка ядра базы данных&lt;/h3&gt;
&lt;p&gt;Администраторам баз данных, которые только готовятся приступить к установке SQL Server 2005 в отказоустойчивом кластере, будет приятно узнать, что программа установки SQL Server 2005 умеет определять наличие кластера и автоматически устанавливать экземпляр SQL Server 2005 на обоих узлах кластера и правильно всё для этого настраивать.&lt;/p&gt;
&lt;p&gt;При установке кластера с несколькими узлами, необходимо установить активный экземпляр на первый узел, а затем активные экземпляры на других узлах.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Примечание: допускается существование в кластере только одного экземпляра по умолчанию, это означает, что в кластере вы должны устанавливать именованные экземпляры на всех узлах, кроме одного.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Примечание: Пожалуйста, перед установкой экземпляра ядра баз данных SQL Server 2005 в кластер, изучите следующую статью SQL Server 2005 Books Online: &amp;laquo;&lt;a href="http://msdn2.microsoft.com/ru-ru/library/ms179530.aspx"&gt;Как создать новый отказоустойчивый кластер SQL Server 2005 (программа установки)&lt;/a&gt;&amp;raquo;.&lt;/b&gt;&lt;/p&gt;
&lt;h3&gt;Установка Analysis Services&lt;/h3&gt;
&lt;p&gt;Как и с ядром баз данных, мастер установки SQL Server 2005 устанавливает экземпляр Analysis Services на обоих узлах кластера. Пожалуйста, предварительно ознакомьтесь с материалами, опубликованными в статье SQL Server 2005 Books Online: &amp;laquo;&lt;a href="http://msdn2.microsoft.com/ru-ru/library/ms143511.aspx"&gt;Как установить службы Analysis Services на отказоустойчивом кластере&lt;/a&gt;&amp;raquo;.&lt;/p&gt;
&lt;h3&gt;Установка Reporting Services&lt;/h3&gt;
&lt;p&gt;К сожалению, Reporting Services не поддерживается кластером и его нужно устанавливать как автономный компонент на всех узлах. Reporting Services сможет использовать базы данных кластера, но когда случится отказ узла, к которому подключается служба Reporting Services, экземпляры отказавшего узла не будут автоматически переподключаться. Для восстановления подключения нужно соединяться с новым узлом, используя новый IP - адрес.&lt;/p&gt;
&lt;h3&gt;Установка SQL Server Integration Services&lt;/h3&gt;
&lt;p&gt;Чтобы установить SSIS, нужно установить SSIS на всех активных узлах, а затем сделать службу SSIS кластерным ресурсом. Чтобы сделать SSIS кластерным ресурсом, нужно выполнить несколько шагов:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Открыть Cluster Administrator.&lt;/li&gt;
&lt;li&gt;В меню File выбрать пункт New, а затем щелкнуть по Resource&lt;/li&gt;
&lt;li&gt;На странице New Resource мастера ресурсов (Resource Wizard), введите имя нового ресурса и выберите в качестве типа службы &amp;ldquo;Generic Service&amp;rdquo;. Измените группу на группу SQL Server. Нажмите Next.&lt;/li&gt;
&lt;li&gt;На странице Possible Owners, добавьте или удалите узлы кластера, которые возможно будут владельцами нового ресурса. Нажмите Next.&lt;/li&gt;
&lt;li&gt;Добавить зависимость можно на странице Dependencies, выбрав из списка Available resources новый ресурс, а затем нажав кнопку Add. В случае отказа, SQL Server 2005 и общий диск, на котором хранятся пакеты SSIS, должны стать доступны до того, как станет активен SSIS. После настройки зависимостей, нажмите кнопку Next.&lt;/li&gt;
&lt;li&gt;На странице Generic Service Parameters, введите в качестве имени службы MsDtsServer, и нажмите кнопку Next.&lt;/li&gt;
&lt;li&gt;На странице Registry Replication нажмите Add, чтобы добавить ключ реестра, который идентифицирует файл конфигурации SSIS.&lt;ol&gt;
&lt;li&gt;Этот файл должен быть расположен на общем диске, который принадлежит той же группе, что и SSIS, и при отказе будет перенесён на тот же узел, что и SSIS.&lt;/li&gt;
&lt;li&gt;В диалоговом окне Registry Key, введите SOFTWARE\Microsoft\MSDTS\ServiceConfigFile. Нажмите OK, а затем нажмите кнопку Finish. Служба SSIS должна добавиться под управление кластера.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;Найдите файл конфигурации по пути %ProgramFiles%\Microsoft SQL Server 2005\90\DTS\Binn\MsDtsSrvr.ini.xml, и скопируйте его на общий диск.&lt;/li&gt;
&lt;li&gt;На общем диске создайте новую папку с именем Packages и дайте на неё права List Folders и Write встроенной группе Users.&lt;/li&gt;
&lt;li&gt;Откройте в текстовом или XML - редакторе файл конфигурации на общем диске и замените значение элемента ServerName на имя виртуального SQL Server 2005, который находится в этой же группе.&lt;/li&gt;
&lt;li&gt;Замените значение элемента StorePath на полностью-квалифицированный путь к созданной ранее папке Packages на общем диске.&lt;/li&gt;
&lt;li&gt;Откорректируйте значение ключа системного реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTS\ServiceConfigFile, записав там полностью квалифицированное имя и путь к файлу конфигурации сервиса на общем диске.&lt;/li&gt;
&lt;li&gt;В приложении Cluster Administrator, выберите службу SSIS, нажмите не ней правую кнопку мыши, и выберите в выпадающем меню пункт Bring Online. Служба SSIS должна стать активной, как и служба кластера.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Установка инструментария и электронной документации&lt;/h3&gt;
&lt;p&gt;Программа установки SQL Server 2005 не устанавливает компоненты инструментов и документацию по SQL Server 2005 на все узлы кластера. Мастер устанавливает эти компоненты только на том узле, на котором была инициализирована подпрограмма установки. Если инструменты и документация нужны и на других узлах, там их нужно установить вручную после успешного окончания установки SQL Server в кластере.&lt;/p&gt;
&lt;h3&gt;Установка MSDTC&lt;/h3&gt;
&lt;p&gt;Microsoft Distributed Transaction Coordinator часто используется SQL Server 2005 для задач поддержки распределенных транзакций. Администраторы баз данных и системные администраторы должны чётко понимать, что MSDTC не будет установлен на кластере без исполнения нескольких дополнительных шагов, которые они должны правильно выполнить. В случае с кластерами серверов Windows 2003, MSDTC может быть установлен на всех серверах кластера. В прежних версиях операционных систем, MSDTC нужно было устанавливать на каждом сервере отдельно. Windows 2003 предоставляет два варианта установки MSDTC: использование для установки MSDTC в кластере программы Cluster Administrator или программы Cluster.exe, с помощью которой тоже можно установить MSDTC в кластере.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Обратите внимание:&lt;/b&gt; перед началом установки MSDTC в кластере Windows 2000 или Windows 2003, ознакомьтесь со следующими статьями Microsoft:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/301600"&gt;How to configure Microsoft Distributed Transaction Coordinator on a Windows Server 2003 cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/q290624/"&gt;How to configure MSDTC in a Windows 2000 cluster environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/prodtechnol/biztalk/2006/library/bts06clustering/55b0c81f-44a5-4069-b065-57df1cce19ac.mspx?mfr=true"&gt;How to Cluster MSDTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/ru-ru/library/ms175501.aspx"&gt;Как установить координатор распределенных транзакций (Майкрософт)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Хорошая практика&lt;/h2&gt;
&lt;h3&gt;Операционная система Windows Server 2003&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Лучше потратьте больше времени на разработку и планирование кластера, чем на само создание кластера.&lt;/li&gt;
&lt;li&gt;Все аппаратные средства, используемые в кластере, должен входить в лист совместимости (HCL) кластера Windows 2003, причём, в качестве модулей, а не только в качестве самостоятельных частей.&lt;/li&gt;
&lt;li&gt;Каждый узел кластера должен использовать одинаковые аппаратные средства.&lt;/li&gt;
&lt;li&gt;При создании кластера более двух узлов, Вы должны предусмотреть один пассивный узел и настроить его в качестве первичного узла при отказе.&lt;/li&gt;
&lt;li&gt;Придумайте все виртуальные имена и зарезервируйте IP-адреса ещё на стадии планирования.&lt;/li&gt;
&lt;li&gt;Убедитесь, что дискового пространства будет достаточно, и букв дисков хватит для обозначений дисков в кластере во время процесса его настройки.&lt;/li&gt;
&lt;li&gt;Используйте стандартные имена для локальных дисков и дисков кворума на всех узлах кластера.&lt;/li&gt;
&lt;li&gt;Рекомендуется использовать для кластера две независимые (виртуальные или физические) сети. Одна публичная сеть, и одна частная сеть кластера. Убедитесь, что используются разные сетевые платы для публичной и частной сети, и не используются для этого сетевые платы с несколькими разъёмами.&lt;/li&gt;
&lt;li&gt;Используйте статические IP-адреса для публичной и частной сети, для частной сети используйте подсети класса A, B или C.&lt;/li&gt;
&lt;li&gt;Перед установкой кластера убедитесь, что дисковый массив кластера настроен правильно, работоспособен, и доступен всем узлам.&lt;/li&gt;
&lt;li&gt;Убедитесь, что диск кворума защищён от отказа.&lt;/li&gt;
&lt;li&gt;Придумайте виртуальному серверу уникальное имя не более 15 символов.&lt;/li&gt;
&lt;li&gt;Убедитесь, что запрещён автоматический возврат после сбоя (fail-back), это позволит предотвратить эффект &amp;quot;пинг-понга&amp;quot;, когда один узел постоянно отказывает и снова возвращается в строй.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SQL Server 2005&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft рекомендует устанавливать Analysis Services в кластере в отдельную группу, со своими ресурсами дисков и IP, а не в группу ресурсов, которые используются ядром баз данных.&lt;/li&gt;
&lt;li&gt;SQL Server 2005 Enterprise Edition поддерживает установку 25 экземпляров на узле кластера, а Standard Edition поддерживает только 16 экземпляров. Нужно помнить, что каждый экземпляр должен иметь собственную группу ресурсов, и для кластеризации большого числа экземпляров нужно использовать модель мажоритарного кворума узлов (Majority Node Set). Обычно, не считается хорошей практикой устанавливать много экземпляров на одном узле, это мешает обеспечивать производительность и масштабируемость. &lt;/li&gt;
&lt;li&gt;Для работы SQL Server 2005 требуется установка .NET Framework на всех узлах кластера, и программа инсталляции в состоянии установить .NET Framework на всех узлах. Распространённой рекомендацией является установка .NET Framework на всех узлах до запуска программы установки сервера баз данных, это позволяет ускорить процесс установки.&lt;/li&gt;
&lt;li&gt;Обычно рекомендуется при создании кластера создавать четыре разных доменных группы. По одной для каждой службы: SQL Server 2005, SQL Server 2005 Agent, Full-Text Search и Analysis Services.&lt;/li&gt;
&lt;li&gt;На узлы кластера с SQL Server 2005 нежелательно устанавливать другие приложения.&lt;/li&gt;
&lt;li&gt;Поскольку в кластере допустимо иметь только один экземпляр по умолчанию, лучше использовать простые имена экземпляров, кроме того, это поможет стандартизировать процесс именования.&lt;/li&gt;
&lt;li&gt;Не удаляйте и не переименовывайте используемую по умолчанию группу кластера, и не удаляйте ресурсы из группы, а также не удаляйте для переименования к