技术开发 频道

数据库异常恢复办法

  【IT168 技术教程】   下面是修复的步骤和收缩日志的步骤。

    1.在命令提示符下运行以下命令启动 SQL Server:

SQLSERVER -f -m
    备注:-m 开关以单用户模式启动 SQL Server。在单用户模式下,只能成功建立一个连接。 请注意是否有任何其他客户机或服务可能会在您通过 SQL Server 查询分析器 建立连接前使用那个连接。

    2. 重置置疑数据库的状态。

sp_resetstatus 'database_name'
下面是结果集:

Database'database_name'status reset! WARNING: You must reboot SQL Server prior to accessing this database!
3. 用 ALTER DATABASE 向数据库添加一个数据文件或日志文件:

USE master GO CREATE DATABASE db_name ON ( NAME = dbname_dat1, FILENAME = 'D:MSSQLDatadbname_dat1.ndf', SIZE = 1000MB, FILEGROWTH = 50MB ) GO --更改该数据库以添加一个 2GB 大小的新数据文件 ALTER DATABASE db_name ADD FILE ( NAME = dbname_dat2, FILENAME = 'F:MSSQLDATAdbname_dat2.ndf', SIZE = 2000MB, FILEGROWTH = 50MB ) GO --更改该数据库以添加一个1GB 大小的新日志文件 ALTER DATABASE db_name ADD LOG FILE ( NAME = db_name_log2, FILENAME = 'F:MSSQLDatadb_name_log2.ldf', SIZE = 1000MB, FILEGROWTH = 20MB), GO
    4. 停止并重新启动 SQL Server:

    用新的数据文件或日志文件所提供的额外空间,SQL Server 应该能完成数据库的恢复。

    5. 释放磁盘空间并且重新运行恢复操作,按照下面的步骤收缩日志。

    sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。

    为从根本上解决这样的问题,你可以按下面的操作配置SQLSERVER 2000:

    a.如果不需要恢复到指定的时间点,你可以将数据库的恢复模式配置为简单,这样UPDATE,DELETE,SELECT就不会记录日志,日志就不会增加的很大:

ALTER DATABASE DB_NAME SET RECOVERY SIMPLE
b.如果你的恢复模式是全部,你一定要配置日志字段收缩:
USE MASTER GO sp_dboption 'databasename','trunc. log on chkpt.',true sp_dboption 'databasename','autoshrink',true
c.通过每日备份将日志收缩:
BACKUP DATABASE DATABASE_NAME TO BACKUP_DEVICES BACKUP LOG DATABASE_NAME TO LOG_DEVICES OR BACKUP LOG DATABASE_NAME with truncate_only **检查日志的容量:DBCC SQLPERF (LOGSPACE) 这时日志并没有收缩!
d.每天在备份数据库完成之后,重新启动MS SQLSERVER SERVICE.
USE DATABASE_NAME go DBCC SHRINKFILE(2,truncateonly) **检查日志的容量:DBCC SQLPERF (LOGSPACE) 这时日志已经收缩!
e.手动快速收缩日志:
/ *run below script,you will shrink you database log files immediately, in my experience,you need to run the script for 3 or 4 minutes before stopping it manually */ use databasename dbcc shrinkfile(2,notruncate) dbcc shrinkfile(2,truncateonly) create table t1(char1 char(4000)) go declare @i int select @i=0 while(1=1) begin while(@i<100) begin INSERT INTO T1 VALUES ('A') SELECT @I=@I+1 END TRUNCATE table T1 BACKUP LOG youdatabasename with truncate_only end GO
    注意: 只有在您的主要支持提供者指导下或有疑难解答建议的做法时,才可以使用sp_resetstatus。否则,可能会损坏数据库。

    由于该过程修改了系统表,系统管理员必须在运行 sp_resetstatus这个过程前,启用系统表更新。要
启 用更新,使用下面的过程:
USE master GO sp_configure 'allow updates', 1 GO RECONFIGURE WITH OVERRIDE GO 过程创建后,立即禁用系统表更新: sp_configure 'allow updates', 0 GO RECONFIGURE WITH OVERRIDE GO
    只有系统管理员才能执行 sp_resetstatus。执行该过程后,立即关闭 SQL Server。

    遇到这种数据库置疑情况,就运行下面这个脚本,屡试不爽:
--before running any script, run the following to set the master database to allow updates USE master GO sp_configure 'allow updates', 1 GO RECONFIGURE WITH OVERRIDE GO --Run the following script UPDATE master..sysdatabases SET status = status ^ 256 WHERE name = 'Database_Name' --Run the following script exec SP_resetstatus Database_Name --stop and start the MSDTC at this stage --After the procedure is created, immediately disable updates to the system tables: exec sp_configure 'allow updates', 0 GO RECONFIGURE WITH OVERRIDE GO
    从上面可以看出,处理置疑的基本步骤还是我那篇文章中说的(注意我使用的字体颜色):

    执行 sp_configure 以允许对系统表进行更新,然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置;

    数据库重置紧急模式;

    执行sp_resetstatus关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项(只有系统管理员才能执行)。执行该过程后,立即重启 SQL Server服务;

    执行 sp_configure 以禁止对系统表进行更新,然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置。

    status ^ 256的意思就是:
Constant Value Description SQLDMODBStat_Suspect 256 Database integrity is suspect for the referenced database.
    不同的是,有时候丢失了数据库日志文件,额外需要以下步骤:

    &Oslash; 把应用数据库设置为Single User模式;

    &Oslash; 做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 because its version (539) is later than the current server version (515).”


    对于Yang,可能他没有一步一步做,。我的切身体会是,把应用数据库设置为Single User模式后就可以做DBCC CHECKDB。之后呢,也许SQL Server重启后自动检查数据库是否正常。但是数据应该是可以读出来的,至少可以被DTS Wizard读出来的。这时候的数据库还存在问题,比如我的组件使用数据库时,报告说:“发生错误:-2147467259,未能在数据库 'XXX' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。”


    对于Rui,他碰到的那个错误:

Server: Msg 943, Level 14, State 1, Line 2 Database 'XXXX' cannot be opened because its version (536) is later than the current server version (515).
    这表明Rui正试图从一个SQL Server 2000(version 539,536之类的)的数据库备份恢复到一个SQL Server 7.0中,或者,把一个SQL Server 2000(version 539,536之类的)的数据库attach到一个SQL Server 7.0中,这是不允许的。如果你必须使用这个SQL Server 2000的数据备份,那么请您首先把这个备份倒入SQL Server 2000,最后用DTS把数据库从SQL Server 2000上transfer到SQL Server 7.0上。

0
相关文章