问题描述

==========

从已损坏的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的方式迁移到目标服务器。


备注:以上过程在微软技术专家的协助下完成