原帖地址:http://topic.csdn.net/u/20081224/15/8058b7e7-9ae9-4951-aca2-2009f54b24e1.html,是有人问的问题,现在把回答总结一下。
问题:
昨天数据库服务器运行非常之缓慢,结果我把服务器重新硬启动了,昨天windows系统一直运行不起来,运行到最后报未知的硬件错误,今天操作系统起来了,但是数据库现在数据库变成了可疑状态,而且数据库文件最后修改日期变成了2008-12-3日
对于可疑数据库如何恢复?2008-12-3以后的最近的数据会不会丢失?
我把数据库和日志文件拷贝到其他SQL server服务器上,想附加上去,提示“无法在数据库上重做日志记录”
可能有用的解决方案:
一、数据库置疑的处理办法
在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因:
1.错误的删除日志;
2.硬件(HD)损坏,造成日志和数据文件写错误;
3.硬盘的空间不够,比如日志文件过大;
解决办法:
这是最简单的办法是有数据库的全备份,然后恢复即可.
步骤:
1. 删除原始的数据库:
USE MASTER
GO
DROP DATABASE DB_SUEPECT
2.建立同名的数据库:
USE master
GO
CREATE DATABASE DB_SUSPECT
ON
( NAME = DBNAME_DAT, FILENAME = 'C:', SIZE = 10, FILEGROWTH = 5 )
LOG ON
( NAME = 'DBNAME_LOG', FILENAME = 'g:', SIZE = 5MB, FILEGROWTH = 5MB )
GO
3.恢复数据库:
RESTORE DATABASE DB_SUSPECT
FROM DBNAME_BACKUP.DAT
4.数据库完整性检测: DBCC CHECKDB('DB_SUSPECT')
5.重新启动MSSQLSERVER服务.
二、如果没有全备份,那就要用一些特殊的方法
方法一:
1.设置数据库为紧急模式
Use Master
GO
sp_configure 'allow updates', 1
reconfigure with override
GO
UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT'
GO
2.停掉SQL Server服务: NET STOP MSSQLSERVER
3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走:
4.启动SQL Server服务: NET START MSSQLSERVER
5.重新建立一个同名的数据库DB_SUSPECT;
USE master
GO
CREATE DATABASE DB_SUSPECT
ON ( NAME = DBNAME_DAT, FILENAME = 'C:', SIZE = 10, FILEGROWTH = 5 )
LOG ON ( NAME = 'DBNAME_LOG', FILENAME = 'g:', SIZE = 5MB, FILEGROWTH = 5MB )
GO
6.设置数据库运行在单用户的模式:
USE MASTER
GO
ALTER DATABASE DB_SUSPECT SET SINGLE_USER
GO
7.停掉SQL服务: NET STOP MSSQLSERVER
8.把原来的数据文件再覆盖回来:
9.启动SQL Server服务: NET START MSSQLSERVER
10.重新设置SQLSERVER的状态:
USE MASTER
GO
EXEC sp_resetstatus "DB_SUSPECT"
11.数据库完整性检测:
DBCC CHECKDB('DB_SUSPECT')
12.恢复数据库为多用户模式:
USE MASTER
GO
ALTER DATABASE DB_SUSPECT SET MULTI_USER
GO
13.恢复SQLSERVER原始的配置:
USE MATER
GO
UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT'
GO
14.配置SQLSERVER不允许更新系统表:
USE MASTER
GO
sp_configure 'allow updates', 0
reconfigure with override
GO
15.重新启动MSSQLSERVER服务: 最好重新启动操作系统
16.备份数据库:
可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT
补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限.
办法二:
-
使用Log Explorer恢复数据 用日志工具Log Explorer 步骤: 1、查看日志 a、打开log explorer,选择菜单File-->attach log file b、在Log File Selection窗口中,填写连接到要恢复数据的数据库服务器机器名、数据库登录ID及密码,然后点击"Connect"按钮。 c、若连接成功,则窗口左边树将显示命令菜单,这时我们点击Browser下的View Log命令,此时窗口右边则出现该数据库的Log。 2、恢复数据库 这时您只要选择您要恢复对事件点,右键点击选择"undo transation"命令,保存T-SQL代码,然后在查询分析器中执行该T-SQL代码
方法三:
由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。
如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以 恢复数据库,
但是会出现类似下面的提示信息
设备激活错误。物理文件名 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' 可能有误。
已创建名为 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF' 的新日志文件。
但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息
服务器: 消息 1813,级别 16,状态 2,行 1
未能打开新数据库 'test'。CREATE DATABASE 将终止。
设备激活错误。物理文件名 'd:\test_log.LDF' 可能有误。
怎么办呢?别着急,下面我们举例说明恢复办法。
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。
CREATE DATABASE test
ON
(NAME = 'TEST_DAT',FILENAME='C:\TEST_DATA.MDF',SIZE = 10,FILEGROWTH =5)
LOG ON
(NAME = 'TEST_LOG',FILENAME='C:\TEST_LOG.LOG',SIZE =10,FILEGROWTH = 5)
B.停掉数据库服务器:NET STOP MSSQLSERVER
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
D.启动数据库服务器: NET START MSSQLSERVER
此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
F.设置test为紧急修复模式
update sysdatabases set status=-32768 where dbid=DB_ID('test')
此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里 面的表,但是仅仅有系统表
G.下面执行真正的恢复操作,重建数据库日志文件
dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')
执行过程中,如果遇到下列提示信息:
服务器: 消息 5030,级别 16,状态 1,行 1
未能排它地锁定数据库以执行该操作。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。[brown][/i]
说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
正确执行完成的提示应该类似于:
警告: 数据库 'test' 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
H.验证数据库一致性(可省略)
dbcc checkdb('test')
一般执行结果如下:
CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 'test' 中)。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
I.设置数据库为正常状态 :多用户状态
sp_dboption 'test','dbo use only','false'
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成
sp_configure 'allow updates',0
go
reconfigure with override
go
三、总结
1.停止服务器 net stop mssqlserver
2.把原来的数据文件和日志文件移走
3.开启服务器net start mssqlserver
4.删除数据库 drop database test
5.新建数据库 create database test on (name='',filename='',size=,filegrowth=) log on (name='',filename='',size=,filegrowth=)
6修改配置,使得能修改系统表:设置数据库为紧急修复模式,设为单用户模式
sp_configure 'allow updates',1
update sysdatabases set status = -32768 where name = 'test'
alter database test set single_user 或者 sp_dboption 'test','dbo use only','true'
7.重设数据库状态
sp_restestatus 'test'
7.重建日志文件
dbcc rebuild_log(test,'日志文件名')
8.检测数据库的物理一致性
dbcc checkdb(test)
9.设置数据库为多用户模式
alter database test set multi_user 或者 sp_dboption 'test','dbo use only','false'
10.修改配置,使得不能修改系统表
sp_configure 'allow updates',0
reconfigure
11.重启服务器