1.3.3.3恢复过程步骤
1.
读控制文件,如果有,则按照文件中的信息设置恢复参数。
2. 对控制文件中所写的系统状态进行判断,给出系统状态提示
3. 读出时间线历史记录中的时间线列表expectedTLIs,如果recoveryTargetTLI不在时间线列表expectedTLIs中,则系统出现故障。
4. 如果存在备份标记文件(备份标记文件是做基础备份时生成的,参见“在线备份(热备份)”和“为什么要执行基础备份?”),读取备份标记文件中的备份标记,从备份标记定义的检查点读取检查点的记录到record中(说明:如果指定恢复某个备份标记“AAA”状态时的数据,则需要使用备份标记文件中指定的checkpoint指定的地方开始做redo,这样就避免了“AAA”状态之后,控制文件可能被多次再写入多个checkpoint所造成的与“AAA”状态不一致的情况发生)。
a) 如果record不空,则从record中的检查点记录处开始redo恢复,把参数InRecovery参数设置为true。
b) 若record为空,则说明系统出现错误。
5. 如果没有备份标记文件,读取控制文件中的最后一个检查点(表明用户默认要恢复到最近的checkpoint指定的位置),并把它的记录读到record中。
a) 如果record不空,读出了检查点记录的消息。
b) 若record为空,找控制文件中倒数第二个检查点,并把它的记录读到record中。
c) 如果新的检查点记录record不为空,把参数InRecovery参数设置为true。
d) 如果新的检查点记录record仍为空,则说明系统出现错误。
说明:(4)步与(5)步是同一个if判断,非此即彼。
6. 从上面各步骤中,一定会得到一个有效的检查点记录。把record记录中的值赋给一个检查点结构体变量checkPoint。
7. 把checkPoint的nextXid和nextOid赋给共享缓冲区中的变量缓冲区ShmemVariableCache的nextXid和nextOid。把checkPoint的时间线ID赋给ThisTimeLineID。
8. 在checkPoint的redo指针和undo指针有效的情况下,把参数InRecovery参数设置为true。
9. 在控制文件状态不是DB_SHUTDOWNED(系统正常关闭)时,把参数InRecovery参数设置为true。
10. 如果恢复控制文件中的使用归档文件进行恢复的标志参数InArchiveRecovery为真,把参数InRecovery设置为true。
11. 当参数InRecovery的值为true时,执行恢复。
a) 初始化恢复环境,启动各种需要恢复的资源(调用“RmgrTable[rmid].rm_startup();”)。
b) 设置需要redo的日志记录的起始位置,把起始位置处的日志记录读入record(初始record应该是离checkpoint最近的那个记录,应该从此record开始恢复,此处调用“ReadRecord”确认要开始恢复的第一条记录就是离checkpoint最近的那条记录)。
i. 如果record不空,从record开始循环执行redo操作,处理完一条需要redo的记录(通过调用“RmgrTable[record->xl_rmid].rm_redo(EndRecPtr, record);”完成本条record对应的redo操作),然后继续读取下一条记录到record中。循环终止的条件是已经执行到了我们所要求的时间线的位置,或者已经把所有的日志记录中需要redo的record执行完毕。
ii. 如果record为空,也就说明不需要进行redo操作。
c) PG中只进行redo恢复操作,虽然定义了undo的扩展接口,但是各种资源的undo函数是空函数,也就是说,PG不实际进行undo操作,数据库的一致性的保持是由日志和数据的多版本并发控制和redo日志综合起来达到的。
12. 本次恢复结束之际,确定是否需要再设置一个新的时间线。如果是恢复到某个指定的时间点上而不是全部恢复,则生成一个新的时间线,以给本次系统运行时记载xlog使用。
13. 把恢复后的一些信息写到xlog对应个共享缓存“XLogCtl”中,以备在后来系统运行的过程中使用
14. 当参数InRecovery的值为true时,执行初始环境的清理工作(对应前面的恢复前环境初始化工作,通过调用“RmgrTable[rmid].rm_cleanup()”完成)。
15. 执行“CreateCheckPoint”,强迫恢复的内容刷到磁盘
16. 关闭恢复环境
17. 正式结束恢复操作,保存对应的信息到控制文件
18. 开始启动clog、prepared transactions需要的资源或环境等内容,为恢复结束后、系统正常运行做准备工作
19. 恢复过程完全结束