Благодаря опыту, приобретенному за время использования 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.
Доступ к основной информации обо всех серверах позволяет выполнять инвентаризацию серверов и удобен для аудита лицензий, а собрать информацию не составляет большого труда.