web-dev-qa-db-ja.com

サーバーのすべてのインスタンス上のすべてのデータベースをバックアップするTSQLソリューション?

現在の実装で望んでいることは不可能だと確信しています。サービスレベルでスコープが設定されているsys.databasesカタログビューは、他のSQL Serverインスタンスを認識します(笑)。しかし、コンピューターでは不可能なことがたくさんあると思っていたので、別の方法で問題を解決できるといいのですが。

SMOを使用してすべてのインスタンスのすべてのデータベースをバックアップするPowerShellソリューションを既に作成しましたが、セキュリティ上の理由から、エージェントジョブを実行するプロキシのアカウントをローカル管理者にしないと、そのソリューションを機能させることはできません。サーバ。

別の方法として、エージェントジョブとして実行され、SQL Serverインスタンス内のすべてのデータベースで15分ごとに完全バックアップ、差分バックアップ、またはトランザクションバックアップのいずれかを実行するT-SQLスクリプトを作成しました。

    DECLARE @sql nvarchar(MAX) = N'';

--Check time for full backup
IF (DATENAME(weekday,getdate()) = 'Sunday' AND convert(time,getdate()) > '00:00' and convert(time,getdate()) < '00:15')
    BEGIN
        SELECT @sql += 'BACKUP DATABASE ' + QUOTENAME(name) 
                    + ' TO DISK = N''C:\backups\' + @@ServiceName  + '_' + name + '__' 
                    + cast(year(getdate()) as nvarchar(4)) + '_' + cast(month(getdate()) as nvarchar(2)) + '_' + cast(day(getdate()) as nvarchar(2)) + '__'
                    + cast(datepart(hour,getdate()) as nvarchar(2)) + '_' + cast(datepart(minute,getdate()) as nvarchar(2)) + '_' + cast(datepart(second,getdate()) as nvarchar(3)) +   '.bak'''
                    + ' WITH COMPRESSION
'
        FROM sys.databases
        WHERE name <> 'TempDB';
    END
--Check time for differential backup
ELSE IF (convert(time,getdate()) > '00:00' and convert(time,getdate()) < '00:15')
    BEGIN
        SELECT @sql += 'BACKUP DATABASE ' + QUOTENAME(name) 
                    + ' TO DISK = N''C:\backups\' + @@ServiceName  + '_' + name + '__' 
                    + cast(year(getdate()) as nvarchar(4)) + '_' + cast(month(getdate()) as nvarchar(2)) + '_' + cast(day(getdate()) as nvarchar(2)) + '__'
                    + cast(datepart(hour,getdate()) as nvarchar(2)) + '_' + cast(datepart(minute,getdate()) as nvarchar(2)) + '_' + cast(datepart(second,getdate()) as nvarchar(3)) +   '.diff'''
                    + ' WITH COMPRESSION, Differential
'
        FROM sys.databases
        WHERE name <> 'TempDB' and name <> 'Master';
    END
--Take transaction log backup
ELSE 
    BEGIN
        SELECT @sql += 'BACKUP LOG ' + QUOTENAME(name) 
                    + ' TO DISK = N''C:\backups\' + @@ServiceName  + '_' + name + '__' 
                    + cast(year(getdate()) as nvarchar(4)) + '_' + cast(month(getdate()) as nvarchar(2)) + '_' + cast(day(getdate()) as nvarchar(2)) + '__'
                    + cast(datepart(hour,getdate()) as nvarchar(2)) + '_' + cast(datepart(minute,getdate()) as nvarchar(2)) + '_' + cast(datepart(second,getdate()) as nvarchar(3)) +   '.trn'''
                    + ' WITH COMPRESSION
'
        FROM sys.databases
        WHERE name <> 'TempDB' and name <> 'Master';
    END
print @sql;
exec sp_Executesql @sql;

このスクリプトは正常に機能しますが、1つのインスタンス上のすべてのデータベースのみをバックアップします。目標は、すべてのインスタンスのすべてのデータベースをバックアップすることです。さらに優れたソリューションは、すべてのデータベース、すべてのインスタンス、およびすべてのサーバーをバックアップすることです。私の現在の知識から、3つの解決策があるようです(うまくいけば、答えに基づいて)

  1. このスクリプトは、すべてのインスタンスのエージェントジョブで使用します。これは機能しますが、そのような醜い解決策のようです。
  2. インスタンス対応のPowerShellスクリプトを正常に実行するために、エージェントプロキシに最小限のアクセス許可を与える方法を理解します。
  3. マスターサーバーの作成を検討してください。私はこのオプションに精通していませんが、マスターサーバーが他のサーバーを認識していることは知っています。また、すべてのサーバー上のすべてのデータベースのリストを取得できる場合があります。
1
Luke Pafford

オプション3、マスターサーバーを何度も設定しましたが、バックアップをスケジュールするために設定したことはありません。パフォーマンスデータ収集のジョブをスケジュールし、管理上の変更/スクリプトの更新を [〜#〜] sqlcmd [〜#〜] 経由でプッシュし、複数のバージョンのSQLServerに対して複数のテストを実行できます。 SP/CUアプリケーションの後に行われた予期しない変更をテストするためのインスタンス(とりわけ)。

ただし、問題は次のとおりです。1つのサーバーからすべてのインスタンスのすべてのデータベースをバックアップする理由はありますか?すべてのバックアップエッグを1つのバスケットに入れるということは、そのマスターサーバー(または少なくともSQL Serverエージェント)がオフラインである限り、バックアップが実行されないことを意味します。 (管理方法に関係なく)正当な理由から、各サーバーにバックアップジョブを配置することが標準です。

独自のバックアップステートメントを作成するのではなく、 Ola Hallengrens Maintenance Solution (メンテナンスパッケージ全体を使用する価値があります)を使用することを強くお勧めします。それはただ機能し、非常にうまく機能します。それはあなたが考えもしなかったが、将来必要になるであろうオプションをあなたに与えます。

そのスクリプトを使用して、インスタンスのリストを反復処理し、各サーバーに対してMaintenanceSolution.sql(Olasサイトからダウンロードしたもの)を実行できます。これは、各サーバーへの信頼できる接続で [〜#〜] sqlcmd [〜#〜] を使用し、各サーバーのCSVに結果を出力するバッチファイルを使用して行いました(各インスタンスに対する特権を持っています)。 SSMSの[登録済みサーバー]ビューを使用する場合は、特定のグループ内のすべてのサーバーに対してそのスクリプトを一度に実行することもできます。

それ以外では、 redgate SQL Backup Pro (私は彼らと提携していません)、 Idera SQL Safe Backup (再び、提携していません)のようなものを見ていますあなたがやりたいことをしますが、それらの製品はそれぞれの試用期間外にお金がかかります。

これらのソリューションはいずれも、1つのインスタンスからすべてのサーバー上のすべてのデータベースのバックアップをスケジュールするよりもはるかに安全です。

5
Stephen Falken