数据库紧急恢复过程
当数据库失效时,请记录下当前时间,然后遵循下面步骤进行恢复。
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'
总结:
还是定时备份好
。。。
本文转自CSDN:
http://blog.csdn.net/greenery/archive/2008/06/20/2570242.aspx
,非本人原创.