Sébastien Pertus
Sql Server : Six façons d’administrer son serveur SQL Server
Comment administrer un serveur SQL SERVER en utilisant des scripts sql, la console de management SQL SERVER, le framework ADO.NET, le SDK SMO (Sql Management Objects), l’outil en ligne de commandes SQL CMD et enfin PowerShell.
Par Sébastien Pertus publié le 31/05/2009 à 22:28, lu 2561 fois, 7 pages
 6 | PowerShell
PowerShell s’adresse encore aux administrateurs systèmes et étend les possibilités de Scripting.
Microsoft PowerShell, anciennement nommée Microsoft Command Shell (nom de code MONAD) reste un utilitaire en ligne de commandes, mais contrairement à ce que nous connaissons, est basé sur une programmation orienté objet et bien sûr particulièrement efficace autour des collections d’objets .NET
Une fois installé, PowerShell peut être appelé directement depuis une fenêtre DOS ou tout simplement depuis le menu démarrer, ce qui vous lancera non pas une fenêtre DOS noir mais une fenêtre bleuté du plus bel effet 
PowerShell s’articule autour de commandes appelées CmdLets (pour command-applets)
Elles s’orthographient la plus part du temps sous la forme « Get-NOMCOMMANDE »
La plus importante restant la commande d’aide : Get-Help :
 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image13.png
 
Pour connaître l’ensemble des commandes dont vous disposez à l’aide de PowerShell, il suffit d’appeler la commande qui les liste : Get-Command :
 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image14.gif
 
Il existe des cmdlets spécialement dédiées à SQL SERVER 2008. Celles-ci sont installées lors du Setup d’installation de SQL SERVER 2008. De même un Provider dédié à Sql Server est présent et permet d’utiliser l’arborescence de SQL SERVER dans PowerShell comme un gestionnaire fichier !
Avec le provider et les commandes Sql Server, nous avons à disposition :
Le provider SqlServerProvider qui va nous permettre de naviguer dans notre serveur comme s’il s’agissait d’un répertoire, et accéder aux objets SMO associés au nœud courant.
Les commandes SqlServerCmdlet : Nous pourrions nous attendre à avoir une liste complète de commandes PowerShell dédiées à l’administration journalière d’un serveur SQL SERVER, ce qui n’est pour l’instant pas le cas. Les équipes Microsoft nous promettent pourtant que ces commandes seront fournies d’ici un futur proche. Il nous faudra donc pour l’instant passer outre et s’orienter vers deux solutions possibles :
  • Utiliser les assemblys .NET SMO
  • Utiliser la commande Invoke-SqlCmd qui nous permettra directement d’invoquer SqlCmd
Note : Le provider SqlServerProvider et l’ensemble des assemblies SMO ne sont pas chargées par défaut dans PowerShell.
Je vous conseille donc ce script à exécuter au lancement de PowerShell : http://blogs.msdn.com/mwories/archive/2008/06/14/SQL2008_5F00_Powershell.aspx
Avant de présenter les scripts complets de sauvegarde, nous allons effectuer un petit tour de présentation du Provider PowerShell SQL SERVER :
Comme nous l’avons présenté, nous sommes capables de naviguer dans notre serveur via de simples commandes de script comme s’il s’agissait d’un répertoire :
Connexion au serveur SQL nommé SQL2008 :

Set-Location SQLSERVER:\SQL\MIM\SQL2008

Nous sommes connectés à notre Serveur SQL SERVER.
Lister les bases de données devient aussi simple que lister un répertoire du système de fichier :

Cd DataBases

Dir

 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image15.png
 
Le provider SqlServerProvider qui nous permet de naviguer dans notre arborescence utilise derrière des objets .NET … SMO !
Si nous nous positionnons sur une base de données particulière via l’instruction « Cd PerfSamples » nous nous retrouvons à manipuler un objet SMO Database !
L’instruction Get-Member nous permet d’énumérer les membres de notre classe :
 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image16.png
 
Comme tout objet SMO Database nous avons, par exemple, la possibilité d’appeler directement la méthode énumérant la liste des backups :

$db = Get-Item .

$bTable = $db.EnumBackupSets()

 

 foreach ($bRow in $bTable.Rows){

    $bRow | Format-Table -Property Name, ID, ServerName, BackupStartDate

}

 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image17.png
 
Le code PowerShell pour effectuer un backup est très proche de celui utilisé en .NET
Normal nous utilisons les même objets SMO !
Vous trouverez même dans l’exemple une façon de récupérer les évènements levés par les objets .NET et afficher (dans notre cas) une barre de progression dans PowerShell. Un luxe !

cd SqlServer:\SQL\MIM\SQL2008\

 

$serv = Get-Item .

 

$backup = New-Object Microsoft.SqlServer.Management.Smo.Backup

$backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]0

$backup.BackupSetDescription = "Backup base de donnée"

$backup.Database = "PerfSamples"

$backup.Incremental = 0

 

 

$backupDate = [System.DateTime]::Now

$backupName = [System.String]::Format("PerfSamplesBackupPowerShell_{0}.bak", $backupDate.Ticks)

 

$backupDevice = New-Object -TypeName Microsoft.SqlServer.Management.Smo.BackupDeviceItem

$backupDevice.DeviceType = [Microsoft.SqlServer.Management.Smo.DeviceType]2

$backupDevice.Name = $backupName

 

$backup.Devices.Add($backupDevice)

 

$expDate = New-Object System.DateTime -ArgumentList 2010, 12, 31

$backup.ExpirationDate = $expDate

 

$backup.LogTruncation = [Microsoft.SqlServer.Management.Smo.BackupTruncateLogType]2

 

 

$backup.add_PercentComplete({

 

    Write-Progress  -activity "Backup in Progress" -status "% Complete:" -percentcomplete $_.Percent;

})

 

$backup.SqlBackup($serv)

 

Write-Host "Backup terminé"

L’exécution de ce script se déroule en 2 étapes :
  • Chargement des assemblies SQL SERVER SMO, du provider SqlServerProvider, et des cmdlets SqlServerCmdlets via le script « InitSqlServerForPowerShell.ps1 »
Lancement de notre script de backup préalablement enregistré sous le nom « BackupPowerShell.ps1 »
 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image18.png
 
L’utilisation de « Invoke-SqlCmd »ressemble remarquablement à l’utilisation standard de … SqlCmd !
Il suffit de reprendre nos exemples et de les adapter à PowerShell.
Attention, nous ne passons plus par le provider SqlServerProvider mais bien par une cmdlet fournie par SQL SERVER et présente dans PowerShell : Invoke-SqlCmd.
Ce qui donne :

Invoke-Sqlcmd -ServerInstance "MIM\sql2008" -InputFile "C:\BackupBdd.sql"

    -Variable "DataBaseName=PerfSamples"| Out-File -filePath "c:\backupbdd.sql.txt"

Le script PowerShell est lancé et effectue, comme on pouvait s’y attendre, le traitement de la sauvegarde de notre base de données.
 
/content/dbe53563-69de-4c92-9e8a-f1033fe789c2/image19.png
 
 
» Démarrer une discussion