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,
    那么速度可以提升好几倍。

  • 相关阅读:
    剑指offer-二维数组中的查找
    TF-IDF(term frequency–inverse document frequency)
    Java实现中文字符串的排序功能
    当前课程
    【R】资源整理
    CentOS相关
    【转】Setting up SDL Extension Libraries on MinGW
    【转】Setting up SDL Extension Libraries on Visual Studio 2010 Ultimate
    【转】Setting up SDL Extension Libraries on Code::Blocks 12.11
    【转】Setting up SDL Extension Libraries on Visual Studio 2019 Community
  • 原文地址:https://www.cnblogs.com/momogua/p/8304648.html
Copyright © 2011-2022 走看看