事件回顾:前几天,由于协调不慎,客户工作人员在服务器数据库导入数据时冷关机,导致重启后,该数据库文件被SQL SERVER质疑,无法正常使用。由于该数据库存有大约200G数据,并且没有备份,所以必须进行恢复。
当时的情况是,正在从另一台服务器数据库中向本服务器数据库的一个分区文件内导数据,也就是说由于用户冷关机损坏的只有这一个分区文件,从而使整个数据库无法正常加载。
从网上搜索了一些恢复资料,主要方式是使用数据库指令dbcc来复原。
情况描述:SQL SERVER中该数据库被质疑。数据库文件(.mdf),日志文件(.ldf)及分区文件(.ndf)均存在。全部数据库文件大约200G。无备份数据库,冷启动时,只有一个分区文件在导数据。
结果:执行dbcc一些操作后,数据库恢复时间大约8小时,该数据库被恢复成功。恢复后的数据库文件在尺寸上会比恢复前有所变化,在本例中,数据库文件变大。
以下是使用dbcc的一些转载资料:
--------------------------------------------------------------------------------------
原文地址: http://www.idcfree.com/sql-server-msdb.html
SQL Server 数据库置疑
use master
declare @databasename varchar(255)
set @databasename=’msdb’
exec sp_dboption @databasename, N’single’, N’true’ –将目标数据库置为单用户状态
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N’single’, N’false’–将目标数据库置为多用户状态
sp_resetstatus msdb
DBCC DBRECOVER(msdb)
dbcc rebuild_log(‘msdb’,'d:\Program Files\Microsoft SQL Server\MSSQL\Data\msdblog.ldf’)
5.把数据库设成紧急状态:
在SQL查询分析器中逐条执行以下语句
sp_configure ‘allow’,1
reconfigure with override
update sysdatabases set status=32768 where name=’kmjxc’
6.重建日志文件(请将路径换成你的数据文件路径)
其中“D:\MSSQL$PROD\Data\”为存放数据库文件的路径
“KMJXC_log.ldf”为一个新的不存在的文件,在执行以下语句时将自动建立
dbcc rebuild_log(‘kmjxc’,'D:\MSSQL$PROD\Data\KMJXC_log.ldf’)
7.逐条执行以下语句,取消紧急模式
update sysdatabases set status=0 where name=’kmjxc’
restore database kmjxc with recovery
sp_configure ‘allow’,0
reconfigure with override
8.重起sql server
先做上面的步骤了,不行再执行下面的步骤
1、在SQL查询分析器中执行以下语句:(注以下所用的dbname为数据库名称,请客户手工改为自己的数据库名)
use dbname
dbcc checkdb
2、查看查询结果,有很多红色字体显示,最后结果有这样的提示:
CHECKDB 发现了x个分配错误和 x 个一致性错误(在数据库 ‘dbname’ 中)。
一般情况下,引起分配错误的原因是磁盘损坏或突然停电;一致性错误可能是数据库中的表或索引坏,一般都可修复。
3、查看红色字体,并把有错误的数据库表名记录下来,或把索引损坏的表名记录下来。
4、把数据库设置为单用户模式,直接在查询分析器中执行以下语句即可:
EXEC sp_dboption ‘dbname’, ‘single user’, ‘TRUE’.
5、进入查询分析器执行如下语句:
use kmjxcv3
dbcc checkdb(’dbname’,repair_allow_data_loss)——-修复数据库
dbcc checkdb (‘dbname’,REPAIR_REBUILD)—————-修复数据库索引
6、再执行:dbcc checkdb,检测数据库,出现结果为:
CHECKDB 发现了0个分配错误和 0个一致性错误(在数据库 ‘dbname’ 中)。
数据库已经修复完毕。
7、取消单用户模式,即直接在查询分析器中执行以下语句即可:
EXEC sp_dboption ‘dbname’, ‘single user’,'FALSE’
--------------------------------------------------------------------------------------