问题描述
==========
从已损坏的RAID磁盘上拷贝mdf数据文件,尝试attach失败,初始版本为sql server 2005,目标版本为sql server 2008
故障排查
==========
尝试用下面方法attach:
CREATE DATABASE test
ON (FILENAME = 'D:\attachdb\test.mdf')
FOR ATTACH_REBUILD_LOG;
结果:失败;
尝试下面方法重建修复:
Ÿ 新建一个与原来数据名称相同的数据库;
Ÿ 停止数据库服务;
Ÿ 将旧的mdf文件拷贝并覆盖新建的数据库mdf文件;
Ÿ 启动数据库服务;
Ÿ 打开SQL Server Management Studio,连接到实例,这时,问题数据库会变成Recovery Pending模式;
Ÿ 将数据库设置成emergency模式:
ALTERDATABASE [DBName] SET EMERGENCY
Ÿ 将数据库设置成单用户模式:
Ÿ ALTERDATABASE [DBName] SET SINGLE_USER with rollback immediate
Ÿ
Ÿ 尝试用下面的命令修复数据库:
dbcccheckdb([DBName],repair_allow_data_loss)
Ÿ 修复完成后,将数据还原成多用户模式:
alterdatabase [DBName]set multi_user
结果:报错:Database *** is beingrecovered. Waiting until recovery is finished.
目标数据库与现mdf文件版本不一致,新建compatible-level=90的数据尝试attach,存在版本不兼容问题:Cannot open database ***version 611. Upgrade the database to the latest version.
远程协助,尝试重建日志及后续数据文件的修复。
解决办法
==========
新建一个sql server2005,在sql server 2005实例上尝试恢复:
Ÿ 新建一个与原来数据名称相同的数据库;
Ÿ 停止数据库服务;
Ÿ 将旧的mdf文件拷贝并覆盖新建的数据库mdf文件;
Ÿ 启动数据库服务;
Ÿ 打开SQL Server Management Studio,连接到实例:执行下面语句
ALTER DATABASE NetPerfMon
REBUILD LOG ON
(NAME=NetPerfMon_Log,FILENAME='D:\NetPerfMon_log.ldf')
Ÿ 数据库成功online
运行DBCC CHECKDB检查数据库是否有损坏,返回:
CHECKDB 在数据库'NetPerfMon'中发现12 个分配错误和432 个一致性错误。
对于由DBCC CHECKDB (NetPerfMon)发现的错误,repair_allow_data_loss是最低的修复级别。
DBCC 执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。
尝试用下面步骤进行修复:
Ÿ alter database repairdb setemergency;--修改成emergency状态
Ÿ alter database repairdb setsingle_user with rollback immediate;--设置成单用户模式
Ÿ dbcccheckdb('repairdb',repair_allow_data_loss);--使用repair_allow_data_loss参数进行数据库修复,在此阶段,可能您需要执行多次,来确保修复存在的问题
Ÿ alter database repairdb setmulti_user;--修复完成后,还原成多用户模式
数据库修复成功。
由于目标数据库版本为sql server 2008,建议升级sql server 2005到该版本数据库,在将数据库通过detach/attach的方式迁移到目标服务器。
备注:以上过程在微软技术专家的协助下完成