数据库紧急恢复过程

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

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

1. 备份数据库

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

失败,转第3步。

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

(1)DECLARE@backup_devicenvarchar(128),@log_backup_devicenvarchar(128)

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

restoredatabaseMyDb

fromdisk=@backup_device

WITHREPLACE,file=5

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

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

RESTOREdatabase(数据库名)from完全备份设备名withREPLACE,NORECOVERY,

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

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

--开始事务日志

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

B.开始恢复

restoreLOG数据库名from事务日志备份设备名withFILE=1,NORECOVERY

restoreLOG数据库名from事务日志备份设备名withFILE=2,NORECOVERY

restoreLOG数据库名from事务日志备份设备名withFILE=3,NORECOVERY--倒数第二个备份日志

restoreLOG数据库名from事务日志备份设备名withFILE=4,RECOVERY--最后一个备份日志

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

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

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

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

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

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

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

CREATEDATABASE[MyDb2]ON

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

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

FORATTACH

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

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

CREATEDATABASE[MyDb2]ON

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

FORATTACH_REBUILD_LOG

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

dbccrebuild_log('MyDb','F:/MyDb_log.ldf')

转第6步。

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

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

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

6. 强制附加数据库

a)新建一个同名数据库

CREATEDATABASE[MyDb_temp]

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

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

b) 停止SqlServer

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

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

查看数据库状态

SELECT*FROMSYS.DATABASES

SELECT*FROMsys.database_recovery_status

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

ALTERDATABASEMyDbSETEMERGENCY

f)修复数据库

DBCCCheckDB('MyDb')

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

ALTERDATABASEMyDbSETSINGLE_USER

h)再带参数修复数据库

DBCCCheckDB('MyDb',REPAIR_REBUILD)

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

ALTERDATABASEMyDbSETONLINE

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

7. 提取数据库数据

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

b)导出数据

执行SELECT'SELECT * INTO MyDb2..'+name+' FROM '+nameFROMsys.objectsWHERETYPE ='U'AND name!='sysdiagrams'

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

c)导出存储过程:待续

d)导出触发器:待续

e)导出函数:待续

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

g)导出用户:待续

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

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

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

a)EXECsp_change_users_login'Auto_Fix','GameServer';

b)EXECsp_change_users_login'Auto_Fix','backoffice';

c)EXECsp_change_users_login'Auto_Fix','adminsoft';

j)修复数据库拥有者

EXECsp_changedbowner'sa'

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

- THE END -

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

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

博客地址:

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

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

征稿要求:

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

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

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

程序 微信ID:druidlost

小七 微信ID:duoshangshuang

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180305A0IA4B00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券