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" を付け足すのがミソですが。
最初、メール本文に出力されずに焦りました。(^^;

こんなのでお役に立てればと・・・・