紧急求救,数据库恢复问题

taia 2009-08-15 10:28:11
客户的一台数据库服务器(SQL2000)意外停电,导致系统无法重启,只好把数据库文件拷贝出来

但是无法在另外一台SQL2000上附加,提示 在数据库"XXXX"中检测到一个可能的数据库致性问题,应对数据库“XXXXX”运行DBCC CHECKDB 和DBCC CHECKCATALOG
由于无法附加成功,怎么对这个数据库做DBCC呢

另外手上还有近三天的自动备份文件,怎样恢复回去呢?
...全文
198 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
taia 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 beirut 的回复:]
引用 19 楼 taia 的回复:
你回复的时候提示是成功还是失败?你有几个文件?就一个mdf?
[/Quote]

附加失败,就一个MDF和一个LDF
黄_瓜 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 taia 的回复:]
不好意思,很简单的问题让我说复杂了


正常情况下,附加成功后,企业管理器的数据库列表中会增加当前附加成功的数据库

但的附加失败了,所以列表中没有产生附加的数据库名
[/Quote]

你回复的时候提示是成功还是失败?你有几个文件?就一个mdf?
taia 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sql77 的回复:]

但是无法在另外一台SQL2000上附加,提示 在数据库"XXXX"中检测到一个可能的数据库致性问题,应对数据库“XXXXX”运行DBCC CHECKDB 和DBCC CHECKCATALOG

你有没有运行那两个东西呀?????
[/Quote]

你可能还没看明白,说了列表里没有出现我要恢复的数据库

DBCC CHECKDB 和DBCC CHECKCATALOG 这两个命令都要带上数据库名的,如果不带参数表示当前数据库,可是我的那个数据库都没有在列表里出现,这两个命令有用吗?

另外,我也根据网上一些做法,在企业管理器里新增一个同名数据库,然后停掉数据库服务,把对应的MDF文件覆盖新增的数据库的MDF,再启动SQL服务,这样数据库的名字有了,但

DBCC CHECKDB

后提示由于文件 ID 0(位于数据库 'approve_new' 中)无效,所以未能打开 FCB。
q85958341 2009-08-15
  • 打赏
  • 举报
回复
创建个新的数据

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 输出了错误信息,请与系统管理员联系。[brown][/i]
说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
正确执行完成的提示应该类似于:
警告: 数据库 'test' 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
此时打开在SQL Server& nbsp;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
SQL77 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 taia 的回复:]
不好意思,很简单的问题让我说复杂了


正常情况下,附加成功后,企业管理器的数据库列表中会增加当前附加成功的数据库

但的附加失败了,所以列表中没有产生附加的数据库名
[/Quote]

但是无法在另外一台SQL2000上附加,提示 在数据库"XXXX"中检测到一个可能的数据库致性问题,应对数据库“XXXXX”运行DBCC CHECKDB 和DBCC CHECKCATALOG

你有没有运行那两个东西呀?????
taia 2009-08-15
  • 打赏
  • 举报
回复
不好意思,很简单的问题让我说复杂了


正常情况下,附加成功后,企业管理器的数据库列表中会增加当前附加成功的数据库

但的附加失败了,所以列表中没有产生附加的数据库名
黄_瓜 2009-08-15
  • 打赏
  • 举报
回复
还是不明白,你在描述一下吧
SQL77 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 taia 的回复:]
不好意思,打字快了,多打一个字


由于附加失败,所以在数据库列表中,没有看到我要恢复的数据库
[/Quote]
这是什么错误????没有看到我要恢复的数据库
黄_瓜 2009-08-15
  • 打赏
  • 举报
回复
是不是就一个mdf文件?
taia 2009-08-15
  • 打赏
  • 举报
回复
不好意思,打字快了,多打一个字


由于附加失败,所以在数据库列表中,没有看到我要恢复的数据库
SQL77 2009-08-15
  • 打赏
  • 举报
回复
数据库名对上了吗????看看蒂哥的
feixianxxx 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 taia 的回复:]
感谢楼上几位解答,问题是现在附加失败,在数据库列表中找不到要恢复的数据库名
[/Quote]
会不会是这个错误 附加不上去 看下我的博客
http://blog.csdn.net/feixianxxx/archive/2009/07/26/4382029.aspx
taia 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sql77 的回复:]
引用 10 楼 taia 的回复:
感谢楼上几位解答,问题是现在附加失败,在数据库列表中找不到要恢复的数据库名

你是BAK文件还是MDF文件?

BAK用还原,MDF才用附加
[/Quote]

