服务器系统集成及数据服务中心

 

一级栏目
一级栏目
一级栏目
一级栏目
一级栏目
一级栏目
一级栏目
一级栏目
甯傚満鍔ㄦ?…………………………………………………………………………………………>>>

SQL数据库受损MDF修复过程

mdf文件受损,坏道。原因为:阵列中一含新鲜数据的硬盘损坏而无法修复及通过各种办法也不能提取物理数据,不得已使用了含过期数据的硬盘进行恢复;其结果可想而知,数据是不能用的,内含大量错误,必须修复才能使用,以最大限度的晚会损失。

1、系统表维修

USE zygl3_data
GO
SELECT au.allocation_unit_id, OBJECT_NAME(p.object_id) AS table_name, fg.name AS filegroup_name,
au.type_desc AS allocation_type, au.data_pages, partition_number
FROM sys.allocation_units AS au
JOIN sys.partitions AS p ON au.container_id = p.partition_id
JOIN sys.filegroups AS fg ON fg.data_space_id = au.data_space_id
WHERE au.allocation_unit_id = 72057594055098368 OR au.allocation_unit_id = 72057594055098368
ORDER BY au.allocation_unit_id
GO

2、过程

经验,使用systools工具在2003下运行很快,在win7-64下运行很慢;
第一个systools进程,占用内存很大,要使用360加速,点击一键加速即可;
否则内存占用达到接近2G时,程序会崩溃;
第二个我systool进程,比较好,它调用了sqlwb.exe程序,使得主程序占用内存基本稳定,不再增长,而sqlservr占用增长,不过一般不超过1.8G就不增了。

打开sql企业管理器,指向master,新建查询。
执行
alter database zygl3_data set emergency

清空屏幕

执行以下语句
use master
declare @databasename varchar(255)
set @databasename=''zygl3_data''
exec sp_dboption @databasename, N''single'', N''true''将目标数据库置为单用户状态
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N''single'', N''false''将目标数据库置为多用户状态

这时候,发现路径错误,手工建立所需路径;本例是手工在D盘建立sqldata目录,

接着执行以下语句(与上相同)
use master
declare @databasename varchar(255)
set @databasename=''zygl3_data''
exec sp_dboption @databasename, N''single'', N''true''将目标数据库置为单用户状态
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N''single'', N''false''将目标数据库置为多用户状态

日志文件生成;以上是在win2003R2-32下操作完成,在win7-64&sql64下不通过。
但是数据库存在错误:


USE zygl3_data
GO
SELECT au.allocation_unit_id, OBJECT_NAME(p.object_id) AS table_name, fg.name AS filegroup_name,
au.type_desc AS allocation_type, au.data_pages, partition_number
FROM sys.allocation_units AS au
JOIN sys.partitions AS p ON au.container_id = p.partition_id
JOIN sys.filegroups AS fg ON fg.data_space_id = au.data_space_id
WHERE au.allocation_unit_id = 72057594055098368 OR au.allocation_unit_id = 72057594055098368
ORDER BY au.allocation_unit_id
GO

错误信息SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂(签名应该为: 0xaaaaaaaa,但实际为: 0x55aaaaaa)。在文件 ''F:\888东营\ok\zygl3_data.mdf'' 中、偏移量为 0x00000000b8e000 的位置对数据库 ID 7 中的页 (1:1479) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。

DBCC CHECKDB
消息 7985,级别 16,状态 2,第 1 行
系统表预检查: 对象 ID 4。无法使用闩锁类型 SH 读取并闩锁页 (1:600071)。由于不可修复的错误,CHECK 语句已终止。
zygl3_data的 DBCC 结果。
消息 5233,级别 16,状态 98,第 1 行
表错误: 分配单元 ID 262144,页 (1:600071)。测试(IS_OFF (BUF_IOERR, pBUF->bstat))失败。值是 12716297 和 -1。
CHECKDB 发现有 0 个分配错误和 1 个一致性错误与任何单个的对象都没有关联。
CHECKDB 在数据库 ''zygl3_data'' 中发现 0 个分配错误和 1 个一致性错误。

select * from sysobjects
消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂(签名应该为: 0xaaaaaaaa,但实际为: 0x55aaaaaa)。在文件 ''E:\zygl3zc_Data\zzz\zygl3_data.mdf'' 中、偏移量为 0x0000018fd1a000 的位置对数据库 ID 5 中的页 (1:818829) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。

select * from sysindexes
消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂(签名应该为: 0xaaaaaaaa,但实际为: 0x55aaaaaa)。在文件 ''E:\zygl3zc_Data\zzz\zygl3_data.mdf'' 中、偏移量为 0x0000018fd1a000 的位置对数据库 ID 5 中的页 (1:818829) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。


select * from syscolumns
消息 824,级别 24,状态 2,第 1 行
SQL Server 检测到基于一致性的逻辑 I/O 错误 页撕裂(签名应该为: 0xaaaaaaaa,但实际为: 0x55aaaaaa)。在文件 ''E:\zygl3zc_Data\zzz\zygl3_data.mdf'' 中、偏移量为 0x0000018fd1a000 的位置对数据库 ID 5 中的页 (1:818829) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。

处理步骤:
第一步: 处理可以访问的数据表
(1.1) 找出哪些表不可访问;
  新建立一个sql svr数据库,数据库实体名为AisNew。进入查询分析器,执行如下SQL:
use zygl3_data
DECLARE @TbName VARCHAR(80)
DECLARE FindErrTable SCROLL CURSOR FOR 
  select name from zygl.dbo.sysobjects where xtype=''u'' order by name
OPEN FindErrTable
FETCH FindErrTable INTO  @TbName
  WHILE @@FETCH_STATUS<>-1
    BEGIN
          print  @TbName
          exec( ''select top 1 * from'' +  @TbName)
          FETCH FindErrTable INTO  @TbName
    END
PRINT ''Scan Complate…''
CLOSE FindErrTable
DEALLOCATE FindErrTable

************************
ALTER  DATABASE  zygl3_data  set  SINGLE_USER   
Go                    将数据库设置为单用户模式
DBCC  CHECKDB (zygl3_data, repair_allow_data_loss)  with NO_INFOMSGS 
go    允许丢失数据  
ALTER  DATABASE  zygl3_data  SET  MULTI_USER  
go 

发布时间:2017/6/11 阅读:2092次 来源:烟台数据恢复老李
 


 
甯傚満鍔ㄦ?分类
   
  行业新闻
 
  公司动态
 
  技术资料
 
  电脑维修
 
  恢复案例
 
  SQL数据库
 
  磁盘阵列
 
  服务器
 
  财务软件
 
  网络问题
 
  linux-XFS
 
  苹果电脑&系统
 
  安卓系统相关
 
   
 
友情链接
 
 
 
 
 
   
公司地址:烟台电脑市场#308
电话:0535-6688830 E-Mail:163@163.com
Copyright©2011-2012 烟台瑞驰科贸有限公司 All Rights Reserved.
鲁ICP备11014811号-1
您是本站第 位访问者