実は、SQL Server 2008 のバックアップもPowerShellで簡単に実行することができます。
こんな、バックアップスクリプトをSQLで作っておき、それをInvoke-SqlCmd で、ファイル名を指定して実行するだけ。
SQLスクリプト
DECLARE @backupSetId as int
DECLARE @now as nvarchar(10)
DECLARE @backupfile nvarchar(max)
SELECT @now = CONVERT(varchar, getdate(), 112),
@backupfile = N'D:\backup\SampleDb_' + @now + '.bak'
BACKUP DATABASE [SampleDb] TO DISK = @backupfile
WITH NOFORMAT,
INIT,
NAME = N'SampleDb-完全 データベース バックアップ',
SKIP,
NOREWIND,
NOUNLOAD,
STATS = 10
SELECT @backupSetId = position
FROM
msdb..backupset
WHERE
database_name = N'SampleDb'
AND backup_set_id = (select max(backup_set_id) from msdb..backupset where database_name=N'SampleDb' )
IF @backupSetId is null
BEGIN
raiserror(N'確認に失敗しました。データベース ''SampleDb'' のバックアップ情報が見つかりません。', 16, 1)
END
RESTORE VERIFYONLY FROM DISK = @backupfile WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
上記バックアップスクリプト実行するPowerShellのコマンドライン
# Invoke-SqlCmd -InputFile 'バックアップ用SQLスクリプト'
Invoke-SqlCmd -InputFile 'D:\backup\SampleDb_Backup.sql'
たった、これだけなんですが、1つだけ注意点!
それは、Invoke-SqlCmd コマンドをSQL Server Agent で動かす時、このままだとエラーになります。
ちなみに、SQL Server Agent で、PowerShellを動かしたい場合は、下記で行けます。
手順1:Management Studio で、[管理]→[SQL Server Agent] を選択する
手順2:新規ジョブを作成し、下記のように設定する
手順3:ジョブを作成する際、[種類]にPowerShellを選択し、コマンド欄には、下記のように入力します。(SQL Server 認証の例)
# ユーザIDとパスワードを指定する
#(コマンドライン実行と違い、SQL Server Agentは接続情報をもっていないため)
Invoke-SqlCmd -InputFile 'D:\backup\SampleDb_Backup.sql'
-ServerInstance "サーバ名\SQL Serverのインスタンス名" -U ユーザID -P パスワード
手順4:後は、ジョブに対するエラー発生時の対処方法などを設定すればOKです。
手順5:作成したジョブを右クリックし、[ステップでジョブを開始] します。
成功メッセージが返ってきて、所定のフォルダにDBバックアップファイルが無事格納されていればOKです。
ただ、もう1つわからないことがあります。(T-SQL を私が忘れているだけかもしれませんが)
それは、Invoke-SqlCmd コマンドって、SQL Server でいう、EXEC(正式名はEXECUTE) ですよね?
ストアド実行時に関しては戻り値がとれるんで、OKなんですが、SQLスクリプトファイルで実行したものって
戻り値とれないんでしたっけ?
もし、それができれば、Invoke-SqlCmd でスクリプトファイルをSQL Server Agent で実行しても、
きちんとした戻り値処理ができるんですけどね・・・ うーん、知っている方、教えてください。