使用如下方法附加,一个表丢失但在查询分析器可看到
操作数据库突然发生错误,再次打开企业管理器,该数据库置疑,于是我就分离了数据库,但是我使用附加操作就不行了,说什么:19140:808:1错误.
然后我使用了如下的方法来附加数据库:
如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息
服务器: 消息 1813,级别 16,状态 2,行 1
未能打开新数据库 'test '。CREATE DATABASE 将终止。
设备激活错误。物理文件名 'd:\test_log.LDF ' 可能有误。
怎么办呢?别着急,下面我们举例说明恢复办法。
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager里面建立。
B.停掉数据库服务器。
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
D.启动数据库服务器。此时会看到数据库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 输出了错误信息,请与系统管理员联系。
说明您的其他程序正在使用该数据库,如果刚才您在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
我执行完毕以后,我的一个表不见了,但是这个表我在查询分析器里头可以看到.
我在查询分析器里头输入:select * from info_agency
出来如下错误:
服务器: 消息 644,级别 21,状态 3,行 1
未能在索引页 (1:21180) 中找到 RID '16d0b0e870100 ' 的索引条目(索引 ID 0,数据库 'test ')。
连接中断
我该怎么办
[解决办法]
try
use 你的库名
go
exec sp_msforeachtable 'DBCC DBREINDEX( ' '? ' ') '
[解决办法]
看看這個帖子,應該對你有幫助。
http://access911.net/getnews/doc1.asp?mode=a&bid=005701&aid=4807676
[解决办法]
try
2 楼zjcxc(邹建)回复于 2004-11-18 09:14:18 得分 100--估计是表或数据库损坏,试试用下面的语句修复(注意修改库名)
USE MASTER
GO
sp_dboption '你的数据库名 ', 'single user ', 'true '
Go
DBCC CHECKDB( '你的数据库名 ', REPAIR_ALLOW_DATA_LOSS)
Go
USE 你的数据库名
go
exec sp_msforeachtable 'DBCC CHECKTABLE( ' '? ' ',REPAIR_ALLOW_DATA_LOSS) '
exec sp_msforeachtable 'DBCC DBREINDEX( ' '? ' ') '
go
sp_dboption '你的数据库名 ', 'single user ', 'false '
Go
[解决办法]
本人曾经用下面的步骤处理过类似的问题.--并且没发生文件丢失:
1, 试着在不同的文件夹新建同名数据库,
2,停用 sql server
3,并用刚要附加的 .mdf文件覆盖刚建的.mdf文件
4,重启sql
5,并执行下面的语句:
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 '