Благодаря опыту, приобретенному за время использования PowerShell для управления SQL Server с 2006 года (даты появления PowerShell), я неплохо освоил продукт и готов поделиться некоторыми секретами с начинающими. Надеюсь, пройдет совсем немного времени, и вы будете обращаться с PowerShell так же уверенно, как я.

Начать управлять SQL Server с помощью PowerShell несложно, но для этого необходимы несколько базовых блоков. В SQL Server 2008 (и SQL Server 2008 R2) компания Microsoft выпустила «мини-оболочку», именуемую SQLPS.exe, которая представляла собой PowerShell 1.0 с уже загруженными «оснастками» SQL Server. В июне 2008 года Мишель Уарис рассказал об этом в своем блоге под названием SQL Server Powershell is here! по адресу http://blogs.msdn.com/b/mwories/archive/2008/06/14/sql2008_5f00_powershell.aspx.

Там же приведен сценарий Initialize-SqlpsEnvironment.ps1, который загружает оснастки SQL Server в существующую среду PowerShell, предоставляя те же ресурсы, что и SQLPS.exe. Я пользуюсь этим сценарием по сей день. Просто воспользуйтесь Set-Location (cd), чтобы указать местонахождение сценария и выполните команду

. /Initialize-SqlpsEnvironment.ps1

После выпуска SQL Server 2008 R2 в 2009 году появился PowerShell 2.0 с новой концепцией модулей. Группа PowerShell объявила, что надстройки для среды сервера следует выпускать как модули, а не оснастки, и в следующем выпуске SQL Server 2012 произошла замена SQLPS.exe на модуль с именем SQLPS.

Этому модулю свойственны некоторые особенности, о которых следует помнить. Группа PowerShell представила список утвержденных глаголов для именования команд и функций (например, избегайте Kill, Stop и End в качестве псевдонимов), но не включила в него Backup и Restore. Конечно, эти глаголы важны для администраторов баз данных, поэтому группа SQL Server решила применять их в любом случае, поэтому при импорте модуля SQLPS выдается предупреждение об использовании неутвержденных глаголов. Этого предупреждения можно избежать, дополнив команду Import-Module параметром -DisableNameChecking.

Другая особенность заключается в том, что при загрузке модуля текущее местонахождение меняется на местонахождение поставщика SQL Server (SQLServer: диск). Чтобы обойти это неудобство, я протестировал и загрузил модуль SQLPS следующим образом:

# Проверить, загружен ли модуль SQLPS; если нет, то загрузить
if (-not(Get-Module -name 'SQLPS')) {
if (Get-Module -ListAvailable | Where-Object {$_.Name -eq 'SQLPS' }) {
Push-Location # При загрузке модуля SQLPS местонахождение меняется на поставщика, поэтому сохраните текущее местонахождение
Import-Module -Name 'SQLPS' -DisableNameChecking
Pop-Location # Возврат к первоначальному местонахождению
}
}

После того, как загружена среда SQL Server, вам предоставляется API-интерфейс управляющих объектов SQL Server (SMO), и можно воспользоваться доступной здесь подробной информацией. SMO появился в SQL Server 2005 и совместим со всеми версиями SQL Server начиная с SQL Server 2000.

Использование SMO для сбора информации о среде SQL Server

При знакомстве с новым клиентом я, как консультант, стараюсь собрать как можно больше информации о среде сервера. В SQL Server сделать это довольно просто с помощью SMO. Установив связь с экземпляром SQL Server через объект SMO Server, можно без труда увидеть свойства, выяснив версию и выпуск SQL Server, размер памяти и т.д. Рассмотрим это подробнее.

$svr = new-object ('Microsoft.SqlServer.Management.Smo.Server') localhost

В результате создается переменная, содержащая объект SMO Server, подключенный к экземпляру SQL Server, выполняемому на компьютере, на котором запущена команда. Можно выбрать любой экземпляр SQL Server, заменив 'localhost' на имя сервера/экземпляра, который нужно проанализировать. Кроме того, метод предполагает, что пользователь имеет права системного администратора на именованном экземпляре с тем именем, с которым он регистрировался в Windows. Поскольку мы занимаемся лишь изучением продукта, то применим этот метод.

PowerShell — язык на основе объектов

PowerShell не является языком, ориентированным на объекты, но это язык на основе объектов, поэтому все переменные представляют собой объекты, состоящие из свойств и методов. Свойства имеют значения, определяющие объект, в частности, его имя. Методы — действия, которые можно выполнить над объектом. Пока речь пойдет в основном о свойствах. Переменную можно всегда направить команде Get-Member, чтобы узнать тип объекта и все методы и свойства, связанные с ним.

$svr | Get-Member

Объект Server имеет несколько свойств с базовой полезной информацией. Если запустить в демонстрационной виртуальной машине команду

$svr | select Name, Edition, BuildNumber, Product, ProductLevel, Version, Processors, PhysicalMemory, DefaultFile, DefaultLog, MasterDBPath, MasterDBLogPath, BackupDirectory, ServiceAccount

то будет получен список, приведенный на экране.

 

Сбор базовых данных о сервере
Экран. Сбор базовых данных о сервере

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

Объект Server имеет несколько других объектов, в том числе объект JobServer, который определяет задания и расписания SQL Server Agent и Alerts, и коллекции объектов, такие как Logins и Databases.

Доступ к основной информации обо всех серверах позволяет выполнять инвентаризацию серверов и удобен для аудита лицензий, а собрать информацию не составляет большого труда.