zoukankan      html  css  js  c++  java
  • SQL Server 2005日志文件损坏的恢复方法

    当SQL Server 2005数据库的日志文件损坏,而数据文件完好的时候,数据库出现质疑状态,怎么恢复呢?

    下面就讲一下具体的过程:


    1.首先停止服务器: NET STOP MSSQLSERVER

    2.把日志文件挪走

    3.开启服务器:         NET START MSSQLSERVER

    4.修改数据库为紧急模式,并修改数据库为单用户模式

    alter database 数据库名 set emergency

    go

    alter database 数据库名 set single_user

    go

    5.开始修复

    dbcc checkdb(数据库名,REPAIR_ALLOW_DATA_LOSS)

    go

    dbcc checkdb(数据库,REPAIR_REBUILD)

    go

    dbcc checkdb(数据库)

    go

    6.修改数据库为多用户模式

    alter database 数据库名 set multi_user


    至此数据库恢复正常状态。

    下面对修复时设置和一些修复选项做一下介绍:

    1.在使用:REPAIR_ALLOW_DATA_LOSS  、REPAIR_REBUILD选项是,数据库必须处于单用户模式,这就是进行上述第4点的原因。

    2.REPAIR_ALLOW_DATA_LOS:尝试修复所有错误,但是有可能会有一些数据丢失。

    3.REAPIR_REBUILD:执行次要的、快速修复(修复非聚集索引的额外键),耗时的修复(重建索引)。

    4.具体的选项说明可以参考:http://msdn.microsoft.com/zh-cn/library/ms176064(v=SQL.90).aspx,写得很详细。


    下面是一个具体的例子:

    sql查询出问题?
    http://bbs.csdn.net/topics/390658107?page=1#post-396242501
    1.
    数据库是sql2000,有张表数据60多个字段,数据有250万条左右,这几天已通过sql查询分析器来查询就出问题了。查数据少点好像是可以的。
    报错是:
    服务器: 消息 7987,级别 22,状态 3,行 1
    在数据库 'A-bus' 中检测到一个可能的数据库一致性问题。应该对数据库 'A-bus' 运行 DBCC CHECKDB 和 DBCC CHECKCATALOG。

    连接中断


    我看到网上的方法做
    alter database [A-bus] set single_user
     
    dbcc checkdb('A-bus',repair_rebuild)
     
    alter database [A-bus] set multi_user


    但运行了30多分钟了还没有反应。
    还有我把A-bus这个数据库里的一张表数据导出到时大概导到240万条时就不动了,一直是这个界面。那可怎么办啊?我把那张表里的某个字段的数据类型从nvarchar 32 改成varchar 10也不行,有提示:
    - 无法修改表。  
    ODBC 错误: [Microsoft][ODBC SQL Server Driver][SQL Server]SqlDumpExceptionHandler: 进程 51 发生了严重的异常 c0000005 EXCEPTION_ACCESS_VIOLATION。SQL Server 将终止该进程。


    [Microsoft][ODBC SQL Server Driver][SQL Server] 
    [Microsoft][ODBC SQL Server Driver][SQL Server]Location:logrec.cpp:501
    Expression:FALSE
    SPID: 51
    Process ID:2812
    Description:Invalid switch value


    2.
    我用dts和bcp导数据都少了4万多条数据,初步分析少了最近一个多月的数据。
    但在错误表里精确查询最近的数据是有的,现在怎么把这个4万多条数据导出来。
    还有我用dbcc checkdb('A-bus') WITH PHYSICAL_ONLY执行后有报错如下:


    服务器: 消息 8928,级别 16,状态 1,行 1
    对象 ID 2057058364,索引 ID 0: 未能处理页 (1:346127)。详细信息请参阅其它错误。
    服务器: 消息 8944,级别 16,状态 1,行 1
    表错误: 对象 ID 2057058364,索引 ID 0,页 (1:346127),行 0。
    测试(columnOffsets->offTbl [varColumnNumber] <= (nextRec - pRec))失败。
    值为 517 和 501。
    服务器: 消息 8928,级别 16,状态 1,行 1
    对象 ID 2057058364,索引 ID 0: 未能处理页 (1:346128)。详细信息请参阅其它错误。
    服务器: 消息 8939,级别 16,状态 1,行 1
    表错误: 对象 ID 2057058364,索引 ID 0,页 (1:346128)。测试(*(((int*) &m_reservedB) + i) == 0)失败。值为 1 和 108。
    'A-bus' 的 DBCC 结果。
    对象 'bus_info' 有 0 行,这些行位于 0 页中。
    CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在表 'bus_info' 中,该表的对象 ID 为 2057058364)。
    CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在数据库 'A-bus' 中)。
    repair_allow_data_loss 是最低的修复级别(对于由 DBCC CHECKDB (A-bus ) 发现的错误而言)。
    DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


    3.通过repair_allow_data_loss选项修复

    我修复好了。
    你指的影响是什么?
    修复好了这张表还能继续用吗?
    要经常用用dbcc checkdb('数据库名')来检测吗?这样检测会对数据有影响吗?

    数据的确有丢失。大概有20多条记录。

    回复:
    影响就是会有少量的数据都是,“修复允许数据丢失”,应该是可以继续用的,你select一下试试,
    不过最好是重新导出一份数据。
    还有你说的对,确实得经常的dbcc checkdb一下,来检测数据的,
    不过这个操作最好是在晚上进行,否则会很慢,如果是晚上 可以加上 with tablock,
    那么速度可以提升好几倍。

  • 相关阅读:
    Android之SurfaceView学习(一)转转
    【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析
    【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流
    【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权
    【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
    【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)
    【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)
    SmartSql 快速使用指南
    SmartSql 性能评测
    【.NET Core项目实战-统一认证平台】第二章网关篇-定制Ocelot来满足需求
  • 原文地址:https://www.cnblogs.com/momogua/p/8304648.html
Copyright © 2011-2022 走看看