複数のデータベースを同じ時点にバックアップする


10

通常、バックアップを開始するときは、変更のコミットを許可しないか、データベースにアクセスできなくなります。データベースがシングルユーザーモードになることを意味しますが、バックアップを開始し、データベースを解放して使用します。また、バックアップを開始したら、進行中の変更をバックアップファイルに書き込まないようにします。Microsoft SQL Server 2012でこれを実現する方法を知りたいです。

さて、まず私の問題を説明させてください。現在、バックアップが完了するまで、データベースをシングルユーザーモードに設定しています。このモードは、バックアップの進行中にデータの変更を回避するという私の目的に役立ちます。しかし、私のアプリケーションは複数のデータベースに関連付けられています(各データベースは相互にリンクされており、毎月作成し続けるvar dbsがあります)。そのため、これらすべてのデータベースのバックアップは退屈なプロセスになり、さらに重要なのは、バックアップの進行中は、ユーザーをシステムから除外する必要があることです。

そこで、以下の要件を満たすバックアップメカニズムを探しています。

  1. 一度にすべてのデータベースのバックアップを開始し、使用できるようにデータベースを解放します。
  2. データベースは相互にリンクされているので、バックアップファイルでデータの一貫性を維持したいと考えています。したがって、このデータ整合性の要件のため、進行中の変更をバックアップファイルにコミットしたくありません。

必要なのは、ある時点でのすべてのデータベースのバックアップです。


2
バックアップを取るときに、データベースをシングルユーザーモードに設定する必要はありません。SQL Serverは、コミットされていないトランザクションをバックアップに含めません。より完全な回答を得るには、投稿を編集して、トランザクションログバックアップ、完全バックアップまたは増分バックアップのどちらを意味するか、およびどのような問題が発生しているかなど、復旧モデルの詳細を含めてください。現状では、あなたの質問は少し不明確です。
Daniel Hutmacher

1
このバックアップで何を達成したいですか?この時点までの完全な回復可能性-または他の何か?つまり、このバックアップから復元する必要がある場合、何を復元する必要がありますか--- DDLの変更はありますか?データの変更、または何?
seventyeightist 2016年

SQL 2012では希望どおりの操作はできません。SQL7.0の時代には、データベースのバックアップセットを使用して、BACKUPステートメントの開始時と同じようにデータベースを再作成しました。SQL 2000以降では、データベースのバックアップセットを使用して、BACKUPステートメントが完了したときと同じようにデータベースを再作成します。
stacyaray

@DanielHutmacher完全バックアップを探しています。
Praveen

回答:


13

私は、すべてのバックアップを1つの静的な(開いているトランザクションはありません)ポイント(すべて同期)に復元できるバックアップのセットを作成することを想定しています。DB2で静止ポイントが行うことと同様です。残念ながら、SQL Serverにはまさにそれを行うものはありません。ただし、データベースが完全復旧モードであることを前提として、同様のことを実行できます。

すべてのデータベースにわたって単一のMARKEDトランザクションを一度に作成できます。次に、各データベースのトランザクションログバックアップを作成します。ログのバックアップを維持していると仮定すると(とにかくそうする必要があります)、ログのバックアップにはそれほど時間がかかりません。そして、誰かがシステムにいるのを止める必要はありません(おそらく、マークされたトランザクションを作成するのに十分な長さを除く)。

この時点で、復元を行う必要がある場合は、RESTORE STOPBEFOREMARK各データベースでを実行します。これにより、すべてのデータベースが(トランザクションに基づいて)同じポイントに復元されます。注:そのトランザクションを含める場合は、STOPATMARKもあります。

例が必要な場合は、上記のリンクにある例を参考にしてください。

これはあなたの質問に正確に答えるものではありませんが、うまくいけばあなたの問題を解決するでしょう。


2
これは、BizTalkが複数のデータベースのポイントインタイムバックアップを管理する方法です。Microsoft BizTalkで機能する場合、十分にテストされた機能です。
Max Vernon

alwaysOnに変更したログ配布でTFSデータベースに使用します。
Kin Shah

1
ケンの答えを理解するための1つの(暗黙的だが言及されていない)詳細:複数のDB間で一貫性のある完全バックアップを作成することはできません。最も近いのは、一連の完全バックアップを取り、その直後にマークされたトランザクション、次に一連のログバックアップを取ることです。その最初のログバックアップでは、整合性を特定の時点まで「調整」します。
AMtwo 2016年

@AMtwo技術的には、OPsメソッドを使用することができます。システムから全員をロックアウトし、アクティブな接続がないことを確認します(データベースを読み取り専用/制限付きとしてマークする場合があります)。その後、すべてのデータベースの完全バックアップを作成します。しかし、OPが述べたように、それは世界で最良の方法ではありません。
ケネスフィッシャー

7

あなたの質問は、私が回答したものと同様です-10〜20のSQL Serverデータベースを〜同期状態にバックアップおよび復元しますか?

データベースの復旧モデルがフルであると想定すると、フルバックアップを実行してから、マーク付きトランザクションを使用する必要があります。

あなたの神話を暴くことができます...

一度にすべてのデータベースのバックアップを開始し、使用できるようにデータベースを解放します。

バックアップの神話 から(すべてのバックアップの神話を読むことを強くお勧めします)

バックアップ操作は、ユーザーオブジェクトをロックしません。バックアップを行うと、I / Oサブシステムに非常に大きな読み込み負荷がかかるため、ワークロードがブロックされているように見えますが、実際にはそうではありません。減速しているだけです。一括ログに記録されたエクステントを取得する必要があるバックアップがファイルロックを取得する特殊なケースがあり、チェックポイント操作をブロックする可能性がありますが、DMLはブロックされません。

データベースは相互にリンクされているので、バックアップファイルでデータの一貫性を維持したいと考えています。したがって、このデータ整合性の要件のため、進行中の変更をバックアップファイルにコミットしたくありません。

マークされたトランザクションは、一貫したLOGバックアップを作成するのに役立ち、次を使用してそれらを 復元できます。RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

インスタンス上のすべてのデータベースのマークされたトランザクションもdbo.logmarkhistoryMSDBデータベースのテーブルに記録されることに注意してください。


-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

詳細:https : //blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/


これは、同じ時点のバックアップを保証するものではありません。これは、連続した一連のバックアップにすぎません。
vonPryz 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.