澳门金沙vip 3

SqlServer备份恢复

总结

不好的备份策略,可能导致灾难性的后果。
相反好的备份策略可以让我们高枕无忧。看到这里的小伙伴们赶紧去检查下,自家的备份做好了吗?否则请自习下面武功秘籍:

澳门金沙vip 1

 

将数据库还原到指定时间点

 

在完整恢复模式下,完整的数据库还原通常可恢复到日志备份中的某个时间点、标记的事务或
LSN。 但是,在大容量日志恢复模式下,如果日志备份包含大容量更改,则不能进行时点恢复。

时点还原方案示例

下例假定针对一个关键任务型数据库系统,每天午夜创建一个完整数据库备份;从星期一到星期六,每小时创建一个差异数据库备份;全天每
10 分钟创建一个事务日志备份。 若要将数据库还原到星期三凌晨 5:19 的状态, 请执行以下操作:

  1. 还原星期二午夜创建的完整数据库备份。

  2. 还原星期四凌晨 5:00
    创建的差异数据库 备份。

  3. 应用星期四凌晨
    5:10创建的事务日志 备份。

  4. 应用星期三凌晨 5:20
    创建的事务日志 备份,指定恢复进程仅应用到凌晨 5:19
    之前发生的事务。

    或者,如果需要将数据库还原到它在星期四凌晨
    3:04 的状态, 而在星期四凌晨 3:00
    创建的差异数据库备份已不可用, 则执行下列操作:

  5. 还原在星期三午夜创建的数据库备份。

  6. 还原星期四凌晨 2:00
    创建的差异数据库 备份。

  7. 应用从星期四凌晨 2:10 到 3:00
    创建的所有事务 日志 备份。

  8. 应用星期四凌晨 3:10
    创建的事务日志 备份,停止凌晨 3:04
    的恢复进程。

 

概述

 

昨天下午突然看到,《炉石传说》游戏数据库发生宕机并引发数据丢失事故的新闻。刚看到时,满满的不可思议。暴雪啊,网易啊。

都是很牛叉的公司。他们出的游戏我都是很喜欢的。

澳门金沙vip 2

 

 当我看到,第一时间着手抢修,重启服务器,并尝试数据恢复时,我的想法是他们的高可用方案呢?为什么不马上切换?

当我看到相关备份数据库也出现故障时,就更无语了。其实这样的事情在我们的客户每年都会遇到很多。前不久就有一个医院,
数据库和备份都同时损坏,而且没有高可用的方案。

虽然最终帮他们修复了好数据库,但还是丢失部分数据,而且中间1天时间,业务都是手动操作,严重影响业务。

对于炉石这样的大公司,对应的方案应该是做得很全的,本次事故也可能是有其他的原因。

 

备份

分析

这个原因暂且不论,当遇到同样的问题时,相关的运维和DBA都是很绝望的。总结下上面的问题:

1.缺乏高可用方案

2.制定更好的备份的策略

 

仅复制备份

 仅复制备份
是独立于常规 SQL Server 备份序列的 SQL Server 备份。 通常,进行备份会更改数据库并影响其后备份的还原方式。 但是,有时在不影响数据库总体备份和还原过程的情况下,为特殊目的而进行备份还是有用的。 仅复制备份就是用于此目的。

 

 

备份方式

首先,恢复模式强烈建议使用完整模式。为了保证数据库损坏时,能最快速度恢复业务。

1.每周全备  

2.每天差异

3.每半小时日志

备份的频率根据具体的业务情况可自行调整。

 

日志备份

 

 

 

备份的位置

1.本地的备份,澳门金沙vip,放置于和数据库文件不同的物理磁盘

2.异机备份。使用自动同步软件实时把备份同步到专门的NAS

3.异地备份(可选)

 

 

完整数据库还原(完整恢复模式)

将数据库还原到故障点

 

