图片 1

SQLSERVER 运维日记-数据库状态

背景

新年伊始,小伙伴是不是还处于假期综合症的状态。我们在日常运维数据库的时候,会时常查看数据库的状态,检查数据库是否正常运行。对于这些状态的熟悉对于我们处理数据库无法访问的

问题非常重要。当数据库突然变成一个你没有见到过的状态时,你就会非常慌乱,手足无措。这里给小伙伴普及下数据库的各个状态。已经他们是怎么转换的

 

数据库状态 (database states)

案例

 

前两天在处理一个客户问题,突然某个数据库无法访问了。数据库下面的表也无法查看。从SSMS界面上看数据库是正常的状态(就是数据库名字后面没有显示特别的状态)。查看

SYS.DATABASES
查看状态列,发现是ONLINE。此时其他数据库是正常的,就这个库有问题。肯定是数据库状态不对。
那么问题出在哪里呢? 仔细观察发现这个问题的数据库 collation_name 是null
值。

原来问题在这,

刚刚联机的数据库不一定马上能接受连接。 要确定数据库何时可以接受连接,可以查询
sys.databases 的 collation_name 列或 DATABASEPROPERTYEX 的 Collation
属性。 在数据库排序规则返回非
Null 值之后,数据库就可以接受连接了。

 

于是用命令把数据库设置为脱机,然后马上联机,再查看sys.databases 的
collation_name 列 变成了非null值。此时数据库恢复正常。

 

 

查询数据库的当前状态 :

状态的转换

数据库有很多状态。他们是如何在这些状态之间进行切换的呢?下面这个图非常清晰的标示了各个状态的切换。在我刚学习数据库的时候,这个图给了我很大的帮助,

让我对数据库各个状态的转换有了很清楚的认识。

图片 1

 

 

ONLINE (在线) 

数据库可正常运行

RESTORING (正在还原)

数据库正在还原,当我们还原数据库使用NORECOVERY
模式时,数据库就会变成该状态

RECOVERING (正在恢复)

数据库启动,数据库创建,ALTER
ONLINE,RESTORE WITH
RECOERY 时,会经过这个状态,进行REDO,UNDO等操作。此时如果遇到问题就进入RECOVERY_PENDING。如果正常就会变成ONLINE。

RECOVERY_PENDING(等待恢复)

数据库在还原时遇到跟资源相关的错误,表明还原进程被挂起,数据库不能开始数据库的数据和日志的还原进程,这种情况下,最可能的原因是丢失数据文件或日志文件。

SUSPECT  (置疑)

数据库可能损坏了

EMERGENCY (紧急)

供DBA用来修复数据库的状态

OFFLINE (脱机)

离线状态

 

1、查询所有数据库的状态 ,通过sys.databases目录视图的state_desc列

总结

了解数据库处于的状态非常重要。我们如果还不熟悉的小伙伴可以看看。

 

user master
go
select state_desc ,[name] from sys.databases
go

2、查询指定数据库的状态,通过DATABASEPROPERTYEX函数的Status属性

select DATABASEPROPERTYEX('demoData','status')
go

 状态:

ONLINE:可以对数据库进行访问。 即使可能尚未完成恢复的撤消阶段,主文件组仍处于在线状态。

OFFLINE:数据库无法使用。 数据库由于显式的用户操作而处于离线状态,并保持离线状态直至执行了其他的用户操作。 例如,可能会让数据库离线以便将文件移至新的磁盘。 然后,在完成移动操作后,使数据库恢复到在线状态。

RESTORING:正在还原主文件组的一个或多个文件,或正在脱机还原一个或多个辅助文件。 数据库不可用。

RECOVERING:正在恢复数据库。 恢复进程是一个暂时性状态,恢复成功后数据库将自动处于在线状态。 如果恢复失败,数据库将处于可疑状态。 数据库不可用。

RECOVERY PENDING:SQL Server 在恢复期间遇到了与资源相关的错误。 数据库未损坏,但是可能缺少文件,或系统资源限制可能导致无法启动数据库。 数据库不可用。 需要用户另外执行操作来解决问题,并让恢复进程完成。

SUSPECT(质疑):至少主文件组可疑或可能已损坏。 在 SQL
Server启动过程中无法恢复数据库。 数据库不可用。需要用户另外执行操作来解决问题。

EMERGENCY(紧急):用户更改了数据库,并将其状态设置为
EMERGENCY。 数据库处于单用户模式,可以修复或还原。 数据库标记为
READ_ONLY,禁用日志记录,并仅限 sysadmin 固定服务器角色的成员访问。 EMERGENCY 主要用于故障排除。 例如,可以将标记为“可疑”的数据库设置为 EMERGENCY
状态。 这样可以允许系统管理员对数据库进行只读访问。 只有 sysadmin 固定服务器角色的成员才可以将数据库设置为
EMERGENCY
状态。