一,RECOVERY PENDING状态

今天修改了SQL Server的Service Account的密码,然后重启SQL Server的Service,发现有db处于Recovery Pending状态。

Recovery Pending状态是指:数据库在还原(recovery)时遇到跟资源相关的错误,虽然数据库没有损坏,但是文件可能丢失,或者系统资源的限制,导致该数据库不能开始还原进程。数据库处于Recovery Pending 状态,表明还原进程被挂起,数据库不能开始数据库的数据和日志的还原进程;这种情况,不能说慢Recovery失败,因为Recovery还没有开始。这种情况下,最可能的原因是丢失数据文件或日志文件。

对于Recovery Pending状态,应该如何修复:

ALTER DATABASE [DB_Name] SET  SINGLE_USER WITH NO_WAIT
ALTER DATABASE [DB_Name] SET EMERGENCY;
DBCC checkdb ([DB_Name], REPAIR_ALLOW_DATA_LOSS )
ALTER DATABASE [DB_Name] SET online;
ALTER DATABASE [DB_Name] SET Multi_USER WITH NO_WAIT

在使用CheckDB命令Repair之前,查看DB的大小

select DB_NAME(mf.database_id) as DatabaseName,
mf.type_desc as FileType,
mf.name as FileLogicName,
mf.physical_name as FilePhysicalName,
mf.size as PagesCount,
mf.size*8/1024 as Size_MB,
mf.size*8/1024/1024.0 as Size_GB
from sys.master_files mf
where mf.database_id= db_id(N'dbname')

在执行时,出现各种问题:

1,User does not have permission to alter database 'Office365', the database does not exist, or the database is not in a state that allows access checks.

2,Database 'Office365' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.

最后,我到File 的 Physical path下,找不到相应的MDF文件,但是Log文件是存在的,并且log文件最后修改的时间离现在有2年,可能是被遗弃的DB。修改 Service Account ,不会删除一个18GB的MDF文件,向Leader询问,Leader说这是一个被废弃的DB。虚惊一场,像这种,MDF文件被删除,Log文件还保存的情况,数据文件肯定是被强制删除。

有惊无险,血泪的教训:在Service Restart 之前,一定确保DB没有在运行更新操作,并使用checkpoint保存脏数据。

二,估计Recovery的剩余时间

当一个DB处于 In Recovery 状态时,用户是不能访问的,如果Recovery时间很长,那么对一个DBA来说,等待的过程是虐心的,DBA需要知道剩余的还原时间。如何预测一个DB从In Recovery 状态,还原到正常Online状态所需的时间? SQL Server 没有直接给出答案,但是,在Recovery的过程中SQL Server将还原进程记录到ErrorLog中,可以通过Recovery的历史记录来估计剩余的完成时间。

DECLARE @DBName VARCHAR(64) = 'databasename'

DECLARE @ErrorLog AS TABLE
(
[LogDate] CHAR(24),
[ProcessInfo] VARCHAR(64),
[TEXT] VARCHAR(MAX)
) INSERT INTO @ErrorLog
EXEC master..sp_readerrorlog 0, 1, 'Recovery of database', @DBName SELECT TOP 11
[LogDate]
,SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) AS PercentComplete
,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 AS MinutesRemaining
,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 AS HoursRemaining
,[TEXT] FROM @ErrorLog
ORDER BY [LogDate] DESC

在SQL Server的Log中,记录的消息是:

Recovery of database 'database name' (16) is 0% complete (approximately 303767 seconds remain). Phase 1 of 3. This is an informational message only. No user action is required.

Recovery of database 'database name' (16) is 0% complete (approximately 396166 seconds remain). Phase 2 of 3. This is an informational message only. No user action is required.

三,Database 处于Suspect状态

在物理机安装Windows更新,重启之后,发现该Server上有一个DB处于Suspect状态,该DB的Files分布在不同的Server上,我怀疑是在Remote Server重启时,导致该DB不能访问Remote Files,因此,SQL Server 进入 Suspect状态。

查看Windows 日志报告,发现一下错误信息:

The operating system returned error 53(The network path was not found.) to SQL Server during a read at offset 0x000001bed08000 in file '\\RemoteServerName\ShareFolder\xxxx.ndf'. Additional messages in the SQL Server error log and system event log may provide more detail. This is a severe system-level error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

这个错误是由于Remote Server重启,导致该DB不能访问位于Remote Server上的Files,数据库的文件并没有损坏。所以,解决方法是:等到所有的Remote Server都重启之后,只需要使该DB先脱机(offline),再联机(Online),SQL Server会自动检测该数据库的完整性,如果该DB的所有Files都能正常访问,该DB就会恢复到正常的Online状态。

alter database database_name
set offline
--wait for some seconds
alter database database_name
set online

附件:

