web-dev-qa-db-ja.com

SQLServerデータベースファイルグループのバックアップと復元

私はSQLサーバーを使用しており、複数のファイルグループに日付で分割された巨大なデータベースを持っています。データベースファイルグループはPRIMARY, FG2010, FG2011, FG2012, FG2013, and FG2014、そのFG2010、FG2011、FG2012、およびFG2013は読み取り専用です。

現在、バックアップシナリオは次のとおりです。

毎週金曜日の午前2時に完全バックアップを取得します

金曜日を除く毎週、午前2時に差分バックアップを取得します

このシナリオを次のように変更したいと思います。

データベースの完全バックアップを取得する(1回)

毎週金曜日の午前2時にPRIMARYとFG2014の完全バックアップを取得します

金曜日の午前2時を除く毎日PRIMARYとFG2014の差分バックアップを取得します

質問1:このシナリオはありますか?

私にも回復計画があります。毎日、バックアップファイルをジョブごとに別のサーバーに自動的にコピーしてから復元します。これは、回復テストの計画を立て、復元されたデータベースを開発者とテスターのユーザーに使用するためです。

復旧計画について、次のシナリオが必要です。

データベースの完全バックアップを復元します。

pRIMARYおよびFG2014の最後の完全バックアップを復元します。

pRIMARYとFG2014の最後の差分バックアップを復元します。

質問2:このシナリオを復旧計画に含めることはできますか?

質問3:バックアップと復元のシナリオを改善できますか?

