Использование PowerShell для администрирования Microsoft SQL Server

В одном посте невозможно описать все возможности, появившиеся после введения поддержки Window Powershell в Microsoft SQL Server, однако этим постом я постараюсь показать хотя бы часть этих возможностей. В состав SQL Server, начиная с версии SQL Server 2008, входят две оснастки:
  1. Поставщик (Provider) SQL Server, предоставляющий простой механизм навигации – «внутри» SQL Server, можно использовать команды dir, ls, cd, Set-Location, Get-Location и т.д.;
  2. Набор командлетов для указания действий SQL Server (например, выполнение скрипта sqlcmd).

Таким образом, сейчас, вы можете без применения стороннего ПО получать в своих скриптах на PowerShell всю необходимую информацию с SQL Server.

Чем это может быть полезно для администратора?


Итак, если у вас уже установлены клиентские утилиты (SQL Server Management Studio), то в вашей системе уже есть перечисленные выше оснастки и дополнительных действий не требуется. Если нет – вы можете скачать Management Studio бесплатно здесь.
После установки Management Studio и подключения к интересующему вас экземпляру SQL Server, можно запустить утилиту sqlps прямо оттуда:

Если в появившемся окне sqlps набрать команду `dir`, можно увидеть любопытную картину (обратите внимание на объекты в ObjectExplorer в SSMS и результатом команды `dir`):

Вместо использования sqlps, можно просто добавить новые оснастки так:
add-pssnapin SqlServerCmdletSnapin100;
add-pssnapin SqlServerProviderSnapin100;

Убедиться, что они установлены, можно ознакомившись с помощью командлета get-pssnapin –registered.
Итак, после добавления этих оснасток можно посмотреть вывод командлета Get-Psdrive:
image
Выполнив cd SQLServer:\SQL\ServerName\InstanceName\, мы добьемся того же результата, что и запуская sqlps из SSMS.
Теперь немного о самой большой, «вкусности». Командлеты. Всего нам доступно пять командлетов:
  1. Invoke-Sqlcmd – практически то же самое, что утилита sqlcmd, c помощью этого командлета можно выполнять SQL-запросы на нужном SQLServer.
  2. Invoke-PolicyEvaluation – проверяет соответствует ли целевой набор объектов SQL Server условиям, определенным в схемах управления на основе политик.
  3. Encode-Sqlname – кодировка идентификаторов SQL Server. В SQL Server вы можете присвоить идентификатору в квадратных скобках практически любое значение, что может создать трудности при обращении к нему с помощью PowerShell. Для этого используется командлет Encode-Sqlname, превращающий «My:long_and|complexity|identy» в «My%3Along_and%7Ccomplexity%7Cidenty»
  4. Decode-Sqlname – совершает обратное преобразование
  5. Convert-UrnToPath – преобразует URN-строки, используемые моделью объектов SMO, в «читабельные» пути.

Самым важным, для меня, является командлет Invoke-Sqlcmd позволяющий выполнять произвольный SQL-запрос на сервере.
Представим ситуацию, что вам нужно собрать информацию по используемой памяти на десятке экземпляров, установленных на некотором количестве физических серверов в вашей сети. Чтобы добиться этого, можно использовать сторонние утилиты, позволяющие выполнять запрос на некотором количестве экземпляров, можно использовать ту же sqlcmd, вручную указывая с каких серверов требуется получить данные. С помощью PowerShell эту задачу можно решить проще и элегантнее. Следующий скрипт, например, выведет вам информацию о настройке ‘Max Server Memory (MB)’, на всех экземплярах зарегистрированных на вашем компьютере:

$ServerList = dir -recurse SQLSERVER:\SQLRegistration\'Database Engine Server Group'\ | where {$_.Mode -ne "d"}
foreach ($RegisteredSQLs in $ServerList)
{
$dt = invoke-sqlcmd -ServerInstance $RegisteredSQLs.ServerName -database master -Query "SELECT SERVERPROPERTY('servername'), SERVERPROPERTY ('instancename'), value FROM sys.configurations
WHERE name = 'Max Server Memory (MB)'";
echo $dt >> C:\tmp\memory.txt;
}


Обратите внимание, что в данном случае, для аккаунта под которым запускается этот скрипт должен быть создан login на SQL Server'e и ему должно хватать прав на выполнение запроса к sys.configurations. Если вы используете SQL-логины, нужно указать имя пользователя и пароль в параметрах командлета Invoke-Sqlcmd.

А теперь представьте, что вам надо абсолютно одинаково настроить семь серверов, или добавить на них один и тот же логин, или сделать бэкапы всех баз на сервере… Надеюсь, у меня получилось показать, что использование PowerShell, совместно с SQL Server, позволяет значительно облегчить жизнь администратора баз данных.

Ссылки:
  1. Общие сведения о SQL Server PowerShell, Books Online — msdn.microsoft.com/ru-ru/library/cc281954.aspx
  2. Использование командлета Invoke-Sqlcmd, Books Online — msdn.microsoft.com/ru-ru/library/cc281720.aspx
  3. SQL University — sqlchicken.com/sql-university
  • +23
  • 22,3k
  • 6
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 6

    0
    а как-нибудь имена серверов без SQLPS можно вывести?
      0
      Сорри, за долгое молчание, пропустил письмо с уведомлением о комменте.
      Да, конечно, все SQL Server'а в сети вы можете найти, запустив sqlcmd (или osql) с параметром -L. Работает, ЕМНИП, только в том случае, когда запущены службы SQL Server Browser на всех машинах с SQL Server.
      Плюс, хочу заметить, что в моем посте выводятся не все доступные SQL Server'а, а только те, которые зарегистрированы в SSMS на моей машине.
        0
        Как по мне, лучше пользоваться значениями реестра для вывода ВСЕХ инстансов SQL-я на локальной машине. И ничего нигде не надо регистрировать.
          0
          И где в вашем первом комментарии указание на то, что вам нужны все инстансы на локальной машине? Мой вам ответ про все видимые инстансы В СЕТИ.

          >>И ничего нигде не надо регистрировать.
          Я вас и не заставляю. Лично мне удобно иметь быстрый доступ к нужным мне серверам.
            0
            доступные — это и локальные в том числе
              0
              извините за неточность формулировок

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое