首页 > 代码库 > 数据库紧急恢复文档

数据库紧急恢复文档

数据库紧急恢复文档

 






修订记录


日期

Date

修订版本Revision version

修改描述

change Description

作者

Author

2008-07-06

1.0

格式化

UltraSQL

2009-06-14

1.1

修正

UltraSQL



 






目 录


一、 在 SQL Server 2000 中重建和恢复 master 数据库

二、 恢复 msdb 数据库

三、 恢复数据到即时点

四、 恢复数据到故障点

五、 利用 MARK 标记回滚即时修改











一、在 SQL Server 2000 中重建和恢复 master 数据库



1. 描述:

master 数据库记录 SQL Server 系统的所有系统级别信息。它记录所有的登录帐户和系统配置设置。master 数据库是这样一个数据库,它记录所有其它的数据库,其中包括数据库文件的位置。master 数据库记录 SQL Server 的初始化信息,它始终有一个可用的最新 master 数据库备份。

 

因为 master 数据库损坏而导致 SQL Server 2000 无法启动的情况下,恢复 master 数据库。首先,我们我们重建 master 数据库;然后,我们通过故障前的备份恢复它;最后,恢复其他生产数据库。

 

2. 需求:

始终有一个 master 数据库的当前可用备份。

执行下列操作后,尽快备份 master 数据库。

o 创建、修改或删除数据库

o 更改服务器或数据库的配置值

o 修改或添加登录帐户

不要在 master 中创建用户对象。否则,必须更频繁地备份 master 。

 

3. 步骤:

1) 将 SQL Server 安装光盘 \x86\data 目录下的所有文件,拷贝到硬盘上的一个指定目录,如 C:\masterrecover 。此时文件为只读,我们需要修改为可读写模式,让重建 master 工具可以操作。全选所有的文件,右键属性,去掉“只读”勾选项。


2) 开始重建 master 数据库,并恢复早期的备份。进入系统目录 Microsoft SQL Server\80\Tools\Binn ,运行 rebuild.exe 。

clip_image002


3) 弹出重建 master 数据库工具界面,输入服务器名和你拷贝文件的制定目录 C:\masterrecover ,点击“Rebuild”。

clip_image004


4) 将提示复制发生和服务器配置,最后提示如下:

clip_image006


5) 接下来重新启动 MSSQLSERVER 。右键系统托盘中的 SQL Server 图标,选择“MSSQLServer – Start”。启动企业管理器,浏览数据库。发现生产数据库不见了。所有系统数据库都经由我们拷贝的制定目录被直接复制生成。master 数据库只包含新装时的信息。msdb 数据库也被重建,涉及的备份设备,备份序列以及作业都丢失了。接下来通过 master 和 msdb 的备份找回生产数据库和备份设备。

clip_image008


6) 退出企业管理器和查询分析器,以如下单用户模式启动 SQL Server 。sqlservr.exe 位于 MSSQL\binn 目录。以 –c 和 –m 参数启动数据库。最小化 DOS 窗口,但不关闭。

clip_image010

o -c 缩短启动时间

o -m 以单用户模式启动数据库。必须以单用户模式去恢复 master 数据库。


7) 打开企业管理器,右击 master 数据库,选择“All Tasks”和“Restore Database”。

clip_image012


8) 弹出数据库恢复界面,点击“From Device”按钮,选择“Select Devices…”按钮。

clip_image014


9) 弹出选择恢复设备界面,选择从磁盘恢复,点击“Add”。clip_image016


10) 弹出选择恢复目标界面,由于 msdb 数据库没有恢复,而不能识别任何备份设备。点击“File name:”,并查找 master 数据库的备份文件。

clip_image018


11) 找到 master 数据库早期创建的备份文件,点“OK”按钮。

clip_image020


12) 返回到选择恢复目标界面,点“OK”按钮。    
clip_image022


13) 返回到选择恢复设备界面,点“OK”按钮。

clip_image024


14) 返回到恢复数据库界面,选择“Options”页。

clip_image026


15) 检查要恢复的数据和日志文件路径,存在的文件将会被覆盖。点“OK”按钮。

clip_image028


16) 将会看到恢复进程界面。直到恢复完成,将弹出如下信息,该信息并不是错误信息。master 数据库已成功恢复,不再被用单用户模式连接。你也将收到一条信息显示你在企业管理器中的连接已经被终止。只有完全关闭企业管理器才能避免讨厌的错误信息。

clip_image030


17) 通过右键单击系统托盘 MSSQLServer 按钮,选择“MSSQLSERVER - Start”。


