web-dev-qa-db-fra.com

SQL Server 2008 R2 Restaurer copie_only pleine sauvegarde avec des journaux de transaction

Après avoir fait des recherches, je ne peux pas sembler trouver une réponse à cette question.

Contexte Je tente de configurer un plan de sauvegarde qui correspond aux trois exigences suivantes:

  1. Fiabilité des sauvegardes, ayant des sauvegardes pleines noctes
  2. Sauvegardes de journal de transaction qui pourraient être restaurées de
  3. Faible quantité d'espace disque utilisé
  4. Les sauvegardes doivent être accessibles localement pour un outil d'audit

Donc, pour répondre à ces besoins, je pense que les sauvegardes complètes hebdomadaires, différentielles quotidiennes et transactions horaires. Ensuite, chaque nuit, une sauvegarde de copy_only fonctionnerait qui peut être expédiée hors site, cette sauvegarde est terminée de manière à ce que la chaîne de journal ne soit pas cassée et que nous avons des sauvegardes complètes soigneusement fiables, sans avoir à manger autant d'espace de disque local.

La question est qu'il est possible de restaurer à partir de la sauvegarde de copy_only et de restaurer les journaux de transaction 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.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 assez nouveau à SQL Server et j'essaie d'apprendre comme je vais. Tout conseil/aide serait apprécié.

11
dv10t

Voici ce qui se passe lorsque les 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 un COPY_ONLY Sauvegarde pour restaurer des sauvegardes de journal supplémentaires. Ce que vous ne pouvez pas faire, c'est utiliser le COPY_ONLY Sauvegarde comme base différentielle. Cela signifie que vous ne serez pas en mesure de restaurer des sauvegardes différentielles sur la restaurée COPY_ONLY sauvegarde:

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 cela, 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 DBA expérimentés.

2
spaghettidba