SQLServer2005 メンテナンスプランについて
SQLServer2005の管理、メンテナンスプランについての質問です。
互換性レベル7.0で運用しているDBのバックアップタスクを作成したいと思っています。
ツールボックスから「データベースのバックアップタスク」を使用すると、対象のDBとしてリストに表示されないため、
「T-SQLの実行タスク」を作成し、ステートメントに以下のように記述しました。バックアップは正常終了するのですが。。。
-------------------クエリここから-----------------
BACKUP DATABASE [DB_NAME] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_200901151519.bak' WITH NOFORMAT, NOINIT, NAME = N'DB_NAME_backup_20090115151905', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'DB_NAME' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'DB_NAME' )
if @backupSetId is null begin raiserror(N'確認に失敗しました。データベース ''DB_NAME'' のバックアップ情報が見つかりません。', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_200901151519.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
-------------------クエリここまで-----------------
ここで、問題なのは、バックアップファイル名の指定が「DB_NAME_backup_200901151519.bak」固定であることです。
実行日時を取得してファイル名を生成するため、以下のように引数の「DISK」と「NAME」を変数で指定するように変更しました。
しかし、クエリの実行をすると、メッセージに以下のエラーが出力され、実行できません。
引数の渡し方が誤っているのでしょうか?
宜しくご教授願います。
-------------------変更後クエリここから-----------------
DECLARE @TODAY VARCHAR(30);
DECLARE @YYYY VARCHAR(4);
DECLARE @MM VARCHAR(2);
DECLARE @DD VARCHAR(2);
DECLARE @HH VARCHAR(2);
DECLARE @M VARCHAR(2);
DECLARE @S VARCHAR(2);
DECLARE @DISK VARCHAR(200);
DECLARE @NAME VARCHAR(100);
set @TODAY = convert(varchar, GETDATE(), 121);
set @YYYY = SUBSTRING(@TODAY, 1, 4);
set @MM = SUBSTRING(@TODAY, 6, 2);
set @DD = SUBSTRING(@TODAY, 9, 2);
set @HH = SUBSTRING(@TODAY, 12, 2);
set @M = SUBSTRING(@TODAY, 15, 2);
set @S = SUBSTRING(@TODAY, 18, 2);
set @DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_'+@YYYY + @MM + @DD + @HH + @M +'.bak';
set @NAME = N'DB_NAME_backup_'+@YYYY + @MM + @DD + @HH + @M + @S;
print 'DISK:'+@DISK
print 'NAME:'+@NAME
BACKUP DATABASE [DB_NAME] TO DISK = @DISK WITH NOFORMAT, NOINIT, NAME = @NAME, SKIP, REWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'DB_NAME' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'DB_NAME' )
if @backupSetId is null begin raiserror(N'確認に失敗しました。データベース ''DB_NAME'' のバックアップ情報が見つかりません。', 16, 1) end
RESTORE VERIFYONLY FROM DISK = @DISK WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
-------------------変更後クエリここまで-----------------
-------------------メッセージここから-------------------
DISK:C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\DB_NAME\DB_NAME_backup_200901211339.bak
NAME:DB_NAME_backup_20090121133912
メッセージ 137、レベル 15、状態 2、行 1
スカラ変数 "@DISK" を宣言してください。
メッセージ 137、レベル 15、状態 2、行 4
スカラ変数 "@DISK" を宣言してください。
-------------------メッセージここまで-------------------
以上、よろしくお願い致します。
補足
ご回答有り難うございました。 @@ERRORでとれそうです。無知で申し訳ありませんでした。 スクリプトタイムアウトの方は、2時間から3時間以上に設定して、処理中に絶対にタイムアウトしないようにするつもりです。 また、非同期にバックアップを実行して、状態を見ながら逐一Webブラウザにメッセージを送ることで、ブラウザ側のタイムアウトも回避するつもりです。 ただ、非同期動作をテストしたところ、db.State で得られる値が、「5」という、意味不明な値を返しており、困惑しています。これは、以下のいずれかを返すと、いろいろな書籍に書かれており、5を返すという動作は、おかしいのです。私は、動作中は、4で、終わったら、1を返してくれることを期待していたのですが、、、 戻り値の意味(MSDNより抜粋): 値 説明 0 オブジェクトが閉じていることを示します。 1 オブジェクトが開いていることを示します。 2 オブジェクトが接続していることを示します。 4 オブジェクトがコマンドを実行中であることを示します。 8 オブジェクトの行が取得されていることを示します。 結果、0,1,2以外は、処理の終了を待つようにしようと思います。 また、結果は、処理終了後、エラーコレクション([ADODB.Connection].Errors)を参照すれば、できそうでした。@@ERRORを教えていただきましたが、SQL中でエラーを確認できても、どのようにしてASPまで戻すのかがわからなかったため、これの方が、簡単かなと思った次第です。 また、EnterpriseManagerにてバックアップを処理する件ですが、使用環境や、時間帯、将来的にMSDEでの使用も考えており、また、ユーザーにEnterprizeManagerを使わせたくない事もあり、また、外部メディアに保存して、物理的にバックアップデータを管理させたいため、このような方法になりました。 いろいろ勉強させていただきました。 有り難うございました。