数据库恢复是数据库系统管理的另一项非常重要的工作,从某种意义上讲,数据库的恢复比数据库的备份更加重要和艰巨,因为数据库备份是在正常的状态下进行的,而数据库恢复原则上是在非正常的状态下进行的,比如硬件故障、软件瘫痪以及误操作等。
本章主要介绍以下内容:
n 使用RESTORE语句恢复数据库。
n 从不同的备份中恢复数据库。
n 恢复系统数据库。
数据库恢复就是把数据库备份加载到系统中,在执行数据库恢复时,系统首先要进行一些安全性检查,比如检查数据库是否存在、数据库文件是否兼容等,以确保数据库安全和迅速地恢复。另外,不同的数据库备份类型,应该采取不同的恢复方法。
@ 在恢复数据库、备份日志或文件的时候,应该考虑以下因素:
(1)在进行数据库恢复之前,应该获取有关备份的信息。
(2)在恢复最后一次备份的时候,应该使用RECOVERY选项。
(3)如果要恢复附加备份,需要使用NORECOVERY选项。
在数据库故障之后,数据库管理员应该尽快建立一个事务日志备份,以便获取数据库故障之前的所有事务信息。管理员应该使用no-truncate开关,可以使用这个开关在数据库不可用的时候备份事务日志。
使用RESTORE语句进行恢复时,系统进行安全性检查。下面几种情况,系统不能恢复数据库:
n 服务器上的数据库文件集和备份集中的数据库文件集不一致。
n 如果在RESTORE语句中指定的数据库已经存在,并且该数据与在备份文件中记录的数据库不同。
n 不能提供用于恢复数据库的全部文件或者文件组。
上面已经提到,在数据库恢复的时候,如果不能提供恢复该数据库的文件或文件组,就不能进行数据库恢复。所以,在恢复数据库的时候,必须确保数据库备份是有效的。并且在备份文件中包括所有要恢复的内容。
可以使用以下两种方法查看数据库的备份信息:
n 使用SQL Server Enterprise Manager查看备份信息。
n 使用Transact-SQL语句查看备份信息。
常用的Transact-SQL语句有:RESTORE HEADERONLY、RESTORE FILELISTONLY、RESTORE BABELONLY和RESTORE VERIFYONLY。
使用RESTORE HEADERONLY语句可以获取指定文件或者备份集的标题信息。在执行RESTORE HEADERONLY时,可以返回如下信息:
(1)备份文件和备份集名称和描述信息。
(2)备份介质类型。
(3)备份方法和类型。
(4)备份的日期和时间。
(5)备份尺寸大小和备份的序列号。
使用RESTORE FILELISTONLY语句可以获取在备份文件中的数据文件或事务日志文件的信息。在执行RESTORE FILELISTONLY时,可以返回如下信息:
(1)数据库文件和事务日志文件的逻辑名称。
(2)数据库文件和事务日志文件的物理名称。
(3)文件类型。
(4)文件组中包含的成员。
(5)备份集的大小(MB)。
(6)文件的最大容量(MB)。
使用RESTORE LABELONLY语句可以获取有关存储备份文件的备份介质的信息。使用RESTORE VERIFYONLY语句可以用来判断备份集的单个文件是否完整以及备份是否可读。
在执行数据库恢复之前,还需要注意以下几个方面:
(1)在数据库恢复前,应该首先删除故障数据库,以便删除对故障硬件的任何引用。可以使用SQL Server Enterprise Manager和Transact-SQL语句删除相关数据库。
(2)在数据库恢复前,必须限制用户对数据库的访问。数据库的恢复是静态的,应该使用SQL Server Enterprise Manager或者系统存储过程sp_bdotion设置数据库的dbo use only选项。
可以使用以下两种方法恢复数据库:
n 使用SQL Server Manager。
n 使用Transact-SQL的RESTORE语句。
使用SQL Server Enterprise Manager恢复数据库的步骤如下:
(1)运行SQL Server Enterprise Manager。
(2)选择Tools菜单,单击Restore Database菜单项。弹出如图13-1所示的窗口。在该窗口中,有两个选项卡:General和Options,默认选项卡是General选项卡。
图13-1 Restore Database窗口
(3)在General选项卡中,可以选择恢复的数据库和恢复类型。
(4)选择Options选项卡,如图13-2所示。在该选项卡中,可以选择恢复时使用的选项和状态。
图13-2 Options选项卡
RESTORE语句的语法形式如下:
RESTORE DATABASE{database_name|@database_name-var}
[FROM<backup_file>[,…n]
[WITH
[[,]FILE=file_number]
[[,]MOVE‘logical_file_name’TO‘operating_system_file_name’]
[[,]REPLACE]
[[,]{NORECOVERY|RECOVEY|STANDBY=undo_file_name}]]
其中,<backup_file>是
{{backup_file_name|@backup_file_name_var}|
[DISK|TAPE|PIPE]={‘temp_backup_file’|@temp_backup_file_var}}
下面介绍一下几个选项的含义:
(1)RECOVERY选项
使用RECOVERY选项可以在恢复最后一个事务日志或者完全数据库时保证数据库的一致状态。如果使用该选项,SQL Server系统取消事务日志中任何没有提交的事务并提交任何完成的事务。另外,在使用增量备份的时候,不能使用该选项。
(2)NORECOVERY选项
使用NORECOVERY选项可以恢复多个备份。SQL Server系统不仅取消事务日志中的任何没有提交的事务,也不提交完成的事务。
(3)FILE选项
使用FILE选项可以在备份文件中指定一个备份。
(4)MOVE TO选项
使用MOVE TO选项将文件恢复到另外一个位置。
(5)REPLACE选项
使用REPLACE选项可以用不同数据库备份中的数据替代已有数据库中的数据。
在恢复数据库的时候,首先要了解执行备份时使用的备份方法类型,也必须确认文件中包含了要恢复的数据库备份,确认备份有效并且包含备份集的全部文件。
从完全数据库备份中恢复数据库的时候,SQL Server系统会重新创建数据库以及和数据库相关的文件。数据库重建的工作都是由系统自动完成的,不用用户创建数据库。一般情况下,以下数据库故障需要从完全数据库备份中恢复。
n 数据库磁盘文件损坏。
n 整个数据库被破坏性删除。
在执行完全数据库备份恢复时,应该指定REVOVERY选项,以保证数据库状态的一致性。
当从增量备份中恢复数据时,SQL Server系统只恢复最近一次数据库备份后数据库的变化部分。从增量备份中恢复数据库时,需要注意以下方面:
n 在从增量备份中恢复数据库之前,应该先从完全数据库备份中恢复数据库。
n 从增量备份中恢复数据库的语法形式和从完全数据库中恢复库的语法形式相同。所以,在RESTORE的FROM子句中应指定含有增量备份的备份问题。
下面的例子从增量备份中恢复数据库。数据库备份文件nwinddbacdiff包含了一份增量备份文件。
USE master
RESTORE DATABASE northwind
FROM nwinddbacdiff
WITH NORECOVERY
使用SQL Server Enterprise Manager和Transact-SQL语句可以恢复事务日志。使用SQL ServerEnterprise Manager恢复事务日志的步骤如下:
(1)运行SQL Server Enterprise Manager。
(2)选择相应的服务器,用鼠标右键单击pubs数据库,弹出一个快捷菜单,选择“所有任务”菜单项,展开其子菜单,如图13-3所示。
图13-3 “所有任务”子菜单
(3)单击Restore Database菜单命令,弹出如图13-4所示的对话框。在其中,选择From Device和Transact Log单选按钮,以明确仅恢复事务日志。
(4)单击“确定”按钮,恢复事务日志。
从事务日志中恢复数据的语法形式如下:
RESTORE LOG{database_name|@database_name_var}
[FROM<backup_file>[,…]]
[WITH
[[,]{NORECOVERY|RECOVERY|STANDBY==undo_file_name}]
[[,]ISTOPAT={data_time|@date_time_var}]]
图13-4 设定仅恢复事物日志
下面是一个从事务日志备份中恢复数据的例子。在这个例子中,假设在一个备份文件上有一个完全数据库备份,两个事务日志备份在另外一个备份文件上。在这个例子中,第一步从完全数据库中恢复数据库,第二步恢复第一个事务日志的备份,第三步恢复第二个事务日志的备份,并且提交已经完成的事务,取消没有完成的事务。
USE master
RESTORE DATABASE northwind
FROM nwindbac
WITH NORECOVERY
GO
USE master
RESTORE LOG northwind
FROM nwindbaclog
WITH FILE=1
STATS,
NORECOvERY
GO
USE master
RESTORE LOG northwind
FROM nwindbaclog
WIHT FILE=2
RECOVERY
如果某个非常关键的文件被破坏了,可以从文件备份或文件组备份中恢复数据库。从文件备份或文件组备份中恢复数据库的语法形式如下:
RESTORE DATABASE|database_name|@database_name_var|
<fille_or_filegroup>[,…m]
[FROM<backup_file>[,…n]]
其中,
<backup_file>是
{FILE=logical_file_name|FILEGROUP=logical_filegroup_name}
下面是一个从文件或者文件组备份中恢复数据库的例子。在这个例子中,假设一个数据库存放在四个设备上:Nwind1、Nwind2、Nwind3、Nwind4,数据库文件包含一个表及其索引,且该文件备份到Nwind2bac文件上。因为存放Nwbac文件的物理介质被破坏了,所以,在这个例子中,首先必须恢复N2bac文件,然后再恢复事务日志。
USE master
RESTORE DATABASE northwind
FILE=N2
FROM N2bac
GO
USE master
RESTORE LOG northwind
FROM nwindbaclog
WITH RECOVERY
在SQL Server 2000中,系统数据库主要包括master、model和msdb,主要用来存储系统信息。如果存储系统数据库的介质遭到破坏,就必须重建系统数据库。可以使用RESTORE语句或者SQL Server Enterprise Manager从系统数据库备份中恢复系统数据库,可以按照如下操作恢复系统数据库:
(1)首先要重新建立数据库,可以使用Rebuild.exe命令行,重新创建系统数据库。
(2)系统数据库创建之后,启动SQL Server服务。
(3)启动SQL Server服务后,需要从系统数据备份中恢复数据库。一般情况下,先恢复master数据库,然后恢复msdb数据库,最后恢复model数据库。
本章中,读者以学会下列内容:
n 数据库恢复就是把数据库备份加载到系统中,在执行数据恢复时,系统首先要进行一些安全性检查。
n 可以使用两种方法查看数据库的备份信息:使用SQL Server Enterprise Manager查看备份信息;使用Transact-SQL语句查看备份信息。
n 可以使用两种方法恢复数据库:使用SQL Server Manager;使用Transact-SQL的RESTORE语句。
n 可以使用RESTORE语句或者SQL Server Enterprise Manager从系统数据库备份中恢复系统数据库。