置疑数据库

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值