作者:于 2017年05月10日 发布在分类 / 综合 下,并于 2018年11月20日 编辑
    2018-11-20 10:13:28版本: 数据库修复简要办法
     历史版本

    修改日期 修改人 备注
    2019-04-01 14:17:41[当前版本] 补充
    2019-03-14 11:01:35 1
    2018-12-29 16:34:34 补充
    2018-12-29 15:56:56 补充

    数据库坏了怎么办?数据库置疑了怎么办?数据库修复简要办法

    ------------下文的语句中的MenuItem是举例的,具体表名,需要大家根据情况,自行替换------------

    ------------如果数据库是置疑的,从第一步开始------------

    ------------如果数据库不是置疑的,从11开始------------

    ------------开始修复数据库之前,一定要先备份一下数据库,以防万一------------

    ------------进行数据库修复之前,必须要停止易石的所有服务,退出易石的所有客户端程序------------

    01、分离数据库

    企业管理器=》找到置疑的数据库=》右键=》所有任务=》分离数据库

    02、将坏的数据库文件备份到单独文件夹
    03、解压一个空白数据库出来(注意SQL版本)

    服务端安装目录下\Server\Data下有两个压缩文件,如下图:


    其中yumstonedata.zip是2000/2005/2008数据库的空白数据库文件,yumstonedata2012.zip是SQL2012的。按需解压。

    04、附加空白数据库

    解压出空白数据库文件以后=》企业管理器=》数据库=》右键=》所有任务=》附加数据库=》找到解压出来的yumstone_data.MDF=》确定

    05、停止SQL服务

    开始=》运行=》Services.msc=》找到SQL服务=》右键=》停止

    06、删除之前解压出来的空白数据库文件,MDF和LDF都删除。
    07、拷贝原先备份的坏数据库的mdf文件,粘贴到data目录。
    08、启动SQL服务

    开始=》运行=》Services.msc=》找到SQL服务=》右键=》停止

    09、打开查询分析器,依次执行下列语句,每行都需要执行一次,记得修改第三步Log文件的路径。
    --第一、
    exec sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE /* 打开修改系统表的开关 */
    --第二、
    update sysdatabases set status=32768 where name='yumstone' /* 设置数据库状态 */
    --第三、
    DBCC REBUILD_LOG ('yumstone','c:\Program Files\Yumstone\4.0\Server\Data\yumstone_Log.LDF') /* 重建LDF文件 */
    --第四、
    update sysdatabases set status=0 where name='yumstone' /* 重置数据库状态 */
    --第五、
    restore database yumstone WITH RECOVERY /* 恢复数据库 */
    --第六、
    exec sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE /* 关闭打开修改系统表的开关 */
    10、上述语句执行完以后,几乎就可以解除置疑
    11、SQL企业管理器=》找到有问题的数据库Yumstone=》右键=属性=》选项=》设置为单用户=》确定


    12、关闭SQL企业管理器=》打开SQL查询分析器=》选择master数据库=》执行DBCC检查
    dbcc checkdb('yumstone')
    13、找出全部有问题的表,比如下述描述中的MemberItem表就是有问题的,其他的错误信息可以忽略。
    CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在表 'MemberItem' 中,该表的对象 ID 为 155147598)。
    14、对上一步找出来的有问题的表,执行语句dbcc dbReindex('MenuItem'),尝试进行索引修复。

    执行索引修复语句,如果SQL反馈如下信息,表示修复成功。否则不成功。


    15、对于重建索引修复不了的表,执行语句dbcc checktable('有问题的表名'),尝试进行表修复。

    CheckTable语句修复的时候,有三个参数;先执行无参数语句,然后根据执行结果最后面的提示,增加参数。

    Repair_fast:快速修复,数据无损

    Repair_rebuild:重建表的结构和索引,也不会丢失数据。

    Repair_Allow_data_loss:允许数据丢失的方式,进行数据库表修复。(出现这种提示,就肯定要丢掉部分数据了)

    增加参数以后,语句会变成右侧的样式: dbcc checktable('MenuItem',Repair_Allow_data_loss)

    checkTable语句可能需要执行多次,直到不再出现报错为止

    16、对于checktable修复不了的表,需要用bcp指令导出数据;bcp导出的时候,会自动过滤掉坏的数据,然后清除完表内容以后,再导入即可。(-U后面跟的是SQL的管理员账号sa,-P后面跟的是SQL管理员的密码)
    操作方式如下:
    A、关闭查询分析器
    B、开始=》运行=》CMD
    C、执行bcp指令,例如:bcp yumstone.dbo.MenuItem out c:\MenuItem.txt -c -Usa -P此处填写SQL的sa账号的密码
    D、打开查询分析器,执行语句:Truncate table  MenuItem
    E、关闭查询分析器,并打开CMD程序
    F、执行bcp指令,例如:bcp yumstone.dbo.MenuItem in c:\MenuItem.txt -c -Usa -P此处填写SQL的sa账号的密码
    17、在对Yumstone数据库,做dbcc检查,确保没问题,如果有问题,重复上述步骤。
    18、最后执行语句 exec yum_reindex对Yumstone数据库的所有表重建索引。

    19、查询分析器执行下述语句,以修复计数器(防止计数器异常)。

    declare @ReindexTable varchar(256),@ExecSQL varchar(2000),@RowNum numeric(18,0)
    select @RowNum=count(*) from sysobjects where xtype='U'
    DECLARE Bill_Cursor CURSOR FOR select name FROM sysobjects where xtype='U' order by name
    OPEN Bill_Cursor
    WHILE @RowNum > 0 begin FETCH NEXT FROM Bill_Cursor into @ReindexTable
    set @ExecSQL='DBCC CHECKIDENT('''+@ReindexTable+''',RESEED)'
    Execute(@ExecSQL)
    set @RowNum=@RowNum-1
    end
    CLOSE Bill_Cursor
    DEALLOCATE Bill_Cursor

    20、关闭查询分析器,打开企业管理器,改成多用户模式。


    21、启动软件服务=》运行易石程序=》验证问题是否解决。

    wcp知识库系统-V3.2.5.free