我有一个关于 SQL 备份的问题。我们有 3 台 SQK 服务器(A、B 和 C)。我正在从服务器 A 对数据库进行完整备份,并在服务器 B 上进行恢复。之后,我将从服务器 A 对同一数据库进行差异备份,以便在服务器 B 上进行恢复。
我的问题是,我是否可以在服务器 C 上恢复服务器 A 的数据库的初始完整备份,然后将服务器 B 的同一数据库的差异备份恢复到服务器 C 上?
我这样做的原因是,我们在 sServer B 上有一个存储问题,因此我们无法从服务器 B 对数据库进行完整备份,所以打算在服务器 C 中使用来自服务器 A 的完整备份,在服务器 C 中使用来自服务器 B 的差异备份。希望这不会造成混淆。
答案1
为了回答有关在恢复操作期间混合来自不同服务器的备份的问题,我创建了一个这样的实验室:
- SQLA(SQL 服务器 2014 (SP2-CU12))
- SQLB(SQL 服务器 2014 (SP2-CU12))
- SQLC(SQL 服务器 2014 (SP2-CU12))
创建了一个名为测试恢复在完整恢复模式和表测试以便稍后检查一些数据。
备份和恢复实验如下:
1. 在 SQLA 上执行
创建数据库并设置完全恢复模式
CREATE DATABASE TestRestore;
GO
ALTER DATABASE TestRestore SET RECOVERY FULL;
GO
连接到 TestRestore 数据库,创建一个表并插入一些数据
USE TestRestore;
CREATE TABLE tbTest(ID int);
INSERT INTO tbTest(ID) VALUES(1),(2),(3);
GO
备份数据库(完整备份)
BACKUP DATABASE TestRestore
TO DISK = '\\networkBackupShare\TestRestore_SQLA_FULL.bak';
GO
2. 在 SQLB 上执行
RESTORE DATABASE TestRestore
FROM DISK = '\\networkBackupShare\TestRestore_SQLA_FULL.bak'
WITH RECOVERY;
GO
在这里,我在进行 DIFF 备份之前向 SQLB 服务器上的表中插入了一些数据。
USE TestRestore;
INSERT INTO tbTest(ID) VALUES(4),(5),(6);
GO
BACKUP DATABASE TestRestore
TO DISK = '\\networkBackupShare\TestRestore_SQLB_DIFF.bak'
WITH DIFFERENTIAL;
GO
最后在进行 LOG 备份之前将最后一点数据插入到表中。
INSERT INTO tbTest(ID) VALUES(7),(8),(9);
GO
BACKUP LOG TestRestore
TO DISK = '\\networkBackupShare\TestRestore_SQLB_LOG.bak';
GO
3. 在 SQLC 上执行
现在让我们恢复我们的科学怪人,看看会发生什么:
RESTORE DATABASE TestRestore
FROM DISK = '\\networkBackupShare\TestRestore_SQLA_FULL.bak'
WITH NORECOVERY;
GO
RESTORE DATABASE TestRestore
FROM DISK = '\\networkBackupShare\TestRestore_SQLB_DIFF.bak'
WITH NORECOVERY;
GO
RESTORE LOG TestRestore
FROM DISK = '\\networkBackupShare\TestRestore_SQLB_LOG.bak'
WITH RECOVERY;
GO
有效!
结论:
是的,如果数据库来源相同,则可以混合来自不同服务器的备份文件。但要注意两个事实:
- 服务器 SQLC 上生成的数据库是 SQLB 的最后状态的副本,而不是 SQLA。
- 该实验之所以有效,是因为备份链没有被破坏(例如在进行 DIFF 和 LOG 备份之前对 SQLB 进行完整备份),否则您会收到如下消息: