9.灾难预防和恢复

Posted zhouwansheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.灾难预防和恢复相关的知识,希望对你有一定的参考价值。

“每位数据库管理员都有两样东西不可或缺。第一样是一个有效的备份-还原计划。第
二样是最新的简历。如果有了备份-还原计划,那么可能永远不需要准备一份最新简历;但
是如果没有备份-还原计划的话,早晚都需要用最新的简历去另外找一份工作。”我给听我
演讲的每一位数据库管理员都说过这番话,而听过我演讲的数据库管理员非常多。磁盘故
障,然后数据损坏,这是一个不可避免的事实。我们都可能遭受过某种形式的数据丢失,
其实如果进行了适当的数据备份,这些都是可以预防的。作为负责组织数据的稳定性和完
整性的个人,数据库管理员必须认真细致地规划一个数据库备份策略,以便在设备故障、
用户错误、或有人故意损坏数据的情况下,数据库可以在很短时间内恢复工作,数据丢失
也会尽可能地少。
本章讨论数据库备份和恢复机制,并额外介绍了一些策略。本章并不会给出具体建议,
因为没有一个通用的建议可以适用于每一种情况。数据库管理员应该研究所有可能的备份
和恢复操作,并由此提出一项可以防止数据丢失和减少停机时间的计划。组织成功与否可
能取决于数据库管理员的努力。这是-个相当重大的责任,但随着越来越多的商业应用程
序构建于SQL Server之上,这又是一?个非常现实的责任。所以,准备好学习有关灾难预防 和恢复的所有知识,确保不会因为数据丢失而受到指责。
9.1 准 备 SmallWorks数据库
AdventureWorks2008数据库是一个很大的示例数据库。为了减少实践本章中的示例所 需的时间和磁盘空间,首先将创建一个较小版本的AdventureWorks2008。下面的脚本创建 了一个叫做SmallWorks的数据库,它由一个主文件组和两个附加文件组组成,每个文件组 中各有一个数据文件。然后在每个文件组中创建了一个表,并使用AdventureWorks2008数 据库的数据进行填充。该脚本的敁后?个操作是在第二个用户定义文件组上设置只读属性。
该脚本假定存在C:SQLData路径。
CREATE DATABASE SmallWorks ON PRIMARY ( NAME =*SmallWorksPrimary’ , FILENAME = * C :SQLDataSmallWorks.mdf , SIZE =10MB
, FILEGROWTH =20%
? MAXSIZE =50MB)

