RESTORE DATABASEイベント後にストアドプロシージャを自動的に実行する


9

それが持っていることが可能であるSQL Server 2008 R2の標準が自動的にされる任意のデータベースにストアド・プロシージャを実行復元またはattachcedインスタンスに?

DDLイベントの後、CREATE_DATABASEまたはALTER_DATABASE起動された後に、特定のデータベースでストアドプロシージャを実行するサーバーレベルのトリガーを作成することで、ソリューションに近づきました。残念ながら、これはデータバックバックアップの復元では機能しません。

詳しく説明すると、復元するすべてのデータベースに存在する「クリーンアップ」ストアドプロシージャがあり、バックアップがインスタンスに復元されるたびにこれを自動的に実行する方法を探しています。

グーグルによって、SQL Serverで監査またはポリシーを構成してこの機能を取得するよう指示されましたが、これらの機能は一見すると非常に圧倒されるため、監査または警察が調査を開始するための手段であるかどうかわかりません。

回答:


10

復元が完了した直後に実行する必要がありますか、それとも一時的に遅延させることができますか?私が持っていた1つのアイデアは、毎分実行さAudit Backup/Restore Eventれ、デフォルトのトレースでをチェックするジョブを用意することです。

DECLARE @fn VARCHAR(MAX);

SELECT @fn = SUBSTRING([path], 0, LEN([path])-CHARINDEX(CHAR(92), REVERSE([path]))+1) 
  + CHAR(92) + 'Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT 
    DatabaseName,
    StartTime, 
    TextData
FROM sys.fn_trace_gettable(@fn, DEFAULT)  
WHERE EventClass = 115
AND TextData LIKE '%RESTORE%'; -- since can't differentiate between backup/restore

StartTimeに基づいて既に実行したクリーンアップを保存し、1分ごとに実行するトレースクエリ(または許容可能な遅延しきい値)を制限して、最後にプルした行または最後の行より大きいStartTime値のみを調べるようにすることもできます。ジョブが実行された時間のどちらか短い方。


1
非常に滑らかで良い考え。+1
トーマス・ストリンガー2012

わずかな遅延は許容されます。私はこれを試してみるつもりです。
マシューラストン

1
すべてのケースで、トレース行が書き込まれる前にイベントが実際に終了することを確認していません。私はそれがイベント後の書き込みであると思いますが、私は人がいEndTimeないようであるという理由だけで疑わしいです。データベースへの接続を試行する必要がある場合があります。それができない場合は、スキップしてこの復元イベントを文書化せずに、次にジョブが実行されるときに再試行してください。私は試して検証しましたが、ローカルVMにはSSDしかありませんが、動作を正確に観察するのに十分な時間をかけてバックアップを行うためのディスク領域がありません。:-)
アーロンバートランド

6

database_started 拡張イベントは、データベースが復元された後に解雇されました。

キャプチャした場合のセッション作成database_id述語を持つフィールドが探していること%RESTORE%sql_text(: -あなたがあなた自身のためにテストしたいと思う私はこれで十分であると考えているノート)フィールドを。

私は拡張イベントに慣れていないので、イベントに応答する最良の方法を説明します。ストアドプロシージャを直接起動できると便利です。それが可能かどうかはわかりませんが。ただし、イベントバッファーをポーリングすることは確かに可能です。これは、パフォーマンス上の理由だけでなく、サーバーが非常にビジーでポーリング間隔が長すぎる場合、デフォルトのトレースをスキャンするよりも望ましい方法です。拡張イベントメソッドでは、イベントを見逃すことはほとんどありません。


4

DDLイベントリストを見るとわかるように、DDLトリガーは、要件に対して十分に明示的ではありません。

復元またはアタッチを実行するPowerShellスクリプトを記述して、直後にストアドプロシージャを実行することをお勧めします。あなたの店は、通常の復元やアタッチの代わりにこれを使用するように指示される必要があります。

残念ながら、これを実現する組み込みの方法があるとは思いません。


4

バックアップをどのように実行していますか?バックアップ後にSPを実行したいだけの場合は、SPをジョブの別のタスクとして使用できます(それらを使用している場合)、またはメンテナンスプラン。

したがって、イベントログに書き込むように監査を設定してから、ジョブを実行するアラートを作成できます。複雑に見えますが、それはあなたが求めていることを行います。

次のコードを見てください。

--Create the Server Audit
USE master
GO
CREATE SERVER AUDIT BackupTrap
TO APPLICATION_LOG
WITH (QUEUE_DELAY = 0, ON_FAILURE = CONTINUE)
GO

--Turn the Audit On
ALTER SERVER AUDIT BackupTrap
WITH (STATE = ON)
GO

--Create the Database Audit Specification
USE AdventureWorks2012
GO
CREATE DATABASE AUDIT SPECIFICATION BackupTrapAdventureWorks
FOR SERVER AUDIT BackupTrap
    ADD (BACKUP_RESTORE_GROUP)
WITH (STATE = ON)
GO

--Create the job to run
USE msdb
GO
EXECUTE dbo.sp_add_job
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobserver
    @job_name = N'BackupAlertJob'
GO

EXECUTE dbo.sp_add_jobstep
    @job_name = N'BackupAlertJob',
    @step_name = N'RunSP',
    @subsystem = N'TSQL',
    @command = N'EXECUTE dbo.MyStoredProcedure',
    @database_name = N'AdventureWorks2012'
GO

これをキャプチャする復元ジョブは良い考えです。ただし、OPが「任意の」復元イベントをキャプチャしたい場合、それは完全なソリューションかどうかと思います。
Nick Chammas

復元イベントの完了後に任意のストアドプロシージャを実行できるようになることは、まさに私たちが求めていることです。それにもかかわらず、有効な提案です。
マシューラストン

2つ目の回答を削除し、上記を編集して情報を含めました。そのためのヒントを@Sharkにありがとう。そんなことは全く考えていませんでした。
jgardner04

0

バックアップをどのように実行していますか?Commvaultを使用すると、自動化された復元ジョブをセットアップし、SQLまたはpowershellの復元前と復元後のスクリプトを実行できます。バージョン間でDDLを実行したり、環境間で復元するときにアクセス許可をバックアップおよび復元したりするために、常にこれを行っています。

Netbackupには他の製品にも同様の機能があると思います

SQLを使用する場合は、データベースを復元するジョブにステップとして追加するだけです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.