SQL Server 2008 R2 Restaurer la sauvegarde complète COPY_ONLY avec les journaux de transactions


11

Après avoir fait quelques recherches, je n'arrive pas à trouver une réponse à cette question.

Contexte J'essaie de configurer un plan de sauvegarde qui répond aux trois exigences suivantes:

  1. Fiabilité des sauvegardes, ayant des sauvegardes complètes nocturnes
  2. Sauvegardes du journal des transactions pouvant être restaurées à partir de
  3. Faible espace disque utilisé
  4. Les sauvegardes doivent être accessibles localement pour un outil d'audit

Donc, pour répondre à ces besoins, je pense à des sauvegardes complètes hebdomadaires, différentielles quotidiennement et toutes les heures. Ensuite, chaque nuit, une sauvegarde copy_only s'exécute qui peut être expédiée hors site, cette sauvegarde est effectuée de manière à ce que la chaîne de journaux ne soit pas rompue, et nous avons des sauvegardes complètes fiables hors site, sans avoir à consommer autant d'espace disque local.

Question Est-il possible de restaurer à partir de la sauvegarde copy_only et de restaurer les journaux de transactions après.

Permettez-moi de donner un exemple pour que vous sachiez de quoi je parle.

En utilisant la liste ci-dessous, je me demande s'il est possible de restaurer FullbackupCOPY_ONLYC.bak suivi de TransactionbackupG.trn, TransactionbackupH.trn, enfin TransactionbackupI.trn

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
>     TransactionbackupI.trn 04/01/2013 03:00:00

Peut-être que toute cette configuration n'est pas raisonnable. Je suis relativement nouveau sur SQL Server et j'essaie d'apprendre au fur et à mesure. Tout conseil / aide serait apprécié.

Réponses:


14

Une sauvegarde complète dans SQL Server 2008 ne rompt pas la chaîne de journaux. Il réinitialise uniquement la base différentielle-lsn.

Vous pouvez également restaurer les sauvegardes de journaux après la restauration à partir d'une copie uniquement. Les démos de script suivantes qui:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

Il crée une base de données et une table et insère 50 lignes dans cette table. Entre ces insertions, plusieurs sauvegardes sont effectuées dans cet ordre:

  1. Plein
  2. Journal
  3. Plein
  4. Copie complète_Seulement
  5. Journal

Ensuite, la base de données est supprimée et restaurée comme ceci:

  1. 1er plein
  2. 1er journal
  3. 2e journal

Ce qui suit SELECTmontre que la restauration a réussi.

Cela montre que ni une COP_ONLYni une sauvegarde complète normale ne rompent la chaîne de journaux.

Ensuite, la base de données est à nouveau supprimée et restaurée comme ceci:

  1. Copy_Only Full
  2. 2e journal

Ensuite, le SELECTsuccès est à nouveau démontré.

Cela montre que vous pouvez utiliser une COPY_ONLYsauvegarde complète comme base de votre restauration de journal.

Essais différentiels

J'ai aussi créé une DIFFERENTIALversion:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_3' WITH DIFFERENTIAL,INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F1, D1, D2',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore FC, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F2, D2, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

Cela prend des sauvegardes dans cet ordre:

  1. 1er plein
  2. 1er différentiel
  3. 2e plein
  4. 2e différentiel
  5. Copy_Only Diff
  6. 3e différentiel

Il essaie ensuite cette route de restauration:

  1. 1er plein
  2. 1er différentiel
  3. 2e différentiel

L'étape 3 échoue avec cette erreur:

Msg 3136, Level 16, State 1, Line 4
This differential backup cannot be restored because the database has not been restored to the correct earlier state.

Cela montre qu'une sauvegarde complète normale rompt la chaîne différentielle.

Ensuite, la base de données est supprimée et ce flux de restauration est tenté:

  1. Copy_Only Full
  2. 3e différentiel

L'étape 2 échoue avec la même erreur que l'étape 3 ci-dessus. Cela montre qu'une copie de sauvegarde uniquement ne peut pas être utilisée comme base pour une restauration différentielle.

Ensuite, la base de données est à nouveau supprimée et la restauration suivante est exécutée:

  1. 2e plein
  2. 2e différentiel
  3. 3e différentiel

La sélection suivante prouve que cette restauration a réussi. Cela montre qu'une COPY_ONLYsauvegarde complète n'interrompt pas la chaîne différentielle.


Je cherchais des informations pour savoir si vous pouviez appliquer un journal des transactions à une sauvegarde complète copy_only. Ce sont vraiment de bonnes informations!
Brain2000

2

Voici ce qui se passe lorsque des différentiels sont impliqués:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 10 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 20 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 30 rows so far
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 40 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 50 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 60 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 70 rows so far
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO


USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70: log chain not broken
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70
GO
DROP DATABASE BakTst13;

En un mot: oui, vous pouvez utiliser une COPY_ONLYsauvegarde pour restaurer d'autres sauvegardes de journaux. Ce que vous ne pouvez pas faire, c'est utiliser la COPY_ONLYsauvegarde comme base différentielle. Cela signifie que vous ne pourrez pas restaurer de sauvegardes différentielles sur la COPY_ONLYsauvegarde restaurée :

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

Si vous essayez ceci, vous obtiendrez une erreur:

Processed 160 pages for database 'BakTst13', file 'BakTst13' on file 1.
Processed 2 pages for database 'BakTst13', file 'BakTst13_log' on file 1.
RESTORE DATABASE successfully processed 162 pages in 0.009 seconds (139.811 MB/sec).
Msg 3136, Level 16, State 1, Line 2
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

Les sauvegardes différentielles peuvent être difficiles à comprendre et peuvent tromper même les administrateurs de base de données expérimentés.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.