首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >差异备份问题-为什么?这个是可能的吗?

差异备份问题-为什么?这个是可能的吗?
EN

Database Administration用户
提问于 2017-07-28 01:35:00
回答 1查看 1.5K关注 0票数 13

我使用的是SQL Server 2014,情况如下:

  • 我有服务器A和服务器B。
  • 在服务器A上处理通宵ETL。
  • 加载过程完成后,数据库X得到备份(使用CHECKSUMRESTORE VERIFYONLY以确保可靠性),然后发送到服务器B。
  • 服务器B接收bak文件,然后在那里还原数据库。

我想使用差异备份策略,以便:

  1. 只在星期六上进行完全备份,即星期六->船上服务器A上的完全备份,->恢复服务器B上的完全备份
  2. 剩下的日子将是差异备份,即服务器A上的差异备份,从->船到服务器B,->恢复服务器B上的差异备份

我试过了,但我犯了一个错误,我说:

日志或差异备份无法还原,因为没有准备前滚的文件。

不知道为什么。我在服务器A和服务器B上检查了sys.database_files,我可以看到differential_Base_LSNdifferential_base_GUID是相同的。有什么地方/有什么要检查的吗?

顺便问一下,在上面的步骤2中,当我在服务器B上恢复diff备份时,每次都需要恢复完全备份+差异备份吗?

我只还原了差异备份WITH RECOVERY (并得到了该错误消息),因为完整备份已于前一天恢复。

为了澄清:是的,我希望服务器B上的数据库在差异之间是可读的。我怎么才能绕开呢?每晚RESTORE FULL (WITH NORECOVERY) + RESTORE DIFF (WITH RECOVERY)组合序列是我唯一的选择吗?

如有任何指导,将不胜感激。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-07-28 02:46:30

这里不需要处理RECOVERYNORECOVERY,只需要使用STANDBY选项。这里有一个关于如何使用它的快速演示。

创建一个数据库,将其设置为简单恢复,并创建一个表。

插入数据,进行一些不同。

有趣,对吧?

代码语言:javascript
复制
USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

是啊,我撒谎了。这才是无聊的地方。

您可以在STANDBY中还原您的完整备份:

代码语言:javascript
复制
/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

您可以按照STANDBY的顺序恢复差异:

代码语言:javascript
复制
/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

与那些烦人的日志文件不同,您也可以在恢复差异时跳过:

代码语言:javascript
复制
/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

如果您想测试可读性,只需在还原命令之间运行此命令即可。您应该看到ID与每个ID的增量。如果你不这样做,你做了一些可怕的错误。

请记住,当您还原文件时,它会将任何最终用户踢出数据库,并且不会等待他们的查询完成。

这也使数据库处于只读状态,此处不能进行任何更改。

代码语言:javascript
复制
SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

最后,自己收拾一下。

代码语言:javascript
复制
/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

希望这能帮上忙!

票数 15
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/182043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档