怎么自动判数据库损坏【质疑,不能使用等】,并且把损坏的数据库备份,在通过以前备份的数据在还原

andysun88 2013-11-20 09:56:47
各位:
我现在的问题是,怎么自动判断数据库损坏,最有效的方法,DBCC CheckDB花费的时间较长,有没有好的方法来判断数据库不能使用,质疑,等不能写数据的情况。
...全文
290 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 13 楼 andysun88 的回复:
[quote=引用 12 楼 yupeigu 的回复:] [quote=引用 11 楼 andysun88 的回复:] 还有没有其他的解决方案呢?在研究。
你写个定时任务呗,运行下面的代码,返回数据库的状态:

select name,
       state_desc   --状态,可能是online,offline,suspect等
from sys.databases
[/quote] 上面返回的 state_desc --状态,可能是online,offline,suspect等 不是很懂,我也查看了MSDN,关于他的解释,但是我对一个数据库用DBCC CHECKDB 是错误,但是,这个数据库的 state_desc --状态 一直都是online,为什么不是suspect?一直都搞不懂?麻烦可以说说DBCC CHECKDB 报错的数据库,他的状态怎么还是online?[/quote] 你说的对,这个还真不确定。 比如有个,或者有一些数据页,也就是page损坏了,那么整个数据库还是online。 这个可以在如下的语句中查询到,里面是有问题的数据页:

select *
from msdb.dbo.suspect_pages
如果是数据库有重大的损坏,那么就会处于suspect状态,或者是其他的比如restoring状态,那么这个应该能查询到:

select name,
       state_desc   --状态,可能是online,offline,suspect等
from sys.databases
而如果某个文件有问题,你可以查询这个视图看看:

select DB_NAME(database_id) as database_name,
       name as file_logical_name,
       physical_name,
       state_desc
from sys.master_files
andysun88 2013-11-20
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
[quote=引用 11 楼 andysun88 的回复:] 还有没有其他的解决方案呢?在研究。
你写个定时任务呗,运行下面的代码,返回数据库的状态:

select name,
       state_desc   --状态,可能是online,offline,suspect等
from sys.databases
[/quote] 上面返回的 state_desc --状态,可能是online,offline,suspect等 不是很懂,我也查看了MSDN,关于他的解释,但是我对一个数据库用DBCC CHECKDB 是错误,但是,这个数据库的 state_desc --状态 一直都是online,为什么不是suspect?一直都搞不懂?麻烦可以说说DBCC CHECKDB 报错的数据库,他的状态怎么还是online?
  • 打赏
  • 举报
回复
引用 11 楼 andysun88 的回复:
还有没有其他的解决方案呢?在研究。
你写个定时任务呗,运行下面的代码,返回数据库的状态:

select name,
       state_desc   --状态,可能是online,offline,suspect等
from sys.databases
andysun88 2013-11-20
  • 打赏
  • 举报
回复
还有没有其他的解决方案呢?在研究。
水族杰纶 2013-11-20
  • 打赏
  • 举报
回复
引用 8 楼 andysun88 的回复:
我们用dbcc CHECKDB这个是被动的模式,有没有只要数据库一损坏,我们就能捕获到,在还原数据?什么方法来解决?
1)一般情况即使类似页面的损坏 你没有访问到这个页面也不会报错 2)可以将一些严重的错误 做成警报 发送邮件等通知作业员
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
没有......
andysun88 2013-11-20
  • 打赏
  • 举报
回复
我们用dbcc CHECKDB这个是被动的模式,有没有只要数据库一损坏,我们就能捕获到,在还原数据?什么方法来解决?
  • 打赏
  • 举报
回复
通过加上表锁,也就是tablock,dbcc CHECKDB的速度一般能提高4-5倍
  • 打赏
  • 举报
回复
这个dbcc checkdb是好办法。 我觉得从方法来看,也就是dbcc checkdb,关键的问题是提高dbcc checkdb的速度, 你可以用下面的命令,来加快速度,不过副作用是会加表锁: DBCC CHECKDB(你的数据库) with TABLOCK
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
就算是第三方工具,估计也是调用这些,DBCC CHECKDB 有with physical_only选项,可以用,但是即使是徐海蔚的书,也没有其他方案
--小F-- 2013-11-20
  • 打赏
  • 举报
