はじめに
前回の記事では、msdbデータベースに自動化に関連する実質的にすべてのオブジェクトが格納されていることを強調しました。この記事では、SQLServerインスタンス間でジョブとオブジェクトを移動する場合を確認します。
SQLServerのこのインスタンスのmsdbに格納されているオブジェクトのリストから始めましょう。
メンテナンスプランを使用して作成されたジョブがいくつかあります(SQL Serverでのメンテナンスプランの作成の記事を参照してください)。また、2つのアラートと1つのオペレーターがあります。 Msdbは、アラートとオペレーターも保存します(図1を参照)。これらのオブジェクトを削除してから、msdbデータベースのバックアップを復元して復元します。
msdbに保存されているオブジェクトの表示
関連するシステムオブジェクトをクエリすると、これらのオブジェクトが結果セットとして返されることもわかります。 (リスト1、図2を参照)。 Msdbは、ジョブ、バックアップログ、オペレーター、メンテナンス場所、データベースメール、および自動化に関連するその他のアイテムの記録を含むシステムカタログも保存します。
-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;
バックアップmsdb
SQL Serverの単一インスタンスの概念を説明するために、最初にmsdbデータベースのバックアップを取ります。本番シナリオでは、システムデータベースの定期的なバックアップを戦略の一部にする必要があります。これらは通常、毎日の完全バックアップスケジュールに快適に収まるほど小さいものです。
もちろん、システムデータベースを参照する場合、これには必要なtempdbは含まれていません。さらに、モデルデータベースの毎日のバックアップも必要ない場合があります。毎週のバックアップで十分です。毎日の完全バックアップについては、masterとmsdbを検討してください。
リスト2の単純なコードを使用して、msdbデータベースのバックアップを取ります。
-- Listing 2: Backup msdb Database
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';
ジョブの削除
バックアップの準備ができたら、インスタンスにジョブをドロップします。メンテナンスプランによって作成されたジョブを削除するには、それらを作成したメンテナンスプランを削除する必要があることに注意してください(図3を参照)。
通常のジョブは、GUIを使用して削除することで削除できます。別の方法は、リスト3のコードを実行し、続いてリスト4のコードを実行することです。
リスト3は、ジョブをドロップするために必要な一連のスクリプトを生成します。次に、リスト4で、リスト3で生成されたスクリプトを実行します。
インスタンス内のジョブ名が私のものとはおそらく異なる場合でも、このアプローチを使用できます。
-- Listing 3: Generate Script to Drop Jobs
USE [msdb]
GO
select 'EXEC msdb.dbo.sp_delete_job @job_name=N''' + [name] + ''', @delete_unused_schedule=1' from sysjobs;
GO
-- Listing 4: Drop SQL Agent Jobs
EXEC msdb.dbo.sp_delete_job @job_name=N'DB1_BackupTransactionLog', @delete_unused_schedule=1
EXEC msdb.dbo.sp_delete_job @job_name=N'syspolicy_purge_history', @delete_unused_schedule=1
ジョブを削除した後、ジョブが残っていないことを確認できます。リスト1に示すように、同じスクリプトを使用します。シナリオでは2つの方法を検討します。
- 誰かがインスタンス内のジョブや同様のオブジェクトを誤って削除しました。
- あるインスタンスから別のインスタンスにジョブをインポートしたい。
msdbの復元
リスト5のスクリプトを使用して復元操作を開始します。このスクリプトでは、データベースをsingle_userモードに設定することから始めます。誰かまたは何か(SQLエージェントアカウント?)がこのデータベースにログインしている可能性があるため、それが必要です。
次に、「restore」コマンドを発行し、新しいmsdbデータベースをmulti_userに設定します。復元ステートメントでREPLACEオプションを使用したことに注意してください。 msdbを新しいインスタンスに移行する場合は、REPLACE句が必要になります。これがないと、SQLServerはインスタンスのmsdbデータベースに属していないバックアップセットに関するエラーを返す場合があります。
-- Listing 5: Restore msdb database
use master
go
alter database msdb set single_user with rollback immediate;
GO
restore database msdb from disk = 'E:\DriveG\msdb_18072020.bak'
with replace;
GO
alter database msdb set multi_user;
GO
復元操作が完了すると、不足しているジョブやその他のオブジェクトが元に戻ります。彼らはそれぞれの職歴を完備しています。データベースや他のオブジェクトとのジョブ間のすべての関係は損なわれていません。ジョブは、誰も、何も削除していないかのように機能します。
結論
ジョブや同様のオブジェクトをあるSQLServerインスタンスから別のインスタンスに簡単に移行できます。そのためには、msdbのバックアップと復元のプロセスが必要です。同様に、何らかの理由で失われた場合は、SQLServerインスタンスでこれらのオブジェクトを回復できます。