
数据库异常恢复办法.doc
9页1. 新建一个同名的数据库2. 再停掉 sql server3. 用suspect数据库的文件覆盖掉这个新建的同名数据库4. 再重启 sql server5. 此时打开企业管理器时新建的同名数据库会岀现置疑, 先不管,执行下面的语句(注意修改其 中的数据库名)USE MASTERGOSP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDEGOUPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='his222'Gosp_dboption 'test', 'single user', 'true'GoDBCC CHECKDB('test')Goupdate sysdatabases set status =28 where n ame='test'Gosp_c on figure 'allow updates', 0 rec on figure with overrideGosp_dboption 'test', 'single user', 'false'Go6. 完成后一般就可以访问数据库中的数据了 ,这时,数据库本身一般还要问题 ,解决办法是,利用数据库的脚本创建一个新的数据库 ,并将数据导进去就行了 .如果这样改不加数据库状态,你就把数据库导成一个新库来代替旧库吧企业管理器--右键你的数据库--所有任务--导出数据--目标标数据库选择新建--选择"在两个sql数据库之间复制对象和数据 “--把“包含扩展属性“选上,其他的根据需要选择--最后完成在MS SQLSERVER 中一直有这样的问题‘SQLSERVER 的状态"置疑",我们先来分析一下SQLSERVER 数据库“置疑“的原因:1. 错误的删除日志;2. 硬件(HD)损坏,造成日志和数据文件写错误 ;3. 硬盘的空间不够,比如日志文件过大;解决办法:这是最简单的办法是有数据库的全备份 ,然后恢复即可.步骤:1. 删除原始的数据库:USE MASTERGODROP DATABASE DB_SUEPECT2. 建立同名的数据库:USE masterGOCREATE DATABASE DB_SUSPECTON(NAME = DBNAME_DAT, FILENAME = C',SIZE = 10,FILEGROWTH = 5 )LOG ON(NAME = 'DBNAME_LOG',FILENAME = 'g:',SIZE = 5MB,FILEGROWTH = 5MB )GO3. 恢复数据库:RESTORE DATABASE DB_SUSPECTFROM DBNAME_BACKUP.DAT4. 数据库完整性检测:DBCC CHECKDB('DB_SUSPECT')5. 重新启动 MSSQLSERVER 服务.如果没有全备份,那就要用一些特殊的方法 :1. 设置数据库为紧急模式Use MasterGOsp_c on figure 'allow updates', 1recon figure with overrideGOUPDATE sysdatabases SET status = 32768 where n ame = 'DB_SUSPECT'GO2. 停掉SQL Server 服务:NET STOP MSSQLSERVER移走:3. 把原始数据库的数据文件 DBNAME_DAT.MDF,DBNAME_LOG丄DF4. 启动SQL Server 服务:NET START MSSQLSERVER5. 重新建立一个同名的数据库 DB_SUSPECT ;USE masterGOCREATE DATABASE DB_SUSPECTON(NAME = DBNAME_DAT, FILENAME = C',SIZE = 10,FILEGROWTH = 5 )LOG ON(NAME = 'DBNAME_LOG',FILENAME = 'g:',SIZE = 5MB,FILEGROWTH = 5MB )GO6. 设置数据库运行在单用户的模式 :USE MASTERGOALTER DATABASE DB_SUSPECT SET SINGLE_USERGO7. 停掉SQL服务:NET STOP MSSQLSERVER8. 把原来的数据文件再覆盖回来 :9. 启动SQL Server 服务:NET START MSSQLSERVER10. 重新设置 SQLSERVER 的状态:USE MASTERGOEXEC sp_resetstatus "DB_SUSPECT"11. 数据库完整性检测:DBCC CHECKDB('DB_SUSPECT')12. 恢复数据库为多用户模式:USE MASTERGOALTER DATABASE DB_SUSPECT SET MULTIUSERGO13. 恢复SQLSERVER原始的配置:USE MATERGOUPDATE sysdatabases SET status = 4194320 where n ame = 'DB_SUSPECT'GO14. 配置SQLSERVER不允许更新系统表:USE MASTERGOsp_c on figure 'allow updates', 0recon figure with overrideGO15. 重新启动 MSSQLSERVER 服务:最好重新启动操作系统16. 备份数据库:可以通过SQLSERVER 企业管理器或 T-SQL.需要备份 MASTER 和DB_SUSPECT 补充一点,如果用 DOMAIN\USER 时,要注意对.MDF丄DF 的所在目录的权限.如果SQL Server 因为磁盘可用空间不足,而不能完成数据库的恢复,那么 SQL Server2000 会返回错误 1105 并且将sysdatabases 中的status 列设为置疑。
你可以看到在 SQLSERVER 的ERROR LOG 和OS的应用程序日志中应该有 1105的错误信息:SQL Server 事务日志可能会被填满, 这会阻止之后的数据库操作, 包括UPDATE, DELETE,INSERT 和口 CHECKPOINT 事务日志填满会导致 1105错误:Can't allocate space for object syslogs in database dbn ame becausethe logsegme nt is full If you ran out of space in syslogs , dumpthe tran saction log Otherwise use ALTER DATABASE orsp_exte ndsegme nt to in crease the size of the segme nt 这种现象可能岀现于任何一个数据库中,包括 Master和TempDB一些难以预见的因素可能消耗日志空间例如:一个大型事务, 尤其像批量数据更新、插入或删除一个未提交的事务检查点处理程序截除时所需的带宽过大截除时超过阈值上述各种条件互相作用的结果。
用于发布的标记事务没有被日志读取程序读走F面是修复的步骤和收缩日志的步骤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 accessi ng this database!3.用ALTER DATABASE 向数据库添加一个数据文件或日志文件USE masterGOCREATE DATABASE db_n ame ON(NAME = dbn ame_dat1,FILENAME = 'D:\MSSQL\Data\db name_dat1. ndf',SIZE = 1000MB,FILEGROWTH = 50MB)GO--更改该数据库以添加一个 2GB大小的新数据文件ALTER DATABASE db_n ameADD FILE(NAME = dbn ame_dat2,FILENAME = 'F:\MSSQL\DATA\db name_dat2 .n df',SIZE = 2000MB,FILEGROWTH = 50MB)GO--更改该数据库以添加一个 1GB大小的新日志文件ALTER DATABASE db_n ameADD LOG FILE(NAME = db_n ame_log2,FILENAME = 'F:\MSSQL\Data\db_ name_log2.ldf',SIZE = 1000MB,FILEGROWTH = 20MB),GO4. 停止并重新启动 SQL Server:用新的数据文件或日志文件所提供的额外空间, SQL Server 应该能完成数据库的恢复。
5. 释放磁盘空间并且重新运行恢复操作 ,按照下面的步骤收缩日志sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项为从根本上解决这样的问题,你可以按下面的操作配置 SQLSERVER 2000:a. 如果不需要恢复到指定的时间点 ,你可以将数据库的恢复模式配置为简单 ,这样UPDATE,DELETE,SELECT 就不会记录日志,日志就不会增加的很大 :USE MASTERGOALTER DATABASE DB_NAME SET RECOVERY SIMPLEb. 如果你的恢复模式是全部 ,你一定要配置日志字段收缩 :USE MASTERGOsp_dbopti on 'database name','tru nc. log on chkpt.',truesp_dboption 'databasename','autoshrink',truec. 通过每日备份将日志收缩 :BACKUP DATABASE DATABASE_NAME TO BACKUP_DEVICESBACKUP LOG DATABASE_NAME TO LOG_DEVICESORBACKUP LOG DATABASE_NAME with tru ncate_o nly**检查日志的容量:DBCC SQLPERF (LOGSPACE) 这时日志并没有收缩d. 每天在备份数据库完成之后 ,重新启动MS SQLSERVER SERVICE.USE DATABASE_NAMEgoDBCC SHRINKFILE(2,tru nc。
