web-dev-qa-db-ja.com

SQLジョブを使用してバックアップを行うときにデータベースをオフラインにすることはできますか?

データベースのバックアップ(SQL Server 2008)を生成し、新しいサーバー(SQL Server 2016)に復元する必要があるシナリオがあります。バックアップデータの取得中は、いかなる場合も変更しないでください。だから私はそれを行うための2つのオプションがありますが、それがどのように機能するかわかりません。 (すべてがSQLジョブのみを使用しています。)

  1. 読み取り専用データベースを設定し、新しいDBサーバーに復元します。

    →新しいサーバーで読み取り専用DBを復元することは可能ですか?移行先サーバーは、同じ名前の読み取り/書き込み(オンライン)データベースを既に持っています。

  2. オフラインデータベースを設定し、新しいDBサーバーに復元します。

    →新しいサーバーでオフラインDBを復元できますか?移行先サーバーには、同じ名前のオンライン(読み取り/書き込み)データベースが既にあります。

6
Irfan

→新しいサーバーで読み取り専用DBを復元することは可能ですか?

はい

例:

CREATE DATABASE ReadOnlyDB;
GO

ALTER DATABASE ReadOnlyDB SET READ_ONLY;

BACKUP DATABASE ReadOnlyDB TO  disk = '\\share\readonly.Bak';

宛先サーバーは、同じ名前の読み取り/書き込み(オンライン)データベースを既に持っています。

これが何を意味するかは完全にはわかりませんが、必要に応じて別の名前でデータベースを復元できます。後で、読み取り専用プロパティを削除することを忘れないでください。

RESTORE DATABASE ReadOnlyDB2
FROM DISK = '\\share\readonly.Bak'
WITH MOVE 'ReadOnlyDB' to '\Datalocation\ReadOnlyDB2.mdf',
 MOVE 'ReadOnlyDB_log' to '\Loglocation\ReadOnlyDB_log2.ldf',
STATS = 5;
GO
ALTER DATABASE ReadOnlyDB2 SET READ_WRITE;

既存のデータベースをREPLACEキーワードで置き換えることもできます。

→オフラインDBを新しいサーバーに復元できますか?

いいえ、SQLサーバーはデータベースファイルからすべてのハンドルを削除し、オフラインの間はハンドルにアクセスできないため、これは不可能です。

ALTER DATABASE ReadOnlyDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
BACKUP DATABASE ReadOnlyDB TO  disk = 'C:\temp\readonlyOffline.Bak';

メッセージ942、レベル14、状態4、行10データベース 'ReadOnlyDB'はオフラインであるため開くことができません。メッセージ3013、レベル16、状態1、行10 BACKUP DATABASEが異常終了しています。

デタッチ/アタッチを調べることもできますが、バックアップの復元が望ましいです。

11
Randi Vertongen

あなたの状況では、いくつかの選択肢があります:

  1. データベースのデータを変更する可能性のあるアプリケーションをオフにする
  2. データベースをシングルユーザーモードで設定し、バックアップします。このようなもの:

ALTER DATABASE [<DBName>] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

BACKUP DATABASE [<DBName>] TO DISK = N'<locationAndFilename>'

次に、それを復元し、アプリを新しいサーバーにリダイレクトします

5
George K

私はあなたの状況を完全に理解していません。質問または既存の回答で言及されていないことがいくつかあります。

バックアップデータの取得中は、いかなる場合も変更しないでください。

どうして? -バックアップ中に行われた変更はすべてキャプチャされ、バックアップに含まれます。したがって、バックアップが完了するまでに2時間かかる場合、その2時間の間に行われたすべての変更がバックアップに含まれます。どちらも、バックアップが完了した時点で一致します。

(上記とは逆に)終了時刻ではなく開始時刻の時点で有効なバックアップが必要であると想定します。また、データベースをオフラインに設定するとのことですが、バックアップ中に誰もアクセスできなくても問題ないと思います。

サーバーにデータベースが1つしかない場合は、ジョブステップを使用してサーバーでのログインを無効にし、バックアップが完了したら再度有効にします。

 USE [master]
 EXEC asp_kill_user_connections [myDatabase] --This is sp that kills all user connects to a database, it is in house and I don't have the rights to share its code, but you can make your own. 

 USE master
 REVOKE CONNECT SQL TO [AD/SomeGroupAccount]
 ALTER LOGIN [SomeSQLAuthAccount] DISABLE
 GO

バックアップを行い、それが完了したら、再度アクセスできるようにします。

3
James Jenkins