修订记录
日期 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 。
3) 弹出重建 master 数据库工具界面,输入服务器名和你拷贝文件的制定目录 C:\masterrecover ,点击“Rebuild”。
4) 将提示复制发生和服务器配置,最后提示如下:
5) 接下来重新启动 MSSQLSERVER 。右键系统托盘中的 SQL Server 图标,选择“MSSQLServer – Start”。启动企业管理器,浏览数据库。发现生产数据库不见了。所有系统数据库都经由我们拷贝的制定目录被直接复制生成。master 数据库只包含新装时的信息。msdb 数据库也被重建,涉及的备份设备,备份序列以及作业都丢失了。接下来通过 master 和 msdb 的备份找回生产数据库和备份设备。
6) 退出企业管理器和查询分析器,以如下单用户模式启动 SQL Server 。sqlservr.exe 位于 MSSQL\binn 目录。以 –c 和 –m 参数启动数据库。最小化 DOS 窗口,但不关闭。
o -c 缩短启动时间
o -m 以单用户模式启动数据库。必须以单用户模式去恢复 master 数据库。
7) 打开企业管理器,右击 master 数据库,选择“All Tasks”和“Restore Database”。
8) 弹出数据库恢复界面,点击“From Device”按钮,选择“Select Devices…”按钮。
9) 弹出选择恢复设备界面,选择从磁盘恢复,点击“Add”。
10) 弹出选择恢复目标界面,由于 msdb 数据库没有恢复,而不能识别任何备份设备。点击“File name:”,并查找 master 数据库的备份文件。
11) 找到 master 数据库早期创建的备份文件,点“OK”按钮。
13) 返回到选择恢复设备界面,点“OK”按钮。
14) 返回到恢复数据库界面,选择“Options”页。
15) 检查要恢复的数据和日志文件路径,存在的文件将会被覆盖。点“OK”按钮。
16) 将会看到恢复进程界面。直到恢复完成,将弹出如下信息,该信息并不是错误信息。master 数据库已成功恢复,不再被用单用户模式连接。你也将收到一条信息显示你在企业管理器中的连接已经被终止。只有完全关闭企业管理器才能避免讨厌的错误信息。
17) 通过右键单击系统托盘 MSSQLServer 按钮,选择“MSSQLSERVER - Start”。
18) 打开企业管理器,浏览数据库,生产数据库出现了。
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
原文地址:http://ultrasql.blog.51cto.com/9591438/1591629