通常,将数据库恢复到故障点分为下列基本步骤:

  1. 备份活动事务日志(称为日志尾部)。 此操作将创建结尾日志备份。 如果活动事务日志不可用,则该日志部分的所有事务都将丢失。

    重要

    在大容量日志恢复模式下,备份任何包含大容量日志操作的日志都需要访问数据库中的所有数据文件。 如果无法访问该数据文件,则不能备份事务日志。 在这种情况下,您必须手动重做自最近备份日志以来所做的所有更改。

    有关详细信息,请参阅结尾日志备份 (SQL
    Server)。

  2. 还原最新完整数据库备份而不恢复数据库
    (RESTORE DATABASE database_name FROM backup_device WITH
    NORECOVERY)。

  3. 如果存在差异备份,则还原最新的差异备份而不恢复数据库
    (RESTORE
    DATABASE database_name FROM differential_backup_device WITH
    NORECOVERY).。

    还原最新差异备份可减少必须还原的日志备份数。

  4. 从还原备份后创建的第一个事务日志备份开始,使用
    NORECOVERY 依次还原日志。

  5. 恢复数据库
    (RESTORE DATABASE database_name WITH RECOVERY)。 此步骤也可以与还原上一次日志备份结合使用。

    下图说明此还原顺序。 故障发生后 (1),将创建结尾日志备份
    (2)。 接着,将数据库还原到该故障点。 这涉及到还原数据库备份、后续差异备份以及在差异备份后执行的每个日志备份,包括结尾日志备份。

    澳门金沙vip 3

报警

备份有可能因为各种原因而失败,比如备份磁盘的空间满了,等数据库损坏的时候,突然发现备份任务失败了,再完美备份策略
百搭。所以对备份任务,增加邮件报警机制,如果备份失败了,可以第一时间知道并解决。

 

例如 ( Transact-SQL)

下面的示例说明了如何使用 WITH FORMAT
覆盖任意现有备份并创建新介质集,从而创建一个完整数据库备份。 然后,此示例将备份事务日志。 在现实情况下,您必须执行一系列的定期日志备份。 在此示例中, AdventureWorks2012 示例数据库设置为使用完整恢复模式。

USE master;
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO
— Back up the AdventureWorks2012 database to new media set (backup set
1).

BACKUP DATABASE AdventureWorks2012
TO DISK = ‘Z:\SQLServerBackups\AdventureWorks2012FullRM.bak’
WITH FORMAT;
GO
–Create a routine log backup (backup set 2).
BACKUP LOG AdventureWorks2012 TO DISK =
‘Z:\SQLServerBackups\AdventureWorks2012FullRM.bak’;

GO

* *

解决

 有小伙伴提到高可用性,这里没有写。主要高可用
方案太多,在一篇文章难以说清楚,所以本文先给出备份的解决方案。

下面给出我之前给某外企制定的备份策略,可以解决上面提到的备份的问题。小伙伴们可以参考下:

基本 TRANSACT-SQL RESTORE 语法

上图中还原顺序的基本 RESTORE Transact-SQL 语法如下:

  1. RESTORE DATABASE database FROM full
    database backup
     WITH NORECOVERY;

  2. RESTORE
    DATABASE database FROM full_differential_backup WITH
    NORECOVERY;

  3. RESTORE
    LOG database FROM log_backup WITH NORECOVERY;

    对于其他每个日志备份,重复此还原日志步骤。

  4. RESTORE DATABASE database WITH
    RECOVERY;

 

 

示例:恢复到故障点 (Transact-SQL)

以下 Transact-SQL 示例显示了将数据库还原到故障点的还原顺序中的基本选项。 此示例将创建数据库的结尾日志备份。 接下来,此示例将还原完整数据库备份和日志备份,然后还原结尾日志备份。 此示例将在最后的单独步骤中恢复数据库。

USE master;
–Create tail-log backup.
BACKUP LOG AdventureWorks2012
TO DISK = ‘Z:\SQLServerBackups\AdventureWorksFullRM.bak’
WITH NORECOVERY;
GO
–Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks2012
FROM DISK = ‘Z:\SQLServerBackups\AdventureWorksFullRM.bak’
WITH FILE=1,
NORECOVERY;

–Restore the regular log backup (from backup set 2).
RESTORE LOG AdventureWorks2012
FROM DISK = ‘Z:\SQLServerBackups\AdventureWorksFullRM.bak’
WITH FILE=2,
NORECOVERY;

–Restore the tail-log backup (from backup set 3).
RESTORE LOG AdventureWorks2012
FROM DISK = ‘Z:\SQLServerBackups\AdventureWorksFullRM.bak’
WITH FILE=3,
NORECOVERY;
GO
–recover the database:
RESTORE DATABASE AdventureWorks2012 WITH RECOVERY;
GO

 

 

备份的选项

到目前为止我们的备份策略看上去很完美了。可事实是这样的吗?答案是否定的。

我们做好了看似完美的备份。但是如果我们的数据库本身已经存在页损坏,那么我们的做再多备份也是徒劳。因为备份的文件也是损坏的。

