1.在命令提示符下运行以下命令启动 SQL Server:
备注:-m 开关以单用户模式启动 SQL Server。在单用户模式下,只能成功建立一个连接。 请注意是否有任何其他客户机或服务可能会在您通过 SQL Server 查询分析器 建立连接前使用那个连接。SQLSERVER -f -m
2. 重置置疑数据库的状态。
下面是结果集:sp_resetstatus 'database_name'
3. 用 ALTER DATABASE 向数据库添加一个数据文件或日志文件:Database'database_name'status reset!
WARNING: You must reboot SQL Server prior to accessing this database!
4. 停止并重新启动 SQL Server: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
用新的数据文件或日志文件所提供的额外空间,SQL Server 应该能完成数据库的恢复。
5. 释放磁盘空间并且重新运行恢复操作,按照下面的步骤收缩日志。
sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。
为从根本上解决这样的问题,你可以按下面的操作配置SQLSERVER 2000:
a.如果不需要恢复到指定的时间点,你可以将数据库的恢复模式配置为简单,这样UPDATE,DELETE,SELECT就不会记录日志,日志就不会增加的很大:
b.如果你的恢复模式是全部,你一定要配置日志字段收缩:ALTER DATABASE DB_NAME SET RECOVERY SIMPLE
c.通过每日备份将日志收缩:USE MASTER
![]()
GO
sp_dboption 'databasename','trunc. log on chkpt.',true
sp_dboption 'databasename','autoshrink',true
d.每天在备份数据库完成之后,重新启动MS SQLSERVER SERVICE.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) 这时日志并没有收缩!
e.手动快速收缩日志:USE DATABASE_NAME
go
DBCC SHRINKFILE(2,truncateonly)
![]()
**检查日志的容量:DBCC SQLPERF (LOGSPACE) 这时日志已经收缩!
注意: 只有在您的主要支持提供者指导下或有疑难解答建议的做法时,才可以使用sp_resetstatus。否则,可能会损坏数据库。/ *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。执行该过程后,立即关闭 SQL Server。USE master
GO
sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE
GO
过程创建后,立即禁用系统表更新:
![]()
sp_configure 'allow updates', 0
GO
RECONFIGURE WITH OVERRIDE
GO
遇到这种数据库置疑情况,就运行下面这个脚本,屡试不爽:
从上面可以看出,处理置疑的基本步骤还是我那篇文章中说的(注意我使用的字体颜色):--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.
Ø 把应用数据库设置为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 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,他碰到的那个错误:
这表明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上。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).
