数据库质疑修复(SUSPECT)总结,DBCC报错
当SQL SERVER数据库状态为质疑(SUSPECT)状态时,我们可以⽤以下⽅法来处理: DBCC报错
1. 修改数据库为紧急模式:ALTER DATABASE DBName SET EMERGENCY .
2. 检查数据库的完整性:DBCC CHECKDB(‘DBName’)
3. 检查没有错误则恢复数据库为正常模式:ALTER DATABASE DBName SET ONLINE;
4 如检查数据库有错误则修改数据库为单⽤户模式,依情况选择以下命令⾏进⾏修复数据;
DBCC CHECKDB('DBName', REPAIR_FAST);
DBCC CHECKDB('DBName', REPAIR_REBUILD);
DBCC CHECKDB('DBName', REPAIR_ALLOW_DATA_LOSS);
修复完成后将数据库改为正常模式,重启SQL服务或重启服务器。
ALTER DATABASE DBName SET EMERGENCY /* 修改数据库为紧急模式*/
ALTER DATABASE DBName SET SINGLE_USER /* 修改数据库为单⽤户模式*/
ALTER DATABASE DBName SET MULTI_USER /* 修改数据库为多⽤户模式*/
ALTER DATABASE DBName SET ONLINE /* 数据库从紧急&单⽤户&多⽤户模式恢复为正常模式*/
DBCC CHECKDB('DBName') /* 检查数据库完整性*/
DBCC CHECKDB('DBName', REPAIR_FAST) /* 快速修复数据库*/
DBCC CHECKDB('DBName', REPAIR_REBUILD) /* 重建索引并修复*/精彩演讲视频
拭目以待是什么意思DBCC CHECKDB('DBName', REPAIR_ALLOW_DATA_LOSS) /*如果必要允许丢失数据修复,数据库修复需在单⽤户模式下进⾏
作者:
email的格式出处:
数据库质疑修复总结 For SQL Server 2000/2005/2008/2008R2
转⾃:blogs./apgcdsd/2013/06/26/for-sql-rver-2000200520082008r2/
本⽂的步骤基于以下条件:
1. SQL Server可以启动。
2. 数据库没有做有效的备份。
3. 当前⽤户有Sysadmin权限。
数据库质疑的原因会有多种多样,不同的suspect采⽤的步骤也会有所不同,以下的步骤不能适⽤所有的情况,但包括了⼀些基本的步骤。 数据库suspect是指数据库内部处于不⼀致的状态,很有可能会有数据丢失。 我们推荐您从“好的数据库备份”恢复。 我们这⾥所指
的“好的数据库备份”是指:
1. 在做数据库备份之前,您检查过DBCC CHECKDB没有错误。
2. 备份之后的数据库没有更改,或者更改可以忽略。
在做任何修复操作之前,请务必备份.mdf/.ndf以及.ldf⽂件。
2 SQL Server 2000修复步骤
如果没有“好的数据库备份”,我们不能保证没有数据丢失。 以下是恢复suspect数据库 (SQL Server 2000)的⼀般⽅法,供您参考。 同时在操作下列步骤之前,您可以备份质疑数据库的MDF、NDF、LDF⽂件,以便以下步骤恢复失败时能够回滚到原来的状态。
1. 在查询分析器中,运⾏如下命令将数据库置于紧急模式。
Sp_configure 'allow update', 1
Go
Reconfigure with override
Go
Begin Tran
Update master..sysdatabas t status =32768where name ='<DatabaName>’
Commit Tran
--此处<DatabaName>需要替代成您出问题的数据库名字。
--以下同
Go
Select * from sysdatabas
--检查数据库状态是否已经变成 32768
Go
2. 重启SQL Server服务。
3. 如果第⼆步中重启服务,数据库再次进⼊suspect模式,请设置数据库紧急模式,使⽤BCP⽅式导出数据。
否则在查询分析器中,重新连接到SQL Server,运⾏如下命令重建⽇志。
特别注意: dbcc rebuild_log是内部命令,请您阅读附件中的DBCC Rebuild Run Command.doc。 只有当您同意了附件中的内容,才可以运⾏此命令。
dbcc rebuild_log('<DatabaName>’,'<The file name and the path of the log file>')
--此处<The file name and the path of the log file>是新的⽇志⽂件的物理⽂件的绝对地址。
go
如果rebuild_log失败,请运⾏如下命令,
U <DatabaName>
Go
如果数据库在emergency ⽅式能够进⼊紧急模式,直接使⽤BCP⽅式导出数据,没有其他⽅式来恢复数据库。
如果不能进⼊,则没有其他⽅式恢复数据库
如果数据库在Rebuild_log之后恢复正常,进⼊第四步。
4. 关掉查询分析器,再次打开查询分析器,运⾏如下语句,查询出问题的数据库的DBID
Select*from master.dbo.sysdatabas
5. 再运⾏如下命令,检查是否有⼈在使⽤当前出问题的数据库,如果有的话,请将他们退出。
Select * from master.dbo.sysprocess
6. 然后运⾏如下命令,将数据库置于单⽤户使⽤模式。如果设置不⽣效,可以尝试使⽤企业管理器->数据库属性-> 选项来直接设置.exec sp_dboption N'<DatabaName>', N'single', N'true'
7. 在查询分析器中,运⾏如下命令,检查数据库是否有损坏。
dbcc checkdb(‘<DatabaName>')
8. 如果您运⾏上述命令发现数据库有错误。 此时我们需要根据错误来处理。 接下去有两个⽅向。
⽅向⼀:
使⽤Repair_Allow_Data_Loss选项修复数据库。
优点: 可能可以恢复尽量多的数据
缺点:
a) 不⼀定能够将全部错误修复,还有可能越修越多。同时,需要⼤量时间,需要经过多次执⾏修复命令.⼗⼏次,甚⾄数⼗次.修复
时间不能预估.
倒立可以减肥吗b) 就算我们将所有错误修复,我们也不能保证数据在应⽤程序逻辑这⼀层次上的数据正确性,您需要找您的应⽤程序提供商来检查数
据在程序逻辑层次是否正确。
dbcc checkdb ('<DB_name>', REPAIR_ALLOW_DATA_LOSS) go
--此命令可能需要运⾏多次,才能完全修复。
⽅向⼆:
通过BCP,DTS,lect into等⽅式将好的表,或者表中好的数据导出来。建议使⽤BCP的⽅法,这样可以最⼤限度的回复数据.BCP会停在出错的纪录上,但是前⾯的数据就能成功导出.使⽤DTS或Select into的话, 我们很难判断最⼤限度能导出的记录数.
优点:导出来的数据保证在应⽤程序逻辑这⼀层次的正确性
缺点:不会修复数据库中存在的错误,丢失的数据量会⽐较⼤,取决于第7步的运⾏结果。
9. 数据库完全恢复正常之后,将数据库置于正常状态,并将单⽤户模式改成多⽤户模式。(16或者0)
begin tran
update sysdatabas t status =8where name ='db_name'
儿童睡觉打呼噜
commit tran
sp_configure 'allow', 0
reconfigure with override
exec sp_dboption N'<DatabaName>', N'single', N'fal'
另外,在上述步骤之前或者之中,可能会有数据库在企业管理器中看不到,并且⽆法attach的状况。 通常可以建同名数据库(注意:物理⽂件名也要⼀致),停⽌SQL Server,覆盖⽂件,重启SQLServer的⽅式来解决。
3 SQL Server 2005/2008/2008R2修复步骤
⽅法⼀
u master
alter databa<DatabaName>t emergency --设置为紧急模式
alter databa<DatabaName>t single_ur with rollback immediate --设置为单⽤户模式
u<DatabaName> --切换到故障数据库
dbcc checkdb --检查故障数据库
u master --切换到master
alter databa<DatabaName>Rebuild Log on --重建⽇志⽂件
(name=<DatabaName>_log,filename='c:\sql\logs\<DatabaName>_log.LDF')
lect*from sys.databas --验证是否重建成功
dbcc checkdb('<DatabaName>', repair_allow_data_loss) --允许丢失数据修复
生物多样性包括
sp_dboption '<DatabaName>','single ur','fal'
⽅法⼆
alter databa<DatabaName>t emergency
go
alter databa<DatabaName>t single_ur with rollback immediate
go
u master
go
alter databa<DatabaName> Rebuild Log on
研究生准考证(name=<DatabaName>_log,filename='c:\sql\logs\<DatabaName>_log.LDF')
go
u<DatabaName>
go
dbcc checkdb
go
--此时checkdb有错误才需要做步骤d)
d) 此时数据库应处于emergency状态,创建⼀个新数据库,通过bcp/bulk inrt/DTS/SSIS⽅式将数据导出到新的数据库.请注意,这种情况下索引,存储过程,视图等,都需要⼿⼯导出来。
4 导数据总结
明朝地方行政制度
1. 创建⼀个空的数据库。
2. 使⽤脚本禁⽤所有外键约束。
U<NewDataba>
GO
DECLARE@disable BIT
t@disable=1
DECLARE
@sql VARCHAR(500),
@tableName VARCHAR(128),
@foreignKeyName VARCHAR(128)