查询数据库状态
--查询DB状态 SELECT DATABASEPROPERTYEX('AdventureWorks2016','Status') SELECT STATE_DESC FROM sys.databases WHERE name='AdventureWorks2016' --更改DB状态 ALTER DATABASE AdventureWorks2016 SET OFFLINE ALTER DATABASE AdventureWorks2016 SET ONLINE ALTER DATABASE AdventureWorks2016 SET EMERGENCY ALTER DATABASE AdventureWorks2016 SET SINGLE_USER --有时候得先杀该DB所有进程才能恢复多用户 ALTER DATABASE AdventureWorks2016 SET MULTI_USER
1.RECOVERING
SQL SERVER在做数据库修改时,是先写日志,然后在修改内存中的数据页。至于硬盘上的数据页内容,将在检查点(Checkpoint)或者是SQL SERVER在做Lazy Write的时候更新。所以在大部分时候,有一些硬盘上的数据页面里的数据不是最新的版本。也就是说,硬盘上的数据和实际完成的修改,并不“一致”。如果数据库在这个时间点被关闭,下次SQL SERVER重新打开数据库的时候,为了维护数据库的一致性,必须完成三件事。
1.分析要做的工作:SQL SERVER会去分析事物日志文件,找到要重做和回滚的事务。
2.Redo(重做):SQL SERVER会将已经提交,但是还没有来得及在硬盘上完成的修改重新做一遍。
3.Rollback&Undo(撤销和回滚):在上次数据库被关闭时,可能有一些修改已经在数据页面上完成,但是事务本身没有被提交。对于这些做到一半的事务,SQL SERVER一律全部回滚,以保证数据库的一致性。所以磁盘里被改过的数据还要再被改回来。
做这三件事的过程,被称为“数据库恢复”(Recovery)。只有经过恢复的数据库,才能保证是一个“一致性”数据库,才能够被安全的访问。
下面的动作会让SQL SERVER决定对数据库做恢复。
(1)CREATE:
(2)ALTER ONLINE:
(3)RRESTORE WITH RECOVERY:以RECOVERY的方式恢复一个数据库
(4)Database Startup:开启数据库。只要数据库模式不是设的自动关闭(Auto Close),SQL SERVER会在服务启动的时候自动开启每一个数据库。如果一个用户数据库设成自动关闭,会在第一个用户访问数据库的时候做这个动作。
恢复如果能够正常完成,那么数据库将进入ONLINE状态。
恢复动作如果因为有些资源不能访问而失败,例如某个数据文件或者日志文件打不开等,数据库会进入RECOVERY PENDING模式。
恢复动作因为数据文件或日志文件里的内容有损坏被失败,例如SQL SERVER要重做事务修改,但是日志文件里相应的日志信息读不出来;或者要撤销事务,修改数据文件的页面时却发现页面里的数据长得不是想象的那个样子,那么数据库就会进入一个有名的状态;质疑(SUSPECT)
2.ONLINE
在这种状态下,数据库可以被普通用户访问,可以被查询和修改。只有一种方法能够使得数据库进入ONLINE状态,那就是已经成功的完成了数据库恢复。SQL SERVER通过这种机制保证数据库的一致性。
一个ONLINE的数据库在管理员发出“ALTER OFFFLINE”指令后,可以进入OFFLINE状态。在管理员发出“RESTORE”指令后,可以进入RESOTRING状态。
3.RECOVERY PENDING
如果数据库在做恢复的时候不能正确打开所有的数据库文件,数据库会进入RECOVERY PENDING的状态。在这个状态下管理员有2种选择:一种是解决数据库文件不能正确打开问题,然后用alter online指令命令SQL SERVER在做一次恢复;或者放弃当前的数据库,还原备份。
4.SUSPECT
当数据库做恢复的时候由于数据库文件或者日志文件里的损坏而失败,数据库会进入SUSPECT状态。在这个状态下管理员只有3中选择。
(1)在做一次alter online,命令SQL SERVER在做一次恢复。
(2)放弃当前的数据库,还原备份。
(3)将数据库状态设成EMERGENCY,继续尝试修复数据库。
5.EMERGENCY
紧急模式。在这个模式下,SQL SERVER对没有完成恢复的数据库开放一个只读得窗口,供管理员在没有备份的情况下尽可能地挽救数据。
6.RESTORING
数据库正在做恢复。在任何状态下,管理员都能去恢复数据库。在WITH RECOVERY的模式下,恢复数据库的最后一步,数据库进入RECOVERY模式。恢复做完后,数据库才能在线。
7.OFFLINE
数据库离线状态。这是数据库也不能被访问。管理员可以发出ALTER ONLINE命令,让数据开始恢复,从而进入ONLINE状态。