那我们如何解决呢?最好的方法就是定期还原备份,然后立即运行DBCC
CHECKDB。如果当时条件不允许持续还原和检查,那么使用RESTORE
VERIFYONLY命令就是你另一个最好的选择了。但是RESTORE
VERIFYONLY并不是单独使用的。它必须配合WITH CHECKSUM.意思就是,在BACKUP
的使用使用WITH CHECKSUM 参数,然后定期对备份的文件运行RESTORE VERIFYONLY
来验证备份文件的有效性。如果数据库中的某些页面损坏,使用WITH CHECKSUM
去备份的作业会马上失败。这可以让我们第一时间发现数据库页损坏的问题。

举个栗子:

BACKUP DATABASE AdventureWorks TO DISK =
‘G:/backups/AdventureWorks_full.bak’ WITH CHECKSUM

假如你更改文件数据备份文件,然后在那个文件上运行RESTORE
VERIFYONLY的话,会产生如下提示:

Server: Msg 3189, Level 16, State 1, Line 1 
Damage to the backup set was detected. 

Server: Msg 3013, Level 16, State 1, Line 1 
VERIFY DATABASE is terminating abnormally.

设备 ‘d:\tttttt.bak’ 上的介质簇的结构不正确。SQL Server
无法处理此介质簇。

差异备份

差异备份所基于的是最近一次的完整数据备份。 差异备份仅捕获自该次完整备份后发生更改的数据。 差异备份所基于的完整备份称为差异的“基准”
。 完整备份(仅复制备份除外)可以用作一系列差异备份的基准,包括数据库备份、部分备份和文件备份。 文件差异备份的基准备份可以包含在完整备份、文件备份或部分备份中。

优点

  • 与创建完整备份相比,创建差异备份的速度可能非常快。 差异备份只记录自差异备份所基于的完整备份后更改的数据。 这有助于频繁地进行数据备份,减少数据丢失的风险。 但是,在还原差异备份之前,必须先还原其基准。 因此,从差异备份进行还原必然要比从完整备份进行还原需要更多的步骤和时间,因为这需要两个备份文件。

  • 如果数据库的某个子集比该数据库的其余部分修改得更为频繁,则差异数据库备份特别有用。 在这些情况下,使用差异数据库备份,您可以频繁执行备份,并且不会产生完整数据库备份的开销。

  • 在完整恢复模式下,使用差异备份可以减少必须还原的日志备份的数量。

 

 

 

完整数据库还原(简单恢复模式) 

 

数据库完整还原的目的是还原整个数据库。 整个数据库在还原期间处于脱机状态。 在数据库的任何部分变为联机之前,必须将所有数据恢复到同一点,即数据库的所有部分都处于同一时间点并且不存在未提交的事务。

在简单恢复模式下,数据库不能还原到特定备份中的特定时间点。

用于还原完整数据库备份的基本 Transact-SQLRESTORE 语法是:

RESTORE
DATABASE database_name FROM backup_device [ WITH NORECOVERY
]

示例
(Transact-SQL)

以下示例首先显示如何使用 BACKUP 语句来创建 AdventureWorks2012 数据库的完整数据库备份和差异数据库备份。 然后按顺序还原这些备份。 将数据库还原到完成差异数据库备份时的状态。

该示例说明数据库完整还原方案的还原序列中的关键选项。 还原顺序 由通过一个或多个还原阶段来移动数据的一个或多个还原操作组成。 将省略与此目的不相关的语法和详细信息。 在恢复数据库时,尽管 RECOVERY
选项是默认值,但为清楚起见,仍建议显式指定该选项。

USE master;
–Make sure the database is using the simple recovery model.
ALTER DATABASE AdventureWorks2012 SET RECOVERY SIMPLE;
GO
— Back up the full AdventureWorks2012 database.
BACKUP DATABASE AdventureWorks2012
TO DISK = ‘Z:\SQLServerBackups\AdventureWorks2012.bak’
WITH FORMAT;
GO
–Create a differential database backup.
BACKUP DATABASE AdventureWorks2012
TO DISK = ‘Z:\SQLServerBackups\AdventureWorks2012.bak’
WITH DIFFERENTIAL;
GO
–Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks2012
FROM DISK = ‘Z:\SQLServerBackups\AdventureWorks2012.bak’
WITH FILE=1, NORECOVERY;
–Restore the differential backup (from backup set 2).
RESTORE DATABASE AdventureWorks2012
FROM DISK = ‘Z:\SQLServerBackups\AdventureWorks2012.bak’
WITH FILE=2, RECOVERY;
GO