USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'
Go
sp_dboption '置疑的数据库名', 'single user', 'true'
Go
DBCC CHECKDB('置疑的数据库名')
Go
update sysdatabases set status =28 where name='置疑的数据库名'
Go
sp_configure 'allow updates', 0 reconfigure with override
Go
sp_dboption '置疑的数据库名', 'single user', 'false'
Go
当数据库出现问题以后,按照以下步骤进行处理
1 了解数据库出错的原因,以防止我们将简单的问题复杂化,或走错解决的方向
1.1 操作系统是否被恢复过?
1.2 系统是否安装过还原软件,或有其它操作系统一级的限制(权限限制、软件限制)?
1.3 突然断电的时候? 断电的那一刻正在进行哪些操作?(突然断电时,正在进行的写操作最容易导致数据库损坏或是置疑)
1.4 不知道什么原因,突然就出现了问题?(是否硬件有损坏)
2 确认数据库现时的状态
2.1 未置疑,但查询的时候总出现问题,或是用某一个功能的时候老是出现问题
2.2 置疑
3 修复数据库
3.1 错误(1.1): 确认是此问题后,将数据库分离之后,再附加回去,问题可以解决,但要注意,如果不是确认此原因,不要做些操作,有些置疑的数据库一旦分离就不可以再附加
3.2 错误(1.2): 关闭相应还原软件
3.3 错误(2.1):用以下语句进行修复
3.3.1 检查数据库是否存在错误
DBCC CHECKDB('置疑的数据库名')
3.3.2 有错误则修复该数据库,
/* 建议
先用repair_rebuild修复,
如仍有问题,再重建一次索引,
如还有问题再使用repair_allow_data_loss修复(可能会导致一些数据丢失),
修复完成后,核对数据是否准确
*/
USE MASTER
GO
--改数据库为单用户模式
sp_dboption '置疑的数据库名', 'single user', 'true'
Go
-- 修复数据库 至没有错误,
-- 以下代码不需全部运行-- --------------------------------------
DBCC CHECKDB('置疑的数据库名' , repair_rebuild )
-- ----------------------------------------
-- 重建索引
declare @tn nvarchar(100)
DECLARE authors_cursor CURSOR FOR select name from sysobjects where type = 'u'
OPEN authors_cursor
FETCH NEXT FROM authors_cursor INTO @tn
WHILE @@FETCH_STATUS = 0
BEGIN
print '-------------------'
print '重建表索引 : ' +@tn
dbcc dbreindex(@tn)
FETCH NEXT FROM authors_cursor INTO @tn
END
CLOSE authors_cursor
DEALLOCATE authors_cursor
-- ----------------------------------------
DBCC CHECKDB('置疑的数据库名' , REPAIR_ALLOW_DATA_LOSS )
-- ----------------------------------------
Go
--取消数据库的单用户模式
sp_dboption '置疑的数据库名', 'single user', 'false'
Go
3.4 错误(2.2) 已经置疑的数据库,按以下步骤处理
3.4.1 将数据库置为[紧急状态] (参考以下代码)
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'
Go
sp_dboption '置疑的数据库名', 'single user', 'true'
Go
DBCC CHECKDB('置疑的数据库名')
Go
update sysdatabases set status =28 where name='置疑的数据库名'
Go
sp_configure 'allow updates', 0 reconfigure with override
Go
sp_dboption '置疑的数据库名', 'single user', 'false'
Go
/*
完成以后, 使用查询分析器, 也能用dbcc checkdb 看到错误 , 也已可以查看到相应表的数据,但无法进行修复, 此时进入到下一步,重建LOG文件
*/
3.4.2 重建LOG文件(参考代码如下)
dbcc rebuild_log('possql','d:\data\test_log.ldf')
/*
完成以后, 此时数据库状态已变为[dbo专门]状态,
再用dbcc checkdb(‘置疑的数据库名’)
如仍有错误,则继续下一步
*/
3.4.3 修复数据库,参考错误(2.1)的处理方法
3.5 使用(2.1)仍无法修复成功,的处理
3.5.1 重复检查错误出现的原因
查找到是哪一张表或是哪一些表出错,
使用dbcc checkdb(‘置疑的数据库名’) ,根据出现的提示,
服务器: 消息 8981,级别 16,状态 1,行 1
表错误: 对象 ID 421576540 ,…………
查找到表名(表名为name字段)
Select * from [置疑数据库名]..sysobjects where id = 421576540
再使用 dbcc dbreindex(‘表名’) 和 dbcc checktable(‘表名’ , 选项) ,选项同dbcc checkdb
注: 如仅系统表出现问题,则可以将数据导出至另一个数据库,以保全数据;
如用户表出现问题的话,则该表数据不可导出,即该表数据丢失
3.5.2 导出至另外一个数据库
3.5.2.1 重建一个结构完全相同的空库
3.5.2.2 循环导出所有数据
USE '新建的数据库名'
GO
declare @NewDB varchar(255) , @OldDB varchar(255)
select @NewDB = '新建的数据库名' , @OldDB = '置疑的数据库名'
declare @str nvarchar(4000)
declare @tn nvarchar(100)
/*
复制数据至另一个数据库: 要求二个库结构一模一样,且新的数据库的数据会被全被清除
*/
DECLARE authors_cursor CURSOR FOR select name from sysobjects where type = 'u' -- and name not in (’填有错误的表名,这些表不导出至新数据库’)
OPEN authors_cursor
FETCH NEXT FROM authors_cursor INTO @tn
WHILE @@FETCH_STATUS = 0
BEGIN
print '-------------------'
print '复制表数据 : ' + @tn
set @str = N'alter table '+ @tn + ' disable trigger all
truncate table '+ @tn + '
insert '+ @tn + ' select * from '+ @OldDB + '..'+ @tn + '
alter table '+ @tn + ' enable trigger all'
execute(@str)
FETCH NEXT FROM authors_cursor INTO @tn
END
CLOSE authors_cursor
DEALLOCATE authors_cursor
MSSQL数据库附加数据库错误5173解决
备份你的数据文件,试试按下面的步骤处理能否解决:
1.新建一个同名的数据库
2.再停掉sql server(注意不要分离数据库)
3.用要附加的数据文件覆盖掉这个新建的数据库
4.再重启sql server
5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
数据库的脚本创建一个新的数据库,并将数据导进去就行了.
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'
Go
sp_dboption '置疑的数据库名', 'single user', 'true'
Go
DBCC CHECKDB('置疑的数据库名')
Go
update sysdatabases set status =28 where name='置疑的数据库名'
Go
sp_configure 'allow updates', 0 reconfigure with override
Go
sp_dboption '置疑的数据库名', 'single user', 'false'
Go