[〜#〜] tsql [〜#〜]クエリで私の質問に答えてください。

12
mehdi lotfi

Q1。はい、できます。また、定期的なトランザクションログのバックアップを取る必要があります。

Q2。はい、これはリカバリ戦略でも機能します。ここでも、トランザクションログのバックアップを取る必要があります。

Q3。バックアップを使用して開発データベースを作成しているので、私はこれに固執します。ログ配布などのオプションがありますが、開発データベースを本番環境から更新し続けるためにそれらを実装することはしません。

ローカルインスタンスで提案したシナリオを実行するために使用できるデモスクリプトをいくつか作成しました。

スクリプトは次のようになります。-

  1. 一部が読み取り専用である複数のファイルグループを使用して、テストデータベースを作成します。
  2. テストデータベースのバックアップから開発データベースを作成します。
  3. テストデータベースのファイルグループバックアップを作成し、開発データベースに復元します

スクリプトを確認して実行してください。ご不明な点がございましたらお知らせください。

スクリプトを使用する前に、コンピュータに次のファイルパスがあることを確認してください。-

C:\SQLServer\Data
C:\SQLServer\Logs
C:\SQLServer\Backups

私が使用しているSQLServerのバージョンは、2012 SP2 CU2 DeveloperEditionです。

最初にテストデータベースを作成します:-

CREATE DATABASE [FGRestoreTEST]
 ON  PRIMARY 
( NAME = N'FGRestoreTEST', FILENAME = N'C:\SQLServer\Data\FGRestoreTEST.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2010] 
( NAME = N'FG2010', FILENAME = N'C:\SQLServer\Data\FG2010.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2011] 
( NAME = N'FG2011', FILENAME = N'C:\SQLServer\Data\FG2011.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2012] 
( NAME = N'FG2012', FILENAME = N'C:\SQLServer\Data\FG2012.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2013] 
( NAME = N'FG2013', FILENAME = N'C:\SQLServer\Data\FG2013.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2014] 
( NAME = N'FG2014', FILENAME = N'C:\SQLServer\Data\FG2014.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'FGRestoreTEST_log', FILENAME = N'C:\SQLServer\Logs\FGRestoreTEST_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

次に、各ファイルグループにテーブルを作成します。-

USE [FGRestoreTEST];
GO

CREATE TABLE [PRIMARY_TABLE]
(ID INT,
 NAME CHAR(4)) ON [PRIMARY];

CREATE TABLE [FG2010_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2010];

 CREATE TABLE [FG2011_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2011];

CREATE TABLE [FG2012_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2012];

CREATE TABLE [FG2013_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2013];

CREATE TABLE [FG2014_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2014];
 GO

各テーブルにデータ(100行)を挿入します:-

INSERT INTO [PRIMARY_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2010_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2011_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2012_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2013_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2014_TABLE]
SELECT 1, 'TEST'
GO 100

次に、特定のファイルグループを読み取り専用に設定します。-

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2010] READ_ONLY;

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2011] READ_ONLY;

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2012] READ_ONLY;

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2013] READ_ONLY;
GO

完全バックアップを取る:-

USE [master];
GO

BACKUP DATABASE [FGRestoreTEST]
TO DISK = N'C:\SQLServer\Backups\FGRestoreTEST.BAK';
GO

次に、完全バックアップから開発データベースを作成します(これは、次に実行されるファイルグループバックアップを復元するために使用されます):-

RESTORE DATABASE [FGRestoreTEST_Dev]
FROM DISK = N'C:\SQLServer\Backups\FGRestoreTEST.BAK' WITH
MOVE 'FGRestoreTEST' TO 'C:\SQLServer\Data\FGRestoreTEST_Dev.mdf',
MOVE 'FG2010' TO 'C:\SQLServer\Data\FG2010_Dev.ndf',
MOVE 'FG2011' TO 'C:\SQLServer\Data\FG2011_Dev.ndf',
MOVE 'FG2012' TO 'C:\SQLServer\Data\FG2012_Dev.ndf',
MOVE 'FG2013' TO 'C:\SQLServer\Data\FG2013_Dev.ndf',
MOVE 'FG2014' TO 'C:\SQLServer\Data\FG2014_Dev.ndf',
MOVE 'FGRestoreTEST_log' TO 'C:\SQLServer\Logs\FGRestoreTEST_Dev_log.ldf',
RECOVERY,STATS=5;
GO

各ファイルグループのバックアップを取ります:-

--http://msdn.Microsoft.com/en-us/library/ms189906.aspx
BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'PRIMARY'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_PRIMARY.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2010'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2010.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2011'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2011.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2012'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2012.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2013'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_G2013.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2014'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2014.bak';
GO

次に、プライマリファイルグループとFG2014ファイルグループのデータを変更します。-

USE [FGRestoreTEST];
GO

INSERT INTO [PRIMARY_TABLE]
SELECT 1, 'TEST'
GO 100

TRUNCATE TABLE [FG2014_TABLE];
GO

ファイルグループの差分バックアップを作成します。-

BACKUP DATABASE [FGRestoreTest]
   FILEGROUP = 'PRIMARY'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_PRIMARYDIFF.bak'
   WITH DIFFERENTIAL;

BACKUP DATABASE [FGRestoreTest]
   FILEGROUP = 'FG2014'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_FG2014DIFF.bak'
   WITH DIFFERENTIAL;
GO

繰り返しますが、データを変更します。-

USE [FGRestoreTEST];
GO

INSERT INTO [PRIMARY_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2014_TABLE]
SELECT 1, 'NEW'
GO 300

トランザクションログをバックアップします(実際の環境ではおそらくこれらが複数ありますが、デモの目的で1つだけ取っています):-

USE [master];
GO

BACKUP LOG [FGRestoreTEST]
TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_LogBackup.trn';
GO

これで、開発データベースを復元できます。まず、テールログのバックアップを取り、データベースをリカバリします。注:-このバックアップは使用しません!

BACKUP LOG [FGRestoreTEST_Dev]
TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_TailLogBackup.trn'
WITH NORECOVERY;
GO

これで、読み取り/書き込みファイルグループの完全バックアップを復元できます。-

--http://msdn.Microsoft.com/en-us/library/aa337540.aspx
--Restore primary filegroup
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'PRIMARY'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTEST_PRIMARY.bak'
   WITH NORECOVERY;
GO

--Restore FG2014 filegroup 
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'FG2014'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2014.bak'
   WITH NORECOVERY;
GO

次に、差分バックアップ:-

--Restore PRIMARY differential backup
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'PRIMARY'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTest_PRIMARYDIFF.bak'
   WITH NORECOVERY;
GO

--Restore FG2014 differential backup
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'FG2014'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTest_FG2014DIFF.bak'
   WITH NORECOVERY;
GO

次に、トランザクションログのバックアップ:-

RESTORE LOG [FGRestoreTEST_Dev]
FROM DISK = 'C:\SQLServer\Backups\FGRestoreTest_LogBackup.trn'
WITH NORECOVERY;
GO

最後に、データベースを回復できます。-

RESTORE DATABASE [FGRestoreTest_DEV] WITH RECOVERY;
GO

そして最後のテストとして、データを確認してください:-

USE [FGRestoreTEST_Dev];
GO

SELECT COUNT(*) AS [PRIMARY_TABLE]
FROM [PRIMARY_TABLE];

SELECT COUNT(*) AS [FG2010_TABLE]
FROM [FG2010_TABLE];

SELECT COUNT(*) AS [FG2011_TABLE]
FROM [FG2011_TABLE];

SELECT COUNT(*) AS [FG2012_TABLE]
FROM [FG2012_TABLE];

SELECT COUNT(*) AS [FG2013_TABLE]
FROM [FG2013_TABLE];

SELECT COUNT(*) AS [FG2014_TABLE]
FROM [FG2014_TABLE];

SELECT TOP (1) *
FROM [FG2014_TABLE];
GO

したがって、行われたデータの変更から、PRIMARYおよびFG2014ファイルグループに300レコード、残りの100レコード、およびFG2014の名前列のすべての値が「NEW」に設定されていることが予想されます。

15
dbafromthecold

A1:はい、このシナリオは可能ですが、バックアップ戦略では、必要に応じてFG2010から2013までを回復する継続的な方法は提供されません。データベースの完全バックアップは1回だけ存在します。

A2:はい、多少の調整が必要です。実装したいものはPiecemealRestoreと呼ばれ、必要なメソッドに必要な命令の大部分は、Books Onlineの例にあります。 一部のファイルグループのみのPiecemeal Restore

主な違いは、特定のファイルグループで問題が発生したライブデータベースではなく、以前に復元された完全なデータベースバックアップを復元することです。

上記のリファレンスを使用すると、ニーズに合ったテストケース/概念実証を簡単に作成できるはずです。行き詰まった場合は、質問に試行/コードを追加してください。ここの優れたコミュニティの章がガイダンスを提供します。あなたからの少しの努力とコミュニティからのいくつかの指示で、あなたはあなた自身の質問に答えることができると確信しています。男に魚とそのすべてを教える........

2
John Sansom