Evi*_*lDr 7 sql-server backup restore transaction-log vss
这个问题可能读起来像是重复的,但是是基于情况的,并且是从应用其他答案中的知识的混淆中发布的。
我已经阅读了数十篇文章(在1、2、3、4 中),但我发现了相互矛盾的观点(根据我的理解,现在信息过载,或者我的其他问题中可能没有包含足够的信息)。因此,我创建这个问题是为了根据我的情况获得明确的答案。
鉴于以下备份场景,我需要知道第三方备份软件是否会阻止我执行完整恢复到最新备份点(18:00)?
Time | Action | Device
------|----------------------------------------------|----------------------------
12:00 | Full backup (non copy_only) | D:\MyBackupDevice
13:00 | Tran log backup (non copy_only) | D:\MyBackupDevice
14:00 | Tran log backup (non copy_only) | D:\MyBackupDevice
15:00 | Tran log backup (non copy_only) | D:\MyBackupDevice
16:00 | Full backup (non copy_only) VSS snapshot | Third-party off-site device
17:00 | Tran log backup (non copy_only) | D:\MyBackupDevice
18:00 | Tran log backup (non copy_only) | D:\MyBackupDevice
19:00 | Disaster strikes |
Run Code Online (Sandbox Code Playgroud)
我的恢复目标是恢复到 18:00 备份的点(我知道也可以添加一个尾日志备份,以便在灾难发生之前获得剩余的事务,但现在让我们保持简单) .
基于此答案,我认为第三方备份会导致与我自己的事务日志还原发生冲突(根据此答案),这会阻止我执行还原到该点。我的理解是事务日志备份包含自上次完全非 copy_only 备份以来的数据。
这样对吗?第三方备份是否会阻止我自己的还原例程工作,因为它是非 copy_only 备份?
也许这会帮助你理解。让我们做一个演示!我们将使用一些虚拟数据创建一个虚拟数据库。
USE master;
/*Create a dummy database*/
CREATE DATABASE LogRestoreTest
/*We full now*/
ALTER DATABASE LogRestoreTest SET RECOVERY FULL
/*Context is everything*/
USE LogRestoreTest
/*If nothing changes, do we even need a log backup?*/
CREATE TABLE dbo.t1 (Id INT)
Run Code Online (Sandbox Code Playgroud)
现在我们将进行一次完整备份。只有一个。承诺。
/*Take a full backup, dummy*/
BACKUP DATABASE LogRestoreTest
TO DISK = 'F:\Backup\LRT_FULL.bak'
WITH INIT, FORMAT, COMPRESSION
Run Code Online (Sandbox Code Playgroud)
现在我们将进行一些更改并进行一些日志备份。就像现实生活一样。好有趣。还没喝。
/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )
/*Take a log backup*/
BACKUP LOG LogRestoreTest
TO DISK = 'F:\Backup\LRT_LOG_1.trn'
WITH INIT, FORMAT, COMPRESSION
/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )
/*Take another log backup*/
BACKUP LOG LogRestoreTest
TO DISK = 'F:\Backup\LRT_LOG_2.trn'
WITH INIT, FORMAT, COMPRESSION
/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )
Run Code Online (Sandbox Code Playgroud)
现在我们将进行“带外”完整备份和另一个日志备份。
/*A second full backup appears!*/
BACKUP DATABASE LogRestoreTest
TO DISK = 'F:\Backup\LRT_FULL_2.bak'
WITH INIT, FORMAT, COMPRESSION
/*Take another log backup*/
BACKUP LOG LogRestoreTest
TO DISK = 'F:\Backup\LRT_LOG_3.trn'
WITH INIT, FORMAT, COMPRESSION
Run Code Online (Sandbox Code Playgroud)
如果我想将数据恢复到第三个日志备份,我有两个选择。
恢复第一个完整备份和所有三个日志备份:
/*Restore the full backup*/
RESTORE DATABASE LogRestoreTest
FROM DISK = 'F:\Backup\LRT_FULL.bak'
WITH REPLACE, NORECOVERY
/*Square one*/
RESTORE DATABASE LogRestoreTest
FROM DISK = 'F:\Backup\LRT_LOG_1.trn'
WITH NORECOVERY
/*What about to here?*/
RESTORE DATABASE LogRestoreTest
FROM DISK = 'F:\Backup\LRT_LOG_2.trn'
WITH NORECOVERY
/*Obligatory Your Mom*/
RESTORE DATABASE LogRestoreTest
FROM DISK = 'F:\Backup\LRT_LOG_3.trn'
WITH NORECOVERY
Run Code Online (Sandbox Code Playgroud)
或者我可以恢复最近的完整日志文件,然后是最终的日志文件:
/*Restore the full backup*/
RESTORE DATABASE LogRestoreTest
FROM DISK = 'F:\Backup\LRT_FULL_2.bak'
WITH REPLACE, NORECOVERY
/*What happens if I try to jump the restores?*/
RESTORE DATABASE LogRestoreTest
FROM DISK = 'F:\Backup\LRT_LOG_3.trn'
WITH NORECOVERY
Run Code Online (Sandbox Code Playgroud)
请原谅我没有在这里解释差异备份,但是有很多资源可以涵盖 DBA 101 资料。
希望这可以帮助!
小智 7
在您之前的问题中,您说:
...发现该工具使用了非
copy_only
备份,从而破坏了日志链
一个FULL
备份从未打破日志链。
非COPY_ONLY
FULL
备份只是重置差异基础(DIFFERENTIAL
备份的参考点)。
所以,没有的16:00 | Full backup (non copy_only) VSS snapshot
就不会阻止你成功地执行以下恢复顺序:
12:00 | Full backup (non copy_only)
13:00 | Tran log backup (non copy_only)
14:00 | Tran log backup (non copy_only)
15:00 | Tran log backup (non copy_only)
17:00 | Tran log backup (non copy_only)
18:00 | Tran log backup (non copy_only)
这里有一个使用非最新FULL
备份的示例还原序列:
一个LOG
备份包含自上次数据LOG
备份。FULL
并且DIFFERENTIAL
备份不会截断日志。
在完整恢复模型或大容量日志恢复模型下,如果自上次备份以来发生了检查点,则在日志备份之后会发生截断(除非它是仅复制日志备份)。