1、SQL 数据库修复方法SQL 数据库修复方法(2008-10-30 21:00:59)标签:杂谈 分类:电脑技术 1、update sysdatabases set status =0 where name = fdshopgo把状态重置为 0,重启库2.修复的话,先将将数据库置为单用户模式,sp_dboption fdshop,single user,true如果报错,可能有用户正在使用库,在进程管理里面杀掉 sa 用户进程,重新执行,直到成功尝试对其进行不丢失数据的修复:DBCC CHECKDB(fdshop,REPAIR_REBUILD)尝试对其进行可能丢失数据的修复:DBCC CHEC
2、KDB(fdshop,REPAIR_ALLOW_DATA_LOSS)3.将数据库置为多用户模式,sp_dboption fdshop,single user,false1.如果用户库无法启动,则打开 sql server 分析查询器,执行以下命令sp_configure allow updates,1goreconfigure with overridego将这个数据库置为紧急模式:update sysdatabases set status =-32768 where name = fdshopgo2.Zach 的灵验脚本Zach 说他每次遇到这种数据库置疑情况,就运行下面这个脚本,屡试不爽
3、:=-before running any script, run the following to set themaster database to allow updatesUSE masterGosp_configure #allow updates#, 1GORECONFIGURE WITH OVERRIDEGO-Run the following scriptUPDATE mastersysdatabases SET status = status 256WHERE name = #Database_Name#-Run the following scriptexec SP_res
4、etstatus Database_Name-stop and start the MSDTC at this stage-After the procedure is created, immediately disableupdates to the system tables:exec sp_configure #allow updates#, 0GORECONFIGURE WITH OVERRIDEGO=从上面可以看出,处理置疑的基本步骤还是我那篇文章中说的(注意我使用的字体颜色):执行 sp_configure 以允许对系统表进行更新,然后用 RECONFIGURE WITH OVE
5、RRIDE 语句强制实施该配置;数据库重置紧急模式;执行 sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项(只有系统管理员才能执行) 。执行该过程后,立即重启 SQL Server 服务;执行 sp_configure 以禁止对系统表进行更新,然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置。status 256 的意思就是:ConstantValueDescriptionSQLDMODBStat_Suspect256Database integrity is suspect for the referenced databa
6、se.不同的是,有时候丢失了数据库日志文件,额外需要以下步骤:? 把应用数据库设置为 Single User 模式;? 做 DBCC CHECKDB;才可以。但是几位网友的实践结果就是这个 DBCC CHECKDB 执行失败。一位网友 yang 说:“但是 DBCC CHECKDB 就是执行不了,总是说“该数据库处于回避恢复模式” 。我已经试了很多次了,就是改变不了这个状态。 ”还有一位 Rui 执行 DBCC CHECKDB 时报错:“Server: Msg 943, Level 14, State 1, Line 1 Database #his_yb# cannot be opened b
7、ecause its version (539) is later than the current server version (515).”对于 Yang,可能他没有一步一步做, 。我的切身体会是,把应用数据库设置为 Single User 模式后就可以做 DBCC CHECKDB。之后呢,也许 SQL Server 重启后自动检查数据库是否正常。但是数据应该是可以读出来的,至少可以被 DTS Wizard 读出来的。这时候的数据库还存在问题,比如我的组件使用数据库时,报告说:“发生错误:-2147467259,未能在数据库 #XXX# 中运行 BEGIN TRANSACTION,因为该
8、数据库处于回避恢复模式。 ”对于 Rui,他碰到的那个错误Server: Msg 943, Level 14, State 1, Line 2Database #XXXX# cannot be opened because its version (536) is later thanthe current server version (515).这表明 Rui 正试图:从一个 SQL Server 2000(version 539,536 之类的)的数据库备份恢复到一个 SQL Server 7.0 中或者把一个 SQL Server 2000(version 539,536 之类的)的数
9、据库attach 到一个 SQL Server 7.0 中,这是不允许的。如果你必须使用这个 SQL Server 2000 的数据备份,那么请您首先把这个备份倒入 SQL Server 2000,最后用 DTS 把数据库从 SQL Server 2000 上 transfer 到 SQL Server 7.0 上。-允许进行系统表的操作use masterexec sp_configure allow update,1 reconfigure with overridego-将数据库设置成紧急模式update sysdatabases set status=-32768 where dbid
10、=DB_ID(yszt)-创建日志文件dbcc rebuild_log (yszt,c:Program FilesMicrosoft SQL ServerMSSQLbackupyszt_log.ldf)-恢复数据库的紧急模式update sysdatabases set status=0 where name=yszt-取消数据库的置疑标识restore database yszt with recovery-恢复系统表操作的设置exec sp_configure allow update,0 reconfigure with overridego SQL Server 数据库备份有两种方式,
11、一种是使用 BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件 mdf 和日志文件 ldf 的方式。下面将主要讨论一下后者的备份与恢复。本文假定您能熟练使用 SQLServer Enterprise Manager(SQL Server 企业管理器)和 SQL Server Quwey Analyser(SQL Server 查询分析器)1、正常的备份、sql 数据库修复方式正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。卸下数据库的命令:Sp_detach_db 数据库名连接数据库的命令:S
12、p_attach_db 或者 sp_attach_single_file_dbs_attach_db dbname = dbname, filename1 = filename_n ,.16sp_attach_single_file_db dbname = dbname, physname = physical_name使用此方法可以正确恢复 SQL Sever7.0 和 SQL Server 2000 的数据库文件,要点是备份的时候一定要将 mdf 和 ldf 两个文件都备份下来,mdf 文件是数据库数据文件,ldf 是数据库日志文件。例子: 假设数据库为 test,其数据文件为 test_
13、data.mdf,日志文件为 test_log.ldf。下面我们讨论一下如何备份、恢复该数据库。卸下数据库:sp_detach_db test连接数据库:sp_attach_db test,C:Program FilesMicrosoft SQL serverMSSQLDatatest_data.mdf,C:Program FilesMicrosoft SQL ServerMSSQLDatatest_log.ldfsp_attach_single_file_db test,C:Program FilesMicrosoft SQL ServerMSSQLDatatest_data.mdf2、只有
14、 mdf 文件的恢复技术由于种种原因,我们如果当时仅仅备份了 mdf 文件,那么恢复起来就是一件很麻烦的事情了。如果您的 mdf 文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db 或者 sp_attach_single_file_db 可以恢复数据库,但是会出现类似下面的提示信息设备激活错误。物理文件名 C:Program FilesMicrosoft SQL ServerMSSQLdatatest_Log.LDF可能有误。已创建名为 C:Program FilesMicrosoft SQL ServerMSSQLDatatest_log.LDF的新日志文件。但是,如果您
15、的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息服务器: 消息 1813,级别 16,状态 2,行 1 未能打开新数据库 test。CREATE DATABASE 将终止。设备激活错误。物理文件名 d:test_log.LDF 可能有误。怎么办呢?别着急,下面我们举例说明恢复办法。A我们使用默认方式建立一个供恢复使用的数据库(如 test)。可以在 SQL Server Enterprise Manager 里面建立。B停掉数据库服务器。C将刚才生成的数据库的日志文件 test_log.ldf 删除,用要恢复的数据库 mdf 文件覆盖刚
16、才生成的数据库数据文件test_data.mdf。D启动数据库服务器。此时会看到数据库 test 的状态为“置疑” 。这时候不能对此数据库进行任何操作。E设置数据库允许直接操作系统表。此操作可以在 SQL Server Enterprise Manager 里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。use mastergosp_configure allow updates,1goreconfigurewith overridegoF设置 test 为紧急修复模式update sysdatabases se
17、t status=-32768 where dbid=DB_ID(test)此时可以在 SQL Server Enterprise Manager 里面看到该数据库处于“只读置疑脱机紧急模式”可以看到数据库里面的表,但是仅仅有系统表G下面执行真正的恢复操作,重建数据库日志文件dbcc rebuild_log(test,C:Program FilesMicrosoft SQL ServerMSSQLDatatest_log.ldf)执行过程中,如果遇到下列提示信息:服务器: 消息 5030,级别 16,状态 1,行 1 未能排它地锁定数据库以执行该操作。DBCC 执行完毕。如果 DBCC输出了错
18、误信息,请与系统管理员联系。说明您的其他程序正在使用该数据库,如果刚才您在 F 步骤中使用SQL Server Enterprise Manager 打开了 test 库的系统表,那么退出 SQL Server Enterprise Manager 就可以了。正确执行完成的提示应该类似于:警告: 数据库 test的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。此时打开在 SQL Server Enterprise Manager 里
19、面会看到数据库的状态为“只供 DBO 使用” 。此时可以访问数据库里面的用户表了。H验证数据库一致性(可省略)dbcccheckdb(test)一般执行结果如下:CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 test 中) 。DBCC执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。I设置数据库为正常状态sp_dboption test,dbo use only,false如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。J最后一步,我们要将步骤 E 中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在 SQL ServerEnterprise Manager 里面恢复,也可以使用如下语句完成sp_configure allow updates,0goreconfigure with overridego