数据库紧急恢复过程,快来看看!

运维 数据库运维
当数据库失效时,请记录下当前时间,然后遵循下面步骤进行恢复。 总之,平时要定时备份好数据库。

数据库紧急恢复过程,快来看看!

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

1.备份数据库

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

失败,转第3步。 

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

(1)

 

  1. DECLARE @backup_device nvarchar(128), @log_backup_device nvarchar(128) 
  2.  
  3. set @backup_device = N'F:/database/myDb.bak'  
  4.  
  5. restore database MyDb 
  6.  
  7.     from disk = @backup_device 
  8.  
  9. 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. 附加数据库(数据库文件与日志文件)

 

  1. CREATE DATABASE [MyDb2] ON 
  2.  
  3. ( FILENAME = N'F:/back/MyDb.mdf' ) 
  4.  
  5. ,( FILENAME = N'F:/back/MyDb_log.ldf' ) 
  6.  
  7.  FOR ATTACH 

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

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

 

  1. CREATE DATABASE [MyDb2] ON  
  2. ( FILENAME = N'F:/back/MyDb.mdf' )  
  3. FOR ATTACH_REBUILD_LOG 

 

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

 

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

转第6步。

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

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

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

6.强制附加数据库

a) 新建一个同名数据库

 

  1. CREATE DATABASE [MyDb_temp]  
  2.      ON (NAME=MyDb_temp,     FILENAME = N'F:/temp/MyDb.mdf' )  
  3.  LOG ON (NAME=MyDb_temp _Log, FILENAME = N'F:/temp/MyDb_log.ldf'

 

b) 停止SqlServer

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

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

查看数据库状态

 

  1. SELECT * FROM SYS.DATABASES  
  2. SELECT * FROM sys.database_recovery_status 

 

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

 

  1. ALTER   DATABASE   MyDb   SET   EMERGENCY 

f) 修复数据库

 

  1. DBCC CheckDB ('MyDb'

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

 

  1. ALTER   DATABASE   MyDb   SET   SINGLE_USER 

h) 再带参数修复数据库

 

  1. DBCC CheckDB ('MyDb',   REPAIR_REBUILD   ) 

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

 

  1. 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)  修复数据库拥有者

 

  1. EXEC sp_changedbowner 'sa'  

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

责任编辑:庞桂玉 来源: 程序人生
相关推荐

2018-01-30 17:54:37

数据库MySQLSQL Server

2018-04-18 17:08:45

2020-04-16 09:35:53

数据科学机器学习数据分析

2011-03-24 11:14:46

2017-11-24 08:00:55

前端JSCSS

2017-03-14 14:09:08

数据库Oracle备份

2018-05-02 15:41:27

JavaScript人脸检测图像识别

2018-03-12 10:35:01

LinuxBash快捷键

2021-04-19 09:23:26

数字化

2020-06-08 15:06:33

Pandas可视化数据

2020-08-04 07:02:00

TCPIP算法

2020-11-24 06:00:55

PythonPython之父编程语言

2022-01-21 08:21:02

Web 安全前端程序员

2022-11-28 07:32:46

迭代器remove数据库

2020-08-19 10:34:26

编程语言开发

2018-08-02 11:04:41

数据库迁移数据

2011-03-10 11:12:59

数据库

2011-05-13 13:26:52

master数据库恢复

2018-02-24 14:59:39

区块链公共区块链私有区块链

2020-11-04 08:40:23

C++多元组Tuple
点赞
收藏

51CTO技术栈公众号