понедельник, 5 сентября 2016 г.

Резервное копирование базы через powershell

В предыдущей заметке, было создано зеркальное отображение с failover-ом без создания кластера посредством iptables. Осталось организовать резервное копирование.

Моя проблема заключалась в том, что нельзя создать резервную копию базы, которая является зеркальным отображением базы сервера-принципала (principal). В глубинах WWW были найдены куски кода, которые я объединил в один скрипт PowerShell, который позволяет проверить является ли база основной или нет, если основная, то делаем копию, если - нет то и не надо.




Вот скрипт, который удалось собрать backup-mssql-base.ps1:

<#
  Вызов скрипта производится с параметрами:
  -serverName - Имя хоста, где куртится MSSQL
  -baseName - Имя самой базы данных
  -backupDirectory - Куда сохранять бэкап базы
  -incremental - Является ли копия разностной (по умолчанию - нет, произодится полный бэкап)
  -daysToStoreBackups - Сколько дней хранить бэкапы, старше - удаляются
 Пример вызова с созданием разностной копии:
  powershell.exe C:\Backup\backup-new.ps1 -servername "SQLVIRT" -baseName upp_demo -backupDirectory "c:\backup" -incremental 1 -daysToStoreBackups 1 >> C:\Backup\backup.log
 Пример вызова с созданием полной копии:
  powershell.exe C:\Backup\backup-new.ps1 -servername "SQLVIRT" -baseName upp_demo -backupDirectory "c:\backup" -daysToStoreBackups 1 >> C:\Backup\backup.log
  P.S.: Если база находится в режиме не равном ONLINE, тогда бэкап не производится, это сделано для того, чтобы скрипт не пытался создать копию базы - зеркального отображения.
#>

param(  
    $serverName,
    $baseName,
    $backupDirectory,
    $incremental = 0,
    $daysToStoreBackups
)

$dbstatus = Invoke-Sqlcmd -query "select db_name() as databasename, databasepropertyex('upp_demo','status') as dbstatus" -Verbose | Format-Wide -Property dbstatus | Out-String
$status = $dbstatus.Trim()

if($status -eq "ONLINE") {

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null
$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $serverName
$database = $server.Databases["$baseName"]
$dbName = $database.Name
$timestamp = Get-Date -format yyyy-MM-dd-HHmmss
$targetPath = $backupDirectory + "\" + $dbName + "_" + $timestamp + ".bak"
$smoBackup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup")
$smoBackup.Action = "Database"
$smoBackup.BackupSetDescription = "Full Backup of " + $dbName
$smoBackup.BackupSetName = $dbName + " Backup"
$smoBackup.Database = $dbName
$smoBackup.MediaDescription = "Disk"
$smoBackup.Devices.AddDevice($targetPath, "File")
$smoBackup.CompressionOption = “1”
$smoBackup.Incremental = $incremental
$smoBackup.SqlBackup($server)
"backed up $dbName ($serverName) to $targetPath"
Get-ChildItem "$backupDirectory\*.bak" |? { $_.lastwritetime -le (Get-Date).AddDays(-$daysToStoreBackups)} |% {Remove-Item $_ -force }  
"removed all previous backups older than $daysToStoreBackups days"
}
Else {
"DataBase $baseName is not ONLINE or not exists on this server"
}

Комментариев нет:

Отправить комментарий