回复
DBCC CheckDB是我目前见到的最合理,最准确的办法。
天善智能 2013-11-20
  • 打赏
  • 举报
回复
一般情况下是用DBCC CHECKDB去看看有没有损坏的,不过时间相对较长,关注,有没有效率更高的办法
andysun88 2013-11-20
  • 打赏
  • 举报
回复
引用 1 楼 jwwyqs 的回复:
同问,我们现在都是被动的通过判断软件是否正常访问实现的,如果不能访问就做报警
软件判断也是不准确的,如果你的数据库服务器在另外一台机器上,你的机器访问数据库服务器,如果网络断了,你的软件判断是不准确的,有没有其他的方法呢?
jwwyqs 2013-11-20
  • 打赏
  • 举报
回复
同问,我们现在都是被动的通过判断软件是否正常访问实现的,如果不能访问就做报警
qq24447678 2013-11-20
  • 打赏
  • 举报
回复
相对较长还好,会不会锁住库?
jwwyqs 2013-11-20
  • 打赏
  • 举报
回复
唐诗三百首 2013-11-20
  • 打赏
  • 举报
回复
引用 20 楼 andysun88 的回复:
不好意思,我想问下,怎么样的异常才是数据库损坏?我也想了这样的情况,但是不知道是怎么样的异常。
按错误代码或错误信息中的关键词判断, SQL Server中数据库损坏的代码是824,其内容: SQL Server 检测到基于一致性的逻辑 I/O 错误 %1!。在文件 '%6!' 中、偏移量为 %5! 的位置对数据库 ID %4! 中的页 %3! 执行 %2! 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。
andysun88 2013-11-20
  • 打赏
  • 举报
回复
引用 19 楼 ap0405140 的回复:
[quote=引用 18 楼 andysun88 的回复:] 不是经常dbcc checkdb(),因为我们软件有时暴力关机或其他的情况使数据丢失或者数据库损坏,为了尽量使风险降到最低,最理想的方案就是当数据库损坏的时候,能够及时知道,马上还原。谢谢你的回答。
可以在前端程序中加入try..chach..捕获异常,如访问数据时出错,自动做数据库还原后再次访问.[/quote] 不好意思,我想问下,怎么样的异常才是数据库损坏?我也想了这样的情况,但是不知道是怎么样的异常。
唐诗三百首 2013-11-20
  • 打赏
  • 举报
回复
引用 18 楼 andysun88 的回复:
不是经常dbcc checkdb(),因为我们软件有时暴力关机或其他的情况使数据丢失或者数据库损坏,为了尽量使风险降到最低,最理想的方案就是当数据库损坏的时候,能够及时知道,马上还原。谢谢你的回答。
可以在前端程序中加入try..chach..捕获异常,如访问数据时出错,自动做数据库还原后再次访问.
andysun88 2013-11-20
  • 打赏
  • 举报
回复
引用 17 楼 ap0405140 的回复:
[quote=引用 13 楼 andysun88 的回复:] 上面返回的 state_desc --状态,可能是online,offline,suspect等 不是很懂,我也查看了MSDN,关于他的解释,但是我对一个数据库用DBCC CHECKDB 是错误,但是,这个数据库的 state_desc --状态 一直都是online,为什么不是suspect?一直都搞不懂?麻烦可以说说DBCC CHECKDB 报错的数据库,他的状态怎么还是online?
请问LZ的系统出现什么问题,为什么经常需要dbcc checkdb()和判断数据库状态.[/quote] 不是经常dbcc checkdb(),因为我们软件有时暴力关机或其他的情况使数据丢失或者数据库损坏,为了尽量使风险降到最低,最理想的方案就是当数据库损坏的时候,能够及时知道,马上还原。谢谢你的回答。
加载更多回复(3)

22,207

社区成员

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

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