.
Хотя для изменения параметров запуска вы можете использовать SQL Server Configuration Manager, необходимо установить для запуска сессию удаленного рабочего стола на соответствующей удаленной системе. Этот процесс может занять много времени при работе с большим количеством разрозненных экземпляров SQL Server. К тому же, когда вы используете SQL Server Configuration Manager, приходится вручную вводить параметры запуска, что увеличивает риск возникновения ошибки.
Автоматизация задачи
Когда вы вводите параметр запуска с помощью SQL Server Configuration Manager, информация о параметре хранится в реестре как отдельная запись. Таким образом, я решил автоматизировать задачу добавления параметра запуска для флага трассировки 1222 (-T1222) путем непосредственного изменения реестра с помощью сценария T-SQL. Применяя сценарий в сочетании с Central Management Server (CMS), я мог бы внести изменения в реестр на 1000 экземплярах одним нажатием кнопки.
Я создал Automate_Changing_SQL_Startup_Parameters.sql (см. листинг), который имеет три секции. На экране 1 вы видите первую секцию. Выделенное значение @Parameters определяет параметр запуска, который будет добавлен, в нашем случае это -T1222.
Экран 1. Параметр запуска |
Под значением @Parameters обратите внимание на переменную @Argument_Number. В реестре каждое имя параметра начинается с SQLArg, а за ним следует номер, как показано на экране 2.
Экран 2. Параметры в реестре |
Имя первого параметра – SQLArg0, имя второго параметра – SQLArg1, и так далее. Переменная @Argument_Number используется в качестве счетчика номеров существующих определенных параметров запуска. По умолчанию каждый экземпляр SQL Server имеет три параметра:
- SQLArg0 идентифицирует файл данных основной базы данных;
- SQLArg1 идентифицирует папку Errorlog;
- SQLArg2 идентифицирует лог-файл основной базы данных.
Поэтому если не был определен никакой другой параметр запуска, значение @Argument_Number будет 3, и оно будет использоваться для следующего параметра запуска SQLArg3.
Вторая секция, показанная на экране 3, проверяет, существует ли уже заданный параметр запуска (в нашем случае, -T1222). Если он существует, сценарий удалит его. Это делается для того, чтобы не было перезапуска сценария. Кроме того, это защищает код от взлома.
Экран 3. Проверка наличия параметра |
Раздел реестра, который хранит информацию о параметрах запуска, может быть различным на разных экземплярах (то есть отличаться на экземплярах по умолчанию и имеющих имя). По этой причине сценарий использует sys.dm_server_registry динамические административные представления, или dynamic management view (DMV), чтобы получить правильный путь в реестре к параметрам запуска, как во второй, так и в последней секциях.
На экране 4 мы видим, что последняя секция использует xp_regwrite для добавления нового параметра запуска.
Экран 4. Добавление нового параметра запуска |
Хотя с помощью этих настроек мы добавляем к параметрам запуска флаг трассировки 1222, вы можете легко их адаптировать для добавления различных параметров запуска. Во всяком случае, вам необходимо знать следующее:
- Этот сценарий работает только на экземплярах SQL Server 2008 R2 SP2 или более поздних версий, поскольку sys.dm_server_registry DMV недоступен в более ранних версиях SQL Server.
- Для успешного запуска сценария SQL Server service account должен иметь полный доступ к реестру или быть членом группы Local Administrators.
Успешно протестировав сценарий на экземпляре SQL Server, попробуйте расширить его функциональность с помощью Central Management Server.
Листинг. Сценарий Automate_Changing_SQL_Startup_Parameters.sql
declare @Parameters varchar(max)='-T1222', @Argument_Number int, @Argument varchar(max), @Reg_Hive varchar(max), @CMD varchar(max) ---------------------------------------------------------------------------------------------------------{Parameter Cleanup} if exists (select * from sys.dm_server_registry where value_name like 'SQLArg%' and convert(varchar(max),value_data)=@Parameters) begin select @Argument=value_name,@Reg_Hive=substring(registry_key,len('HKLM\')+1,len(registry_key)) from sys.dm_server_registry where value_name like 'SQLArg%' and convert(varchar(max),value_data)=@Parameters set @CMD='master..xp_regdeletevalue ''HKEY_LOCAL_MACHINE'', '''+@Reg_Hive+''', '''+@Argument+'''' exec (@CMD) end ---------------------------------------------------------------------------------------------------------{Add Parameter} select @Reg_Hive=substring(registry_key,len('HKLM\')+1,len(registry_key)), @Argument_Number=max(convert(int,right(value_name,1)))+1 from sys.dm_server_registry where value_name like 'SQLArg%' group by substring(registry_key,len('HKLM\')+1,len(registry_key)) set @Argument= 'SQLArg'+convert(varchar(1),@Argument_Number) select @Argument,@Reg_Hive set @CMD='master..xp_regwrite ''HKEY_LOCAL_MACHINE'', '''+@Reg_Hive+''', '''+@Argument+''', ''REG_SZ'', '''+@Parameters+'''' exec (@CMD)