MDF附加我知道,目前就是附加失败,并且无法在数据库列表中找到对应的数据表名,所以一些SQL命令无法针对执行
SQL77 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 taia 的回复:]
感谢楼上几位解答,问题是现在附加失败,在数据库列表中找不到要恢复的数据库名
[/Quote]
你是BAK文件还是MDF文件?

BAK用还原,MDF才用附加
taia 2009-08-15
  • 打赏
  • 举报
回复
感谢楼上几位解答,问题是现在附加失败,在数据库列表中找不到要恢复的数据库名
黄_瓜 2009-08-15
  • 打赏
  • 举报
回复
--11.3.4 部分数据文件损坏的修复处理示例
USE master

--创建数据库
CREATE DATABASE db
ON PRIMARY(
NAME='db_data',
FILENAME= 'c:\db_data.mdf'),
FILEGROUP db_fg1(
NAME = 'db_fg1_data',
FILENAME = 'c:\db_fg1_data.ndf'),
FILEGROUP db_fg2(
NAME = 'db_fg2_data',
FILENAME = 'c:\db_fg2_data.ndf')
LOG ON(
NAME='db_log',
FILENAME ='c:\db.ldf')
GO

--创建表
CREATE TABLE db.dbo.ta(id int) ON [PRIMARY]
CREATE TABLE db.dbo.tb(id int) ON db_fg1
CREATE TABLE db.dbo.tc(id int) ON db_fg2
INSERT db.dbo.tb SELECT id FROM sysobjects
GO
--做文件组备份
BACKUP DATABASE db FILEGROUP='db_fg1' TO DISK='c:\db_fg1.bak' WITH FORMAT

--备份后,再做数据处理
INSERT db.dbo.ta SELECT id FROM sysobjects
GO

/*--下面演示了破坏数据文件的处理,这些操作在操作系统中进行
1. 停止SQL Server服务(msqlserver服务)
2. 删除文件 c:\db_fg1_data.ndf (模拟破坏)
3. 重新SQL Server服务,此时数据库DB置疑
--*/
GO

--下面演示了如何恢复数据
--首先要备份当前日志
BACKUP LOG db TO DISK='c:\db_log.bak' WITH FORMAT,NO_TRUNCATE
--利用文件组备份恢复破坏的文件
RESTORE DATABASE db FILEGROUP='db_fg1' FROM DISK='c:\db_fg1.bak' WITH NORECOVERY
--还原到日志点
RESTORE LOG db FROM DISK='c:\db_log.bak' WITH RECOVERY
--显示已经恢复的数据
SELECT COUNT(*) FROM db.dbo.tb
SELECT COUNT(*) FROM db.dbo.ta
GO

--删除测试
DROP DATABASE db
--小F-- 2009-08-15
  • 打赏
  • 举报
回复
总的说来就是恢复单用户模式 具体的内容你可以去参考一些资料
--小F-- 2009-08-15
  • 打赏
  • 举报
回复
备份文件直接还原

停电意外终止的按照1楼的试着去恢复 祝你好运
guguda2008 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
SQL codeUSE MASTERGO
sp_dboption ‘databaseName’, ’singleuser’, ‘true’GoDBCC CHECKDB(’databaseName’, REPAIR_REBUILD)GoUSE databaseNamegoexec sp_msforeachtable ‘DBCC CHECKTABLE(''’?''’,REPAIR_REBUILD)’go
sp_dboption ‘databaseName’, ’singleuser’, ‘false’Go
如果还不行,可以采用允许丢失数据的方式修复,如下:USE MASTERGO
sp_dboption ‘databaseName’, ’singleuser’, ‘true’GoDBCC CHECKDB(’databaseName’, REPAIR_ALLOW_DATA_LOSS)GoUSE databaseNamegoexec sp_msforeachtable ‘DBCC CHECKTABLE(''’?''’,REPAIR_REBUILD)’go
sp_dboption ‘databaseName’, ’singleuser’, ‘false’Go



复制如下命令,写入记事本,保存为:运行CHKDSK.bat 双击运行,完了重启电脑.一般能解决的.@ECHOOFFfor%%1in (c: d: e: f: G: h: i: j: k: l: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:) do (if exist%%1 ECHO Y|chkdsk%%1/R/x)@pause
[/Quote]
MARK 学习
SQL77 2009-08-15
  • 打赏
  • 举报
回复
另外手上还有近三天的自动备份文件,怎样恢复回去呢?
RESTORE DATABASE

RESTORE DATABASE { database_name | @database_name_var }
< file_or_filegroup > [ ,...n ]
[ FROM < backup_device > [ ,...n ] ]
[ WITH
[ RESTRICTED_USER ]
[ [ , ] FILE = { file_number | @file_number } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
[ ,...n ]
[ [ , ] NORECOVERY ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] REPLACE ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]
加载更多回复(5)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