SQL DB のバックアップ処理をゴリゴリと・・・
この連休中にリモートから潜り込んでシコシコとコーディングしてました。
で、SQL Server 2008 のデータベースの完全バックアップのジョブが完成。
運用テスト中です。
で、書いたのがコレ。
(23時にこのジョブを開始させることが前提)
【Step-1】バックアップ前のデータベースの状況チェック
use [データベース名]
go
dbcc checkdb ('データベース名') with no_infomsgs
go
【Step-2】バックアップ(23時に取得)
declare @date datetime
if datepart(hour,getdate()) < 6
set @date = getdate()
else
set @date = dateadd(day,1,getdate())
set @date = cast(cast(datepart(yyyy,@date) as char(4)) + '-' +
cast(datepart(mm,@date) as char(2)) + '-' +
cast(datepart(dd,@date) as char(2)) + ' 23:00:00.000' as datetime)
backup database [データベース名] to [バックアップ・メディア名]
with init, --バックアップ・メディアを初期化
expiredate = @date, --有効期限は翌日の23時まで
name = N'データベース名-完全 データベース バックアップ',
noskip,
stats = 100,
noformat,
medianame = N'バックアップ・メディア名',
compression, --圧縮処理を有効
checksum
/* バックアップが有効かチェック*/
declare @i int
select @i = position from msdb.dbo.backupset
where database_name = 'データベース名'
and type != 'F'
and backup_set_id = (
select max(backup_set_id) from msdb.dbo.backupset
where database_name = 'データベース名')
restore verifyonly from [バックアップ・メディア名] with file = @i
【Step-3】DBCC CHECKDB の結果とバックアップの結果をメール送信
$date = Get-Date -format yyyy/MM/dd
$date = $date + " 23:00:00"
$eventlog = Get-EventLog Application | Where-Object{$_.EventID -eq 8957 -and $_.Source -eq "MSSQLSERVER" -and $_.TimeGenerated -ge $date} | Format-List | Out-String #DBCC CHECKDB のイベントIDが 8957 なので
$smtpserver = "SMTPサーバー名(or IPアドレス)"
$from = "送信元メール・アドレス"
$to = "受取先メール・アドレス"
$subject = "データベースの完全バックアップの結果"
$body = @"
バックアップの結果は、添付ファイルをご覧ください。
DBCC CHECKDB の結果は以下の本文でご確認ください。
"@
$body = $body + $eventlog
$file = "SQLジョブのログの保存先パス(例)E:\MSSQL10.MSSQLSERVER\MSSQL\Backup\DB完全バックアップ.txt"
$mail = New-Object System.Net.Mail.MailMessage($from, $to, $subject, $body)
$attachment = New-Object System.Net.Mail.Attachment($file, [System.Net.Mime.MediaTypeNames]::Text.Plain)
$mail.Attachments.Add($attachment)
$smtp = New-Object System.Net.Mail.SmtpClient($smtpserver)
$smtp.Send($mail)
メール送信は、以前ではCDOを使ってVBScriptから投げてたんですが、SQL 2008からは PowerShellが使えるので .NET の Net.Mail を使用してすっきり書けます。
イベントログから DBCC CHECKDB の処理結果を抽出するのも PowerShellだと、たったの1〜2行程度で書けてしまいます。
VBScriptでWMI サービスに接続してグリグリ回していたのと雲泥の楽さです。
但し、最後に "Out-String" を付け足すのがミソですが。
最初、メール本文に出力されずに焦りました。(^^;
こんなのでお役に立てればと・・・・