openGauss数据库源码解析系列文章——备份恢复机制

2023年 8月 15日 32.3k 0

(1) gs_basebackup在BaseBackup函数中创建数据传输的连接。

(2) 执行IDENTIFY_SYSTEM命令,获取时间线和系统标识符。

(3) 执行BASE_BACKUP LABEL备份命令,获取XLOG的存放路径和备份开始时日志的位置。然后从数据库服务器获取表空间的路径,创建对应的路径。

(4) 在拷贝数据文件之前,创建一个单独的子进程用于日志传输。日志传输处理的主函数为StartLogStreamer,在StartLogStreamer函数中,先调用GetConnection函数创建一个日志传输的连接,然后调用fork函数创建子进程,在子进程内部通过LogStreamerMain函数调用ReceiveXlogStream执行实际的日志传输。在ReceiveXlogStream中,也是先调用IDENTIFY_SYSTEM获取系统标识并且进行校验和前面获取的系统标识是否一致。接着执行START_REPLICATION,通知数据库服务器日志传输的起始位置。调用createHeartbeatTimer启动心跳线程,保证能够实时监控传输过程中的连接状态。接下来进行日志接收循环,接收数据库服务器传输的日志,写入本地日志路径,直到接收到通知的日志停止位置。

(5) 在主进程创建日志接收子进程之后,调用ReceiveAndUnpackTarFile进行数据文件的拷贝,在这个函数中,有一个while (1)循环,循环接收数据库服务器传输的数据文件,直到接收完数据库服务传输的全部数据文件。数据库文件传输完毕后,数据库服务器会返回一个备份结束时的日志位置。

(6) 主进程接收这个位置,把这个位置通过管道发送给日志接收子进程,日志接收子进程把这个位置与当前日志传输位置相比较,如果达到了这个位置,则日志接收结束,日志子进程退出。主进程等到日志传输子进程退出后,数据库备份的主流程就基本结束了。这个过程保证了redo日志覆盖到整个数据库文件的复制过程,即使在复制数据文件时可能由于数据库的并发刷盘导致数据页可能不一致,但这些不一致可以通过redo日志进行恢复,从而保证整个数据库备份数据的一致性。

(7) 后面两个函数,一个是FetchMotCheckpoint函数,这个函数备份MOT内存表的数据文件,流程和前面基本相似;还有一个是backup_dw_file函数,在backup_dw_file文件中,删除存在的双写文件,然后写入一个空的数据页,这个只是一个空文件,避免启动时的文件检查异常。最后释放前面获得的系统标识符,至此,客户端工具完成整个备份流程。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论