18) 打开企业管理器,浏览数据库,生产数据库出现了。

clip_image032


19) 下一步恢复 msdb 数据库,见下文。恢复 msdb 数据库和恢复 master 数据库类似,但是不需要以单用户模式登陆。再恢复完 msdb 数据库后,下一步恢复其他数据库变得容易,因为备份设备都已恢复出来。

 


二、恢复 msdb 数据库


1. 描述:

msdb 数据库供 SQL Server 代理程序调度警报和作业以及记录操作员时使用。

msdb 数据库存储所有的备份信息和作业信息。


2. 需求:

始终有一个 msdb 数据库的当前可用备份。

在恢复过程中,务必使 SQL Server Agent 关闭。


3. 步骤:

1) 在恢复前停止 SQL Server Agent 。恢复数据库必需有独家访问权限,而对于 msdb 数据库,SQL Server Agent 破坏了这种独家访问权限。


2) 先得到 RESTORE DATABASE 的文件号,连接到 master 数据库,通过 RESTORE HEADERONLY,找到我们需要去恢复的备份文件。

RESTORE HEADERONLY FROM msdbbackupdev;


3) 在查询分析器中连接到 master 数据库,执行恢复。

RESTORE DATABASE msdb
FROM msdbbackupdev
WITH FILE = 1;




三、恢复数据到即时点


1. 描述:

通过事务日志将数据库恢复到某个即时时间点。


2. 需求:

数据库选择完整恢复模型。

始终有可用的备份可恢复到即时点。


3. 步骤:

1) 通过 RESTORE HEADERONLY 查看生产数据库的备份情况,有时可能通过多种组合方式恢复到即时点,我们选择最快的:完整备份+日志备份的方式。

RESTORE HEADERONLY FROM prodbackupdev;


2) 通过 STOPAT 参数恢复数据到即时点。

--恢复完整备份
RESTORE DATABASE ProdDB
FROM prodbackupdev
WITH FILE = 14, NORECOVERY;
GO
--恢复日志备份
RESTORE LOG ProdDB
FROM prodbackupdev
WITH FILE = 15, NORECOVERY;
GO
--恢复到即时点
RESTORE LOG ProdDB
FROM prodbackupdev
WITH FILE = 16, RECOVERY, STOPAT = ‘2006-06-06 06:06:06‘;
GO



四、恢复到故障点


1. 描述:

要想完成故障点的恢复,必须完成尾日志备份。尾日志备份所备份的日志文件中,包含了最后一个成功的日志备份到当前故障点的所有事务。如果不能完成尾日志备份,则只能将数据库恢复到最后一次创建事务日志备份的时间点。自上一次事务日志备份后的对数据库所做的更改将丢失,必须手工重做。

尾日志备份将捕获所有尚未备份的事务日志记录。如果数据库损坏或离线,则可以尝试进行尾日志备份。仅当日志文件未损坏且数据库不包含任何大容量日志更改时,尾日志备份才会成功。如果数据库包含要备份的、在记录间隔期间执行的大容量日志更改,则仅在所有数据文件都存在且未损坏的情况下,尾日志备份才会成功。

2. 需求:

数据库选择完整恢复模型。

始终有可用的备份在尾日志备份失败时,可恢复到最后一次创建事务日志备份的时间点。


3. 步骤:

1) 首先,做尾日志备份。在生产数据库损坏时,用 NO_TRUNCATE 从句备份事务日志。

--尾日志备份
BACKUP LOG ProdDB
TO prodbackupdev
WITH NAME = ‘Tail-Log Backup‘, NO_TRUNCATE;
GO


2) 查看备份情况。

RESTORE HEADERONLY FROM prodbackupdev;


3恢复到故障点。

--恢复完整备份
RESTORE DATABASE ProdDB
FROM prodbackupdev
WITH FILE = 14, NORECOVERY;
GO
--恢复日志备份
RESTORE LOG ProdDB
FROM prodbackupdev
WITH FILE = 15, NORECOVERY;
GO
--恢复尾日志备份到故障点
RESTORE LOG ProdDB
FROM prodbackupdev
WITH FILE = 16, RECOVERY;
GO

 


五、利用 MARK 标记回滚即时修改


1. 描述:

通过 STOPATMARK 和 STOPBEFOREMARK 从句恢复到即时点。允许恢复数据库到个人的事务或者给定事务之前。可能很少会用到生产环境,一般会用到测试或者开发环境,但对于一些重大修改和操作时也用到。这些 RESTORE 从句可以方便的恢复到一个没有达到预期效果的事务之前的时间点。


