В предыдущей заметке, было создано зеркальное отображение с failover-ом без создания кластера посредством iptables. Осталось организовать резервное копирование.
Моя проблема заключалась в том, что нельзя создать резервную копию базы, которая является зеркальным отображением базы сервера-принципала (principal). В глубинах WWW были найдены куски кода, которые я объединил в один скрипт PowerShell, который позволяет проверить является ли база основной или нет, если основная, то делаем копию, если - нет то и не надо.
Вот скрипт, который удалось собрать backup-mssql-base.ps1:
param(
$dbstatus = Invoke-Sqlcmd -query "select db_name() as databasename, databasepropertyex('upp_demo','status') as dbstatus" -Verbose | Format-Wide -Property dbstatus | Out-String
if($status -eq "ONLINE") {
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
Моя проблема заключалась в том, что нельзя создать резервную копию базы, которая является зеркальным отображением базы сервера-принципала (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"
}
Комментариев нет:
Отправить комментарий