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

    修改日期 修改人 备注
    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('MenuItem'),尝试进行表修复。

            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