web-dev-qa-db-ja.com

別のサーバーの別のデータベースのテーブルにバックアップ結果を記録することは可能ですか

Ola Hallengrenのメンテナンスソリューションを使用して、環境内のSQL 2012 Expressインスタンスをバックアップしています。私はまったく新しいDBAで、生後10週間なので、あまり慣れていませんが、早く学んでいます。私はすべてが私たちが望むように構成されていると確信しています。私はExpressインスタンスのマスターデータベースにストアドプロシージャを作成し、Windowsタスクスケジューラ内から毎晩実行するバッチファイルをスケジュールしました。

まず第一に、それを有効にする方法、または有効になっている場合にどのデータベースでテーブルを検索するのかがよくわかりませんか?

次に、別のサーバー\インスタンス上の別のデータベースのテーブルに結果を記録したいと思います。これは可能ですか?もしそうなら、私がこれを設定できるように誰かが私に指すことができる方向がありますか?

ありがとう!

1
TattooedDBA

dbo.CommandLogテーブルは、作成したデータベースにあります。デフォルトではmasterになります(以下は MaintenanceSolution.sql スクリプトの一部です):

USE [master] -- Specify the database in which the objects will be created.

...

IF NOT EXISTS (SELECT * FROM sys.objects 
  WHERE object_id = OBJECT_ID(N'[dbo].[CommandLog]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[CommandLog](
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [DatabaseName] [sysname] NULL,

...

別のサーバーにログオンする場合は、不安定な接続や切断された接続、およびリンクサーバーを介して多くの情報を書き込む潜在的な待ち時間などに備える必要があります。

これを本当に実行したい場合は、dbo.CommandLogその他のインスタンスのテーブル、そのテーブルが現在存在するデータベース内:

-- you could drop, but in case you have history you want to keep:
EXEC sys.sp_rename N'dbo.CommandLog', N'CommandLogBackup', N'OBJECT';

CREATE SYNONYM dbo.CommandLog
  FOR LinkedServerName.DatabaseName.dbo.CommandLog;

dbo.DatabaseBackup手順と同じデータベースでテーブルのチェックがあります。

IF @LogToTable = 'Y' AND NOT EXISTS 
(
  SELECT * FROM sys.objects objects 
    INNER JOIN sys.schemas schemas 
    ON objects.[schema_id] = schemas.[schema_id] 
    WHERE objects.[type] = 'U' 
    AND schemas.[name] = 'dbo' 
    AND objects.[name] = 'CommandLog'
  )
  BEGIN
    SET @ErrorMessage = 'The table CommandLog is missing. Download...'
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
  END

それは明示的にテーブルを探しているため、失敗しているだけです-同義語であるという事実は、その後のロギング呼び出しが機能することを妨げません(同じように、同義語を含むすべてが同じデータベースに存在する限り)。 RAISERROR行をコメント化するか、チェック全体を削除することもできます。手順の更新を展開するときはいつでもそれを行うことを忘れないでください。ロギングテーブルを別の場所に保持できるように、シノニムまたはビューをサポートする機能をOlaに要求することを検討してください。

2
Aaron Bertrand

Olaのスクリプトが使用する[dbo].[CommandExecute]ストアドプロシージャを見ると、スクリプトが実行されているのと同じデータベースに[dbo].[CommandLog]ロギングテーブルが存在することを期待しているように見えます。

これらのコマンドを別のSQL Serverインスタンスに記録できる唯一の方法は、そのリモートインスタンスにリンクサーバーを作成し、AFTER挿入/更新トリガーを[dbo].[CommandLog]テーブルに追加して、リモートを挿入/更新することです。テーブルのインスタンスバージョン。エントリは最初に最初にログに記録されるため、ローカルインスタンスから定期的にエントリを削除する必要があります。

0
Scott Hodgin