阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 4957|回复: 1

[讨论] SQL数据库置疑解决办法

[复制链接]
  • TA的每日心情
    开心
    2023-12-19 09:14
  • 签到天数: 282 天

    [LV.8]以坛为家I

    发表于 2008-5-23 20:26:09 | 显示全部楼层 |阅读模式
    MS SQL 日志出错导致数据库无法加载的解决办法
    2007-01-24 14:24
    备份数据文件,然后按下面的步骤处理:
    1.新建一个同名的数据库(数据文件与原来的要一致)
    2.再停掉sqlserver(注意不要分离数据库)
    3.用原数据库的数据文件覆盖掉这个新建的数据库
    4.再重启sqlserver
    5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
    USEMASTER
    GO
    SP_CONFIGURE'ALLOWUPDATES',1RECONFIGUREWITHOVERRIDE
    GO
    UPDATESYSDATABASESSETSTATUS=32768WHERENAME='置疑的数据库名'
    Go
    sp_dboption'置疑的数据库名','singleuser','true'
    Go
    DBCCCHECKDB('置疑的数据库名')
    Go
    updatesysdatabasessetstatus=28wherename='置疑的数据库名'
    Go
    sp_configure'allowupdates',0reconfigurewithoverride
    Go
    sp_dboption'置疑的数据库名','singleuser','false'
    Go

    6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
    数据库的脚本创建一个新的数据库,并将数据导进去就行了.
    sp_attach_single_file_db
    将只有一个数据文件的数据库附加到当前服务器。
    语法
    sp_attach_single_file_db[@dbname=]'dbname'
    ,[@physname=]'physical_name'
    参数
    [@dbname=]'dbname'
    要附加到服务器的数据库的名称。dbname的数据类型为sysname,默认值为NULL。
    [@physname=]'phsyical_name'
    据库文件的物理名称,包括数路径。physical_name的数据类型为nvarchar(260),默认值为NULL。
    返回代码值
    0(成功)或1(失败)

    2、只有mdf文件的恢复技术
    由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。
    如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,
    但是会出现类似下面的提示信息
    设备激活错误。物理文件名'C:\ProgramFiles\MicrosoftSQLServer\MSSQL\data\test_Log.LDF'可能有误。
    已创建名为'C:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\test_log.LDF'的新日志文件。
    但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息
    服务器:消息1813,级别16,状态2,行1
    未能打开新数据库'test'。CREATEDATABASE将终止。
    设备激活错误。物理文件名'd:\test_log.LDF'可能有误。
    怎么办呢?别着急,下面我们举例说明恢复办法。
    A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQLServerEnterpriseManager里面建立。
    B.停掉数据库服务器。
    C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
    D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
    E.设置数据库允许直接操作系统表。此操作可以在SQLServerEnterpriseManager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
    usemaster
    go
    sp_configure'allowupdates',1
    go
    reconfigurewithoverride
    go
    F.设置test为紧急修复模式
    updatesysdatabasessetstatus=-32768wheredbid=DB_ID('test')
    此时可以在SQLServerEnterpriseManager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表
    G.下面执行真正的恢复操作,重建数据库日志文件
    dbccrebuild_log('test','C:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\test_log.ldf')
    执行过程中,如果遇到下列提示信息:
    服务器:消息5030,级别16,状态1,行1
    未能排它地锁定数据库以执行该操作。
    DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。[brown]
    说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQLServerEnterpriseManager打开了test库的系统表,那么退出SQLServerEnterpriseManager就可以了。
    正确执行完成的提示应该类似于:
    警告:数据库'test'的日志已重建。已失去事务的一致性。应运行DBCCCHECKDB以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
    DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。
    此时打开在SQLServerEnterpriseManager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
    H.验证数据库一致性(可省略)
    dbcccheckdb('test')
    一般执行结果如下:
    CHECKDB发现了0个分配错误和0个一致性错误(在数据库'test'中)。
    DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。
    I.设置数据库为正常状态
    sp_dboption'test','dbouseonly','false'
    如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
    J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQLServerEnterpriseManager里面恢复,也可以使用如下语句完成
    sp_configure'allowupdates',0
    go
    reconfigurewithoverride
    go

    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2023-12-19 09:14
  • 签到天数: 282 天

    [LV.8]以坛为家I

     楼主| 发表于 2008-5-23 20:26:42 | 显示全部楼层
    问题:从备份数据库文件:AIS20051209164544_Data.MDF附加时出错,提示

    1813错误,提示如图



    一、建立一个同名的新数据库,方法同建账

    二、停止SQL Server服务,删除新数据库的两个文件,把备份中的AIS20051209164544_Data.MDF COPY到相应的文件夹下


    三、启动SQL Server服务,运行SQL脚本,置数据库为紧急状态(emergency mode)


    四、重启SQL Server服务,重建LDF文件




    EXEC sp_configure 'allow updates', 1 --指定可以直接更新系统表
    go
    reconfigure with override --如果配置不需要重启服务,则配置值直接,改运行值
    go
    use master
    go
    update sysdatabases set status = 32768 --该参数为置为紧急状态
    where name = 'AIS20051209164544'
    go
    EXEC sp_configure 'allow updates', 0
    go
    reconfigure with override


    然后重建LDF


    dbcc rebuild_log( 'AIS20051209164544', 'E:\K3data\mrp\AIS20051209164544_Log.LDF')


    五、运行以下语句,就可以把数据库的状态还原:

    update sysdatabases set status=28 where name='AIS20051209164544'
    EXEC sp_configure 'allow updates',0
    reconfigure with override
    Go


    然后数据库运行正常







    七、这个方法可以解决多数数据库置疑或不能附加的问题。
    但在完成后,建议通过
    use 数据库实体
    dbcc checkdb
    不检查数据库的完整性,对于有提示的针对性地修复。

    恢复数据库时不能完成,出现正在装载错误时,
    先把数据库恢复,然后将AIS20051209164544_Data.MDF备份后,,

    然后进行一至五步操作
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表