実は、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 で実行しても、
きちんとした戻り値処理ができるんですけどね・・・ うーん、知っている方、教えてください。
コメント
Invoke-SqlCmdっていろいろな使い道があるんですね。
きっとSQLServerのPowerShellでは一番使用されるコマンドレットでしょうね。
図入りでわかりやすい説明ありがとうございました。
躓きやすいポイントに説明があるのもさすがですね!!