数据库的状态和描述:

  • ONLINE:Database is available for access. The primary filegroup is online, although the undo phase of recovery may not have been completed.
  • OFFLINE:Database is unavailable. A database becomes offline by explicit user action and remains offline until additional user action is taken. For example, the database may be taken offline in order to move a file to a new disk. The database is then brought back online after the move has been completed.
  • RESTORING:One or more files of the primary filegroup are being restored, or one or more secondary files are being restored offline. The database is unavailable.
  • RECOVERING:Database is being recovered. The recovering process is a transient state; the database will automatically become online if the recovery succeeds. If the recovery fails, the database will become suspect. The database is unavailable.
  • RECOVERY PENDING:SQL Server has encountered a resource-related error during recovery. The database is not damaged, but files may be missing or system resource limitations may be preventing it from starting. The database is unavailable. Additional action by the user is required to resolve the error and let the recovery process be completed.
  • SUSPECT:At least the primary filegroup is suspect and may be damaged. The database cannot be recovered during startup of SQL Server. The database is unavailable. Additional action by the user is required to resolve the problem.
  • EMERGENCY:User has changed the database and set the status to EMERGENCY. The database is in single-user mode and may be repaired or restored. The database is marked READ_ONLY, logging is disabled, and access is limited to members of the sysadmin fixed server role. EMERGENCY is primarily used for troubleshooting purposes. For example, a database marked as suspect can be set to the EMERGENCY state. This could permit the system administrator read-only access to the database. Only members of the sysadmin fixed server role can set a database to the EMERGENCY state.

推荐阅读:

How to resolve the issue of a database that was in Recovery Pending mode

Troubleshooting: SCOM DW Database is in a Suspect State

Search Engine Q&A #4: Using EMERGENCY mode to access a RECOVERY PENDING or SUSPECT database

Corruption: Last resorts that people try first…

How To Repair A Suspect Database In MSSQL

Recovering a SQL Server Database from Suspect Mode

DB异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间的更多相关文章

  1. DataBase异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间

    一,RECOVERY PENDING状态 今天修改了SQL Server的Service Account的密码,然后重启SQL Server的Service,发现有db处于Recovery Pendi ...

  2. SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager

    SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...

  3. Recovery启动流程(3)--recovery.cpp分析

    转载请注明来源:cuixiaolei的技术博客 这篇文章主要通过分析高通recovery目录下的recovery.cpp源码,对recovery启动流程有一个宏观的了解.MTK和高通的recovery ...

  4. elasticsearch indices.recovery 流程分析(索引的_open操作也会触发recovery)——主分片recovery主要是从translog里恢复之前未写完的index,副分片recovery主要是从主分片copy segment和translog来进行恢复

    摘自:https://www.easyice.cn/archives/231 elasticsearch indices.recovery 流程分析与速度优化 目录 [隐藏] 主分片恢复流程 副本分片 ...

  5. recovery中英对照表 recovery大全图解

    一:Recovery主界面 ---reboot system now                         重启手机(刷机完毕选择此项就能重新启动系统) ---apply SDcard:up ...

  6. 当DATABASE进入了suspect模式以后

    一个VM的错误就造成了sql2012的脱序.很多一般看不到的模式陆续登场 诸如 recovery pending, suspect, EMERGENCY. 以下脚本可以帮助恢复,如果文件没有损坏的话. ...

  7. Change the Target Recovery Time of a Database (SQL Server) 间接-checkpoints flushcache flushcache-message

    Change the Target Recovery Time of a Database (SQL Server) 间接checkpoints   flushcache flushcache-mes ...

  8. 崩溃恢复(crash recovery)与 AUTORESTART参数

    关于这个参数设置的影响,在生产系统中经历过两次:        第一次是有套不太重要的系统安装在虚拟机,这套系统所有应用(DB2 WAS IHS)都配置到/etc/rc.local中,每次启动机器会自 ...

  9. RMAN RECOVERY

    Data Recovery Advisor The health monitor and the ADR The capabilities and limitations of DRA using t ...

随机推荐

  1. 引用js文件

    在子模板里引用js文件的时候,需要把相应的.js文件放到static目录下,如引用static/jQuery/index.js文件: {% extends "base.html" ...

  2. Linux 系统的磁盘分区_【all】

    磁盘的存储逻辑结构 1.主引导扇区(446+64+2) MBR(主引导记录)0磁头0磁道的第一扇区 446字节 -->存放系统的引导程序,同Windows 剩下的64字节,分区表(每个分区16字 ...

  3. Redis学习---Redis操作之Hash

    hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据[有点像嵌套字典] hset(name, key, value) --> 设置hash的操作 # 参数:     # ...

  4. spring-springmvc-hibernate项目小结

    1. web.xml中别忘记加入spring监听器 <listener> <listener-class>org.springframework.web.context.Con ...

  5. EntityFramework Code First便捷工具——数据迁移

    使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...

  6. 关于markdown格式的测试..

    标题 标题一 这是? 标题二 标题三 标题四 区块 1.这是一个列表项目 还是吗? 嵌套了? 空格了? 区块加列表 标题加二级列表 嘿嘿 无序列表 RED GREEN BLUE 有序列表 dog ca ...

  7. Django在admin模块中显示auto_now_add=True或auto_now=True的时间类型列

    转载自: http://www.tuicool.com/articles/ZryE7f 在Django如果model中的列定义了auto_now_add或auto_now属性,那么这种列不会在admi ...

  8. 关于Golang中database/sql包的学习

    go-sql-driver 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. db.Exec() 调用完毕后会马上把连接 ...

  9. 【洛谷】【二分答案+贪心】P1316 丢瓶盖

    [题目描述:] 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? [ ...

  10. Java基础加强之并发(四)synchronized关键字

    并发系列参考文章http://www.cnblogs.com/skywang12345/p/3323085.html#3907193 synchronized原理 在java中,每一个对象有且仅有一个 ...