当数据库失效时,请记录下当前时间,然后遵循下面步骤进行恢复。
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'
总结:还是定时备份好。。。