1.3.3针对各类故障进行恢复的流程
1.3.3.1事务故障
PG中使用多版本并发存储数据,所以发生事务故障时,不需要进行恢复,DBMS只读取有效数据,数据库仍处于一致状态。
1.3.3.2系统故障和介质故障的恢复
系统故障和介质故障调用的是同一个函数入口:startupxlog(),可以在reference图中找到上下调用关系:
StartupXLOG
InitPostgres
StartupProcessMain
AuxiliaryProcessMain
main
SubPostmasterMain
main
调用startupxlog()进行系统和介质故障恢复的流程:
1.首先,读控制文件,得知系统状态。
系统状态分为几种情况:
DB_STARTUP //系统启动中
DB_SHUTDOWNED //系统正常关闭
DB_SHUTDOWNING //系统正在关闭,通常用于“CreateCheckPoint”开始处,先把系统状态置为“DB_SHUTDOWNING”,然后执行创建checkpoint的操作,到结束创建checkpoint的尾部,再把系统状态置为“DB_SHUTDOWNED”
DB_IN_CRASH_RECOVERY //系统在恢复状态时发生过“crash”,需要从上一次备份中恢复被毁坏的数据
DB_IN_ARCHIVE_RECOVERY //系统在归档状态时发生过“crash”,需要从更早的备份中恢复数据
DB_IN_PRODUCTION //系统恢复完毕,置系统状态为运行处理事务