, FILEGROUP SWUserDatal ( NAME =?SmallWorksDatal1 , FILENAME = * C :SQLDataSmallWorksDatal.ndf‘
z
SIZE =10MB
, FILEGROWTH =20%
, MAXSIZE =50MB)
? FILEGROUP SWUserData2 ( NAME =‘SmallWorksData2‘ , FILENAME =‘C:SQLDataSmallWorksData2.ndf1 , SIZE =10MB
, FILEGROWTH =20%
, MAXSIZE =50MB)
LOG ON
( NAME = 1SmallWorks_log‘ , FILENAME = ‘C :SQLDataSmallWorks_log.ldf1 , SIZE =10MB
r
FILEGROWTH =10%
? MAXSIZE =20MB)
GO
USE SmallWorks GO
ALTER DATABASE SmallWorks MODIFY FILEGROUP SWUserDatal DEFAULT
GO
CREATE TABLE dbo.Person( PersonlD int NOT NULL , FirstName varchar(50) NOT NULL , MiddleName varchar(50) NULL , LastName varchar(50> NOT NULL , EmailAddress nvarchar(50) NULL ) ON SWUserDatal
CREATE TABLE dbo.Product( ProductID int NOT NULL , ProductName varchar (75) NOT NULL , ProductNumber nvarchar(25) NOT NULL , StandardCost money NOT NULL , ListPrice money NOT NULL ) ON SWUserData2 INSERT dbo.Person (PersonlD, FirstName, MiddleName, LastName, EmailAddress) SELECT DISTINCT TOP 5000
P.BusinessEntitylD , P.FirstName , P.MiddleName , P.LastName , LOWER(P.FirstName +?? ‘ +P.LastName + * Qadventureworks.com1> FROM AdventureWorks20C8.Person.Person P

INNER JOIN AdventureWorks2008.Person.EmailAddress E ON P.BusinessEntitylD =P.BusinessEntitylD WHERE P.FirstName NOT LIKE *%.%? ORDER BY P .BusinessEntitylD
INSERT dbo.Product (ProductID, ProductName, ProductNumber, StandardCost, ListPrice) SELECT ProductID , Name , ProductNumber , StandardCost , ListPrice FROM AdventureWorks2008.Production.Product
ALTER DATABASE SmallWorks MODIFY FILEGROUP SWUserData2 READONLY
9 .2 数据库恢复模式
SQL Server有 3 种可用的恢复模式。不过只有两个是经常使用的:简单和完整恢复模 式。第三种恢复模式,即大容量日志恢复模式,是完整恢复模式的附加模式。每种恢复模
式各有其优缺点。因此对每一个模式有一个全面的认识是相当关键的,这样就能够明智而
适当地决定对每个数据库执行哪种恢复模式。恢复模式会改变事务日志的行为、可执行的
备份以及数据的恢复方式。
9 .2 .1 完整恢复模式
在完整恢复模式中,所有影响数据库的活动都以某种方式记录在事务日志中。有些事
件是按最小方式记录的,如 TRUNCATE TABLE命令,它完全清除一个表的内容。在执行
TRUNCATE TABLE命令时,SQL Server仅记录受截断影响的数据页的解除分配。然而, 所有常规数据库活动都是完全记录的,包括重新生成索引、大容量复制、SELECT INTO、
BULK INSERT和 BLOB更新。完全记录的好处在于一旦出现故障,每一个事务都可以恢
复。您永远不必担心由于数据文件丢失导致事务丢失。如果实际事务日志丢失,那么自最
后一个检査点之后的所有事务曰志都会丢失。
完整恢复模式的优点也是缺点:几乎所有影响数据库的事情都会完整记录。因此,事
务曰志很快会被填满。如果将其设置为自动增长,它也会很快变得非常庞大。当把数据库
设置为使用完整恢复模式时,则必须开发并实现一个定期备份事务日志的有效计划。备份
事务日志将清空所有旧的事务,为新的事务腾出空间。
在完整恢复模式中,事务曰志包含自敁近一次BACKUP LOG事件之后对数据库做出
的所有修改的记录,因而可以用来恢复那些事务,本章稍后将讨论这个主题。
9 .2 .2 大容量日志恢复模式
如前所述,大容量日志恢复模式是完整恢复模式的附加模式。有时,完整恢复模式的

完全记录行为会降低性能,并会导致不可接受的日志文件增长。在这些情况下,可以把恢
复模式配置更改为大容量日志恢复模式,将数据库配置为按最小方式记录大容量操作。在
大容量日志恢复模式中,下列数据库操作是按最小化方式记录的:
? 创建索引
? 重新生成索引
? 大容量复制操作
? BULK INSERT
? SELECT INTO
? BLOB操作
按最小方式记录意味着列出的操作都被记录为已发生的,但受影响的单独行不会被记
录下来。除了操作记录被记录下来之外,由操作分配或受操作影响的物理区的记录也都被
记录在事务日志中。在下一个BACKUP LOG事件中,受影响的物理区被复制到日志备份
中。大容量日志恢复模式通过按最小方式记录数据密集型操作,使得日志比较小,但日志
备份实际上比较大。因为日志备份依赖于日志备份时未改动的物理数据,所以如果磁盘损
坏或不可用,日志备份就会失败。
在大容量日志恢复模式中,事务日志记录所有对数据库做出的完全记录的修改,以及
自最近一次BACKUP LOG事件以来被按最小方式记录的操作修改的区。和完整恢复模式
中的事务日志一样,在数据库出现故障时,大稃量日志恢复模式中的事务日志可用于还原
事务。
9 .2 .3 简 单 恢 复 模 式
在简单恢复模式下,日志的不活动部分会在每次SQL Server发出一个检査点时被截断。 正如第4 章所述,SQL Server会定期发出检査点,使得恢复一个数据库所需的时间降低到 最少。基本上,日志的不活动部分就是从最早打开的事务开始到日志末尾的部分。
简单恢复模式的好处是降低了事务日志管理的管理开销。因为日志的不活动部分基
本上在每个检査点后都会被清除,所以妥善规划的日志将永远不会增长,也不需要加以管理。
不 过 ,这 种 事 务日志不能备份并用于数据恢复,因为它没有完整记录所有修改数据库的事务。
9.3 SQL Server 2008 数据库备份
多年以来,我一直觉得SQL Server备份最好的地方在于其备份软件是免费的。然而,除 了这一点外,SQL Server备份并未在大多数企业数据库管理员所需的性能和灵活性方面提供 多少好处。由于存 在 这 *缺点,一些第三方软件供应商开发了优秀的备份软件,使得备份SQL
Server数据库的速度要比SQL Server本身的备份软件快10倍,与此同时还能压缩和加密备份。 随 着 SQL Server 2008的发布,Microsoft对其备份系统做了重大改进,使其为数裾库备份操作 添加了一些令人兴奋的新功能。首先是SQL Server 2008备份比之前的版本要快。更令人印象 深刻的是,SQL Server还提供了压缩备份的功能,而压缩的备份甚至要快于未压缩的备份。
在 我 的 SQL Server 2008副本中,使用压缩备份AdventureWorks2008数据库用时6 秒 ,而不

使用压缩备份时却使用了 9 秒。SQL Server 2008还提供了加密备份的功能。 SQL Server 2008的备份吋以在进行正常的数据库活动时执行。其间不需耍断开用户或 关闭任何服务。备份可以发送到磁盘或磁带上。要将备份发送到磁带上,磁带设备必须本
地附加在数据库服务器上。通过使用第三方产品或把磁带设备安装在一个SAN(它将驱动
器作为 一 个 逻辑磁盘设备使用)上可以克服这一限制。
目标磁盘用一个物理地址或统一命名约定(Universal Naming Convention, UNC)位置标
识,如下例所示:
--Full database backup of SmallWorks to a drive location BACKUP DATABASE SmallWorks TO DISK =‘D:SQLBackupsFullSmallWorks.BAK* WITH DESCRIPTION =?SmallWorks DB Full Backup‘ --Full database backup of SmallWorks to a UNC location BACKUP DATABASE SmallWorks TO DISK = 1\\AUGHTEIGHTSQLBackupsFullSmallWorks.BAK * WITH DESCRIPTION =*SmallWorks DB Full Backup*
备份设备
磁带或磁盘位置可以映射到一个备份设备。备份设备是磁盘或磁带位置的一个别名。
备 份 设 备 唯 一 真 正的好处是使备份命令的语法更加简单。然而,由于创建的备份设备通常
用于保存很多备份,所以设备的名称通常不像希望的那样具有较强的描述性。
下面的示例显示了如何创建-个备份设备,并把master数据库备份到其中:
—— Create a device for backups of the master database sp_addumpdevice * Disk * , *MasterDBBackups‘ , ’D:SQLBackupsmasterDB.Backups.BAK‘ —— Backup the master database to the new device BACKUP DATABASE master TO MasterDBBackups WITH DESCRIPTION =?Master DB Full Backup‘
也可以通过图形化方式创建备份设备,方法是展开SQL Server Management Studio的
“对象资源管理器”中的“服务器对象”节点,右击“备份设备”文件夹,然后选择“新
建备份设备”命令。

SQL Server数据库备份
不管执行的数据库备份是何种类型,SQL Server都会执行如下操作: ? 在事务日志中记录BACKUP语句。
? 发出一个检査点,把所有未完成的脏缓冲页写入磁盘。
? 把 FULL、DIFFERENTIAL、FILE或 FILEGROUP备份选项指定的所有数据页写
入备份媒体。
? 把记录在事务日志中的、备份过程中发生的所有数据修改写入备份媒体。

在事务日志中记录备份的完成。
在 SQL Server Management Studio中执行如下命令备份master数据库:
--Full database backup of the master database BACKUP DATABASE master TO DISK = ? D:SQLBackupsFullMaster.BAK1 WITH DESCRIPTION = ‘MASTER DB FULL Backup‘
该脚本执行了 master数据库的完整数据库备份。它假设存在一个D 磁盘和一个名为 SQLBackups的文件夹。这个备份命令将创建指定的文件,但不会创建文件夹。 也 可以使用Management Studio提供的图形化工具进行数据库备份。要获得与前面脚 本相同的结果,可以执行如下步骤:
(1) 依 次 展 开 Management Studio的 “对象资源管理器”中 的 “数据库” | “系统数据库” 节点。
(2) 右 击 master数据库,选 择 “任务” I “备份”命令,打 开 “备份数据库”对话框(如 图 9-1所示)。

技术分享图片

(3) 单 击 “删除”按钮删除默认备份位置。
(4) 单 击 “添加”按钮为数据库备份指定一个新位置。
(5) 在 “选择备份目标”对话框中为备份输入一个新的目标,如 D:SQLBackups
Master. BAK,。
(6) 单 击 “确定”按钮开始备份。

9.4 SQL Server 2008 备份类型
SQL Server 2008支持几种备份类型,可以组合或独立使用它们来创建备份策略。本节 将探讨不同的备份类型。下一节会讨论备份选项,以及如何把备份类型组合为一个有效的
备份策略。使用图形化工具时,大多数备份的执行方式是一样的,而且图形化界面也很直
观。知道了这一点之后,在执行备份时,对每种备份类型只需要使用适当的Transact-SQL 代码即可。
9 .4 .1 完整备份
完整备份应该是最常见、也是最易实施的备份方式。完整备份会备份数据库中的所有
数据,并记录所有数据库文件的位置。SQL Server在事务日志中记录完整数据库备份的开 始,然后在事务日志中记录在备份过程中对数据库所做的所有修改。在数据库文件中所有
的数据页都已转移到备份媒体时,SQL Server记录备份的完成并把备份过程中发生的事务 曰志部分传输到备份媒体。完整备份可用于任何恢复模式中。
完整备份的好处在于它相当简单。但是它花费的时间要比其他备份方法长,并且还会
一次又一次地把未改变的数据和新的、更新过的数据-起备份。
—— Full database backup of SmallWorks BACKUP DATABASE SmallWorks TO DISK = 1D:SQLBackupsSmallWorksFull.BAK* WITH DESCRIPTION =*SmallWorks FULL Backup*
9 .4 .2 差异备份
差异备份仅备份自最近一次完整备份之后更改的数据。和完整备份一样,差异备份也
是由包含备份时发生的数据库修改的事务日志部分构成。因为差异备份只包含自最近一次
完整备份之后发生过变动的数据文件的区,所以花费的时间比完整备份少。但是在大多数
情况下,每个连续的差异备份会渐渐增长。就算一个64KB的区只改动了 1个字节,差异
备份也会备份整个区。不管数据库恢复模式是什么,差异备份都可用,但是它要求有一个
基准的完整数据库备份。
--Differential database backup of SmallWorks BACKUP DATABASE SmallWorks TO DISK =?D:SQLBackupsSmallWorksDiff.BAX’ WITH DIFFERENTIAL, DESCRIPTION =‘SmallWorks Differential Backup
9 .4 .3 文件/文件组备份
当一个数据库分成多个文件和文件组时,可以单独备份这些文件和文件组。这种备份
对超大型数据库特别有用。文件和文件组备份的工作方式同完整备份和差异备份类似,先
是文件的数据页,然后是所有针对该文件或文件组的事务,都会被添加到备份媒体中。

—-Backup of the "SWUserDatal" User-Defined Filegroup BACKUP DATABASE SmallWorks FILEGROUP =*SWUserDatal*
TO DISK =*D:SQLBackupsSmallWorksUserDatalFG.BAK‘
WITH DESCRIPTION =?SmallWorks SWUserDatal Filegroup Backup1 --Backup of the SmallWorks data file "SmallWorksDatal" --The logical name of the file **NOT the physical file name** BACKUP DATABASE SmallWorks FILE = * SmallWorksDatal? TO DISK =‘D:SQLBackupsSmallWorksDatalFile.BAK‘
WITH DESCRIPTION =*SmallWorks UserDatal File Backup1
差异文件/文件组备份
在备份文件或文件组时有一个额外选项,即可以执行差异文件或文件组备份。该选项
同-?般的差异备份相似,仅备份自最后一次文件或文件组完整备份以来对文件或文件组做
出的更改,以及备份时对文件做出的更改。
--Differential Filegroup Backup of the "SWUserDatal" User-Defined Filegroup BACKUP DATABASE SmallWorks FILEGROUP =*SWUserDatal* TO DISK = 1D:SQLBackupsSmallWorksUserDatalFGDIFF.BAK‘
WITH DIFFERENTIAL, DESCRIPTION =?SmallWorks Filegroup Differential Backup‘
文件和文件组备份只有在数据库处于完整或大容量日志恢复模式下才可用,但有一个例
外。如果文件组被标记为只读,而数据库被配置为简单恢复模式,那么可以备份该文件组。
9 .4 .4 事务日志备份
在完整或大容量日志恢复模式中,必须定期执行事务日志备份,使得事务日志的大小
保持在合理的范围内,并使数据恢复时的数据损失最小。
事务日志备份有3种形式,
? 纯日志备份一 纯日志备份只包含事务,并在数据库处于完整恢复模式或大容量曰
志恢复模式,但没有执行人容量操作时执行。
--Pure or Bulk Log Backup of SmallWorks BACKUP LOG SmallWorks TO DISK = 1D:SQLBackupsSmallWorksLog.TRN WITH DESCRIPTION =?SmallWorks Log Backup*
? 大容量日志备份—— 大容量日志备份包含当数据库处于大容量日志恢复模式中时
被大容量操作修改的事务数据和所有物理区。
? 尾日志备份—— 当数据库处于完整或大容ffl日志恢复模式中时,会在数据库还原前 执行尾日志备份来捕获所有还没有备份的事务日志记录。有时候,即使数据库损
坏,也可以执行尾日志备份。

--Tail Log Backup of SmallWorks BACKUP LOG SmallWorks TO DISK = *D:SQLBackupsSmallWorksTailLog.TRN, WITH NO_TRUNCATEr DESCRIPTION =?SmallWorks Tail Log Backup
9 .4 .5 部分备份
部分数据库备份由主文件组、读写文件组和任何指定的只读文件组组成。部分备份指
的是,主要文件组(它包含数据库联机所需的所有信息)和所有易被修改的文件组可以备份
在一起,将不改变和不经常改变的文件组单独备份,这样既节省了时间,又节省了备份媒
体的空间。
BACKUP DATABASE SmallWorks READ WRITE_FILEGROUPS TO DISK =*D:SQLBackupsSmallWorksPartial.BAK1 WITH DESCRIPTION =*Partial Backup of all Read/Write filegroups‘
9 .4 .6 仅复制备份
仅复制备份可以在数据库文件和#务日志上执行,创建一个备份而不影响还原数据库
所需的备份链。它们是不记录的备份,可以在维护环境之外使用。例如,如果需要数据库
的一个副本来进行测试和开发,则可以执行仅复制备份以免破坏备份链。本章稍后的“还
原数据库” 一节将讨论备份链。
BACKUP DATABASE SmallWorks TO DISK = * D:SQLDataSmallWorksCopyOnly.BAK‘
WITH COPY_ONLY, DESCRIPTION =‘Copy only backup1
9 . 5 备份选项
如前所述,可以把备份发送至?个磁盘或磁带目标。当向这些目标发送时,可选择压
缩数据库备份。备份目标的另一种可能则是将备份同时发送到多个目标。多个目标可被配
置为一个备份条带或一个镜像。
9 .5 .1 备份条带
由于同时写入多个物理设备,跨多个设备条带化一个备份可以节省备份时间。要创
建备份条带,只需把多个目标添加到BACKUP命令中即可,如下所示:
BACKUP DATABASE SmallWorks TO DISK= * D:StripedBackupsASmallWorksStripel.bak‘ , DISK= f E :StripedBack.upsBSmallWorksStripe2.bak‘ , DISK=‘ F: StripedBack.upsCSmallWorksStripe3 .bak‘
WITH DESCRIPTION =*Striped Backup*

一旦创建了一个条带集,每个文件将只会接受包含该条带中所有成员的备份。这 3 个
文件现在是一 个 由 3 个成员组成的集合。要将备份只发送到其中一个成员,必须指定
FORMAT选项。虽然条带化备份可以改善备份的性能,但条带中任何文件的丢失或损毁都
会造成备份的整体损失。
9 .5 .2 镜像备份
在我离职之后一位同事接替了我的职位。有一天晚上我接到他的电话,他说他很绝望。
他向我解释说他们的主要数据库服务器遭受了灾难性的故障。他们重建了服务器,但在从
磁带恢复数据时,磁带驱动器莫名其妙地毁坏磁带,而我之前创建的备用驱动器已经不起
作用了。我专注地聆听了他的故事,但到了最后我只能回答说:“如果你有那盘磁带的另一
份副本,另外找一个磁带驱动器,然后还原就可以了。如果你没有,那就从最近的副本还
原,然后更新你的简历吧”。
我把这个故事讲给我教的每一位SQL Server管理班学员听。这是为了强调冗余备份的 重要性。人们太容易对经常备份数据感到安心。但是备份和它们表面上保护的数据一样脆
弱。我遇到过许多组织,它们从来没有想过把它们的数据存储在冗余阵列上,只是把关键
数据备份在单个设备上,而且也不制作其副本。
过去,创建冗余备份是指备份数据库,然后再备份这个备份,或在创建备份时使用镜
像备份的硬件解决方案。SQL Server 2008提供了内置的镜像数据库备份的功能。 可视化工具不支持镜像备份。下面的代码演示了如何把一个数据库备份至一个目标,同
时又把整个备份镜像到另一目标。创建一个新的镜像备份集需要使用WITH FORMAT选项。
BACKUP DATABASE SmallWorks TO DISK = * D:MirroredBackupsASmallWorksMirrorl.bak‘
MIRROR TO DISK = 1E :MirroredBackupsBSmallWorksMirror2.bak‘
WITH FORMAT, DESCRIPTION =?Mirrored Backup*
9 .5 .3 压缩备份
如前所述,压缩备份要快于未压缩的备份,还原起来也更快。不过,这种速度也是有
代价的。压缩备份所消耗的CPU资源要大大多予未压缩的备份所消耗的CPU资源。如果
数据库服务器在CPU使用方面已经超负荷运行,那么就需要避免压缩备份或将它们安排在
CPU使用率较低的时段进行。下列代码演示了如何创建一个压缩备份:
BACKUP DATABASE SmallWorks TO DISK=,D:SQLBackupsSmallWorksCompressed.bak* WITH COMPRESSION, DESCRIPTION =?Compressed Backup’
9.5.4 WITH 选项
表 9-1列出并简要描述了数据库备份命令的WITH子句中可以包含的选项。

技术分享图片

技术分享图片

 

















































































































































































































以上是关于9.灾难预防和恢复的主要内容,如果未能解决你的问题,请参考以下文章

服务稳定性治理

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

PHP程序猿必须学习的第二课——站点安全问题预防