数据库紧急恢复过程

百家 作者:程序人生 2018-03-05 04:05:32

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事


当数据库失效时,请记录下当前时间,然后遵循下面步骤进行恢复。

 

1.         备份数据库

成功,使用备份文件还原数据库,转第2步。

失败,转第3步。

 

2.         还原数据库(在另一个服务器操作)

(1)DECLARE @backup_device nvarchar(128), @log_backup_device nvarchar(128)

set @backup_device = N'F:/database/myDb.bak'

 

restore database MyDb

    from disk = @backup_device

WITH REPLACE , file=5


(2)根据事务日志来恢复到具体某个时间点

--首先基于一个完全备份点开始做事务日志还原,注意[NORECOVERY]参数

    RESTORE database (数据库名) from 完全备份设备名with REPLACE,NORECOVERY,

    MOVE 'MyDb' TO 'D:/FMyDb_0606.mdf',

    MOVE 'FMyDb_Log' TO 'D:/FMyDb_Log_0606.ldf'

 

    --开始事务日志

    A.查看事务日志点:RESTORE HEADERONLY from disk='事务日志的备份的文件完全路径或备份设备名'

 

    B.开始恢复

    restore LOG 数据库名from事务日志备份设备名with FILE=1, NORECOVERY

    restore LOG 数据库名from事务日志备份设备名with FILE=2, NORECOVERY

    restore LOG 数据库名from事务日志备份设备名with FILE=3,NORECOVERY   --倒数第二个备份日志

    restore LOG 数据库名from事务日志备份设备名with FILE=4,RECOVERY --最后一个备份日志

 

执行失败的话,转下一步。

 

3.         复制数据库mdb, ldf文件

执行 net stop mssqlserver 停止SQL Server服务,复制数据库mdb, ldf文件。

成功复制2个文件已经其他文件组,转第4步。

只能复制mdb文件,转第5步。

只能复制ldf文件,转第8步。

 

4.         附加数据库(数据库文件与日志文件)

CREATE DATABASE [MyDb2] ON

( FILENAME = N'F:/back/MyDb.mdf' )

,( FILENAME = N'F:/back/MyDb_log.ldf' )

 FOR ATTACH


如果出现失败,转第5步。


5.         附加数据库(只有数据库文件)

CREATE DATABASE [MyDb2] ON

( FILENAME = N'F:/back/MyDb.mdf' )

FOR ATTACH_REBUILD_LOG

如果失败,在SQL2000下,可以尝试(2005版本没有该功能)

dbcc   rebuild_log('MyDb','F:/MyDb_log.ldf')  

转第6步。

当服务器因为硬件失败导致数据库失效时,可能出现以下错误,转第6步:

文件激活失败。物理文件名称'f:/database/MyDb/MyDb_log.ldf'可能不正确。

由于数据库没有完全关闭,无法重新生成日志。

 

6.         强制附加数据库

a) 新建一个同名数据库

CREATE DATABASE [MyDb_temp]

     ON (NAME=MyDb_temp,     FILENAME = N'F:/temp/MyDb.mdf' )

 LOG ON (NAME=MyDb_temp _Log, FILENAME = N'F:/temp/MyDb_log.ldf')

b) 停止SqlServer

c) 将备份的数据库覆盖F:/temp/MyDb.mdf

d) 启动SqlServer,(MyDb_temp将变为不可用)

查看数据库状态

SELECT FROM SYS.DATABASES

SELECT FROM sys.database_recovery_status

e) 将数据库改为紧急恢复模式

ALTER   DATABASE   MyDb   SET   EMERGENCY

f) 修复数据库

DBCC CheckDB ('MyDb')

g) 将数据库改为但用户模式

ALTER   DATABASE   MyDb   SET   SINGLE_USER

h) 再带参数修复数据库

DBCC CheckDB ('MyDb',   REPAIR_REBUILD   )

i) 将数据库改为正常模式

ALTER   DATABASE   MyDb   SET   ONLINE

如果无法创建数据库日志,i步骤将失败,这时候如果能看到数据库表,和进行Select操作,转第7步。

 

7.         提取数据库数据

a)   创建一个新的临时数据库

b)   导出数据

执行 SELECT 'SELECT * INTO MyDb2..'+name+' FROM 'name  FROM sys.objects WHERE TYPE = 'U' AND name!='sysdiagrams'

产生数据导出语句,执行他们,将数据复制到新数据库

c)   导出存储过程:待续

d)   导出触发器:待续

e)   导出函数:待续

f)   导出自定义数据类型:待续

g)   导出用户:待续

h)   将新数据库还原到目标服务器

备份/还原这个新建的数据库到目标服务器

i)   修复孤立用户(SQL 2005 版)

a)   EXEC sp_change_users_login 'Auto_Fix''GameServer';

b)   EXEC sp_change_users_login 'Auto_Fix''backoffice';

c)   EXEC sp_change_users_login 'Auto_Fix''adminsoft';

j)           修复数据库拥有者

EXEC sp_changedbowner 'sa'

 

 

总结:还是定时备份好。。。

- THE END -

有问题或者想和大家交流欢迎在本文下方留言或到博客原文处咨询本文作者。

本文作者:CSDN博客作者-greenery

博客地址:

http://blog.csdn.net/greenery/article/details/2570242

如果你有好的原创文章想与大家分享,欢迎投稿。


征稿要求:

①稿件字数以800~1500字左右为宜,多于2000字的文章在手机上阅读起来比较麻烦,少于800字的文章看起来不过瘾;

②你有自己拍的适合做文章插图的照片也可一并附上~如果不方便,程序和小七也会帮你配图~



加程序人生编辑们的微信,备注#投稿#:


程序 微信ID:druidlost  

小七 微信ID:duoshangshuang


点击图片get往期内容

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接