STANDBY指定一个允许撤消恢复效果的备用文件。STANDBY 选项可以用于脱机还原(包括部分还原),但不能用于联机还原。尝试为联机还原操作指定 STANDBY 选项将会导致还原操作失败。如果必须升级数据库,也不允许使用 STANDBY 选项。


备用文件用于为 RESTORE WITH STANDBY 的撤消过程中修改的页面保留一个“写入时副本”预映像。备用文件允许用户在事务日志还原期间以只读方式访问数据库,并允许数据库用于备用服务器情形,或用于需要在日志还原操作之间检查数据库的特殊恢复情形。执行完 RESTORE WITH STANDBY 操作之后,下一个 RESTORE 操作会自动删除撤消文件。如果在下一个 RESTORE 操作之前手动删除了这个备用文件,则必须重新还原整个数据库。当数据库处于 STANDBY 状态时,您应将这个备用文件视为和任何其他数据库文件同样重要。该文件与其他数据库文件不同,数据库引擎仅在活动还原操作过程中持续打开该文件。


2. 需求:

数据库选择完整恢复模型。

事务中使用 MARK 标记。

始终有可用的备份能恢复到即时点。


3. 步骤:

1) 假设测试数据库已做过完整备份和事务日志备份。

--完整备份
BACKUP DATABASE TestDB
TO testbackupdev
WITH NAME = ‘Full Backup‘;
--日志备份
BACKUP LOG TestDB
TO testbackupdev
WITH NAME = ‘Transaction Log Backup 1‘;


2) 通过设定 MARK 标记做事务操作。对于标记事务,必须明确的以 COMMIT 和 ROLLBACK 结束。

INSERT shippers(CompanyName, Phone)
VALUES (‘Company1‘, ‘(027)11111111‘);
GO
INSERT shippers(CompanyName, Phone)
VALUES (‘Company2‘, ‘(027)22222222‘);
GO
BEGIN TRANSACTION TIMETOMARK
WITH MARK ‘SETMARKER‘
GO
INSERT shippers(CompanyName, Phone)
VALUES (‘Company3‘, ‘(027)33333333‘);
GO
INSERT shippers(CompanyName, Phone)
VALUES (‘Company4‘, ‘(027)44444444‘);
GO
COMMIT TRANSACTION TIMETOMARK
GO
INSERT shippers(CompanyName, Phone)
VALUES (‘Company5‘, ‘(027)55555555‘);
GO


3) 如果事务操作没有达到预期效果,此时立即做事务日志备份,以备能恢复到标记之前或之后。

--日志备份
BACKUP LOG TestDB
TO testbackupdev
WITH NAME = ‘Transaction Log Backup 2‘;


4) 通过查询分析器连接到 TestDB,用EXEC sp_helpfile 决定删除哪个文件,删除掉数据文件和事务日志文件。

EXEC sp_helpfile;


5) 关闭数据库。

SHUTDOWN WITH NOWAIT;


6) 删除第4步找到的文件。


7) 右击系统托盘中SQL Server的图标,选择“SQL Server - Start”。


8) 通过备份设备找到我们需要的文件号。

RESTORE HEADERONLY FROM testbackupdev;


9) 首先做前两个恢复,然后通过 STOPBEFOREMARK 标记恢复,用 STANDBY 语句让数据库处于只读模式,但仍然能够实施进一步事务日志恢复。

RESTORE DATABASE TestDB
FROM testbackupdev
WITH FILE = 1, NORECOVERY;
GO
RESTORE LOG TestDB
FROM testbackupdev
WITH FILE = 2, NORECOVERY;
GO
RESTORE LOG TestDB
FROM testbackupdev
WITH FILE = 3,
STANDBY = ‘D:\testrestore‘,
STOPBEFOREMARK = ‘TIMETOMARK‘;


10) 当通过 STOPBEFOREMARK 将恢复数据到 TIMETOMARK 事务之前,假设我们需要恢复到这个事务之后,让数据库在恢复之后可操作。

RESTORE LOG TestDB
FROM testbackupdev
WITH FILE = 3,
RECOVERY,
STOPATMARK = ‘TIMETOMARK‘;


11) STOPATMARK 恢复了在 STOPATMARK 事务期间提交的所有行,但该事务之后的所有更改将不会恢复。


本文出自 “SQL Server Deep Dives” 博客,请务必保留此出处http://ultrasql.blog.51cto.com/9591438/1591629

数据库紧急恢复文档