全量物理备份工具 gs_basebackup
gs_basebackup是openGauss提供的物理备份工具,可对数据库提供全量的物理备份。数据库服务器把需要备份的数据文件和XLog日志发送给gs_basebackup,gs_basebackup收到后将文件保存到本地指定的目录,从而完成数据库的物理备份。
1 简单使用
1.1 常用参数说明
| 参数 | 描述 |
|---|---|
| -D | 指定备份文件输出目录 |
| -X | XLog的备份方式(fetch/stream) |
| -F | 指定备份文件的输出格式(plain/tar) |
| -Z | 指定备份文件压缩级别(仅在输出格式为tar时有效) |
| -U | 指定进行备份操作的用户 |
| -h | 指定正在运行服务器的主机名 |
| -p | 指定数据库服务器端口号 |
说明:
- 前四个为备份相关参数,其中-D参数必选;后三个为连接相关参数
- -F默认为plain,plain格式将输出写成平面文件,使用和当前数据目录和表空间相同的布局;tar模式将输出写成目标目录中的tar文件,openGauss输出的tar压缩包和标准压缩包有所不同,需要通过
gs_tar命令进行解压
1.2 简单使用示例
gs_basebackup -D /path/to/dir/ -h hostname -p port

2 实现原理

备份工具与数据库服务器交互流程
2.1 gs_basebackup实现原理
gs_basebackup是一个独立的二进制程序,有自己的主函数,代码在src/bin/pg_basebackup/下,主函数入口在pg_basebackup.cpp文件中,gs_basebackup和gs_tar共用同一个主函数。
2.1.1 主要流程
- 命令行参数解析
- 备份主流程
2.1 请求数据传输链接conn = GetConnection();
2.2 执行IDENTIFY_SYSTEM获取时间线和系统标识符
2.3 执行BASE_BACKUP LABEL启动实际备份
2.4 获取XLog存放路径
2.5 获取备份开始时XLog的起始位置
2.6 接收backup_label并创建表空间路径tablespace_list_create();
2.7 创建日志传输子进程bgchild = fork(); exit(LogStreamerMain(g_childParam));
2.8 接收数据文件ReceiveAndUnpackTarFile();
2.9 接收备份结束时XLog的位置
2.10 MOT内存表数据处理FetchMotCheckpoint();
2.11 将XLog结束位置发送到日志接收子进程并等待子进程结束
2.12 断开链接PQfinish(conn); - 资源释放
说明:
- 日志接收子进程中会重新请求一个链接,用于XLog的传输。并且会重新获取系统标识符进行校验。在XLog接收子进程中通过
while(1)来循环接收数据库服务器发来的数据,并实时检查是否收到主进程的XLog结束位置,接收到结束位置后判断当前接收到的XLog位置与结束位置的关系,以判断是否结束XLog的接收 - 主进程和日志接收子进程通过管道进行通信
- backup_label内容:
START WAL LOCATION: 0/53000028 (file 000000010000000000000053)
CHECKPOINT LOCATION: 0/530000A8
METHOD: streamed
BACKUP FROM: master
START TIME: 2023-02-01 16:05:11 CST
LABEL: gs_basebackup base backup
2.2 数据库服务器端实现原理
在数据库服务器端,备份主要在HandleWalReplicationCommand()函数中进行,该函数接收备份工具客户端命令,并根据命令标识符进行相应的处理。数据库服务器端主要处理流程如下:
void HandleWalReplicationCommand(const char* cmd)
{
/* 命令解析验证 */
yyscanner = replication_scanner_init(cmd);
parse_rc = replication_yyparse(yyscanner);
replication_scanner_finish(yyscanner);
/* 处理 */
IdentifyCommand()
{
switch(type){
case T_IdentifySystemCmd: /* IDENTIFY_SYSTEM */
/* 返回系统标识符和时间线 */
IdentifySystem();
break;
case T_BaseBackupCmd: /* BASE_BACKUP LABEL */
SendBaseBackup() // 发送完整的备份数据
{
parse_basebackup_options(); /* 解析备份命令参数 */
send_xlog_location(); /* 向备份工具客户端发送XLog路径 */
perform_base_backup() /* 执行数据文件的备份 */
{
startptr = do_pg_start_backup(); /* 获取开始备份时的XLog位置 */
SendXlogRecPtrResult(startptr); /* 向备份工具客户端发送XLog起始位置 */
SendTableSpaceForBackup(); /* 发送表空间下的数据文件进行备份 */
endptr = do_pg_stop_backup(); /* 备份结束并返回结束时XLog位置 */
SendXlogRecPtrResult(endptr); /* 将备份结束时的XLog位置发送到备份工具客户端 */
}
}
bresk;
}
case T_StartReplicationCmd: /* START_REPLICATION */
StartReplication();
break;
}
}
- 在
do_pg_stop_backup()中,会在数据备份结束对应的XLog之后插入一条XLog(XLogInsert(RM_XLOG_ID, XLOG_BACKUP_END)),然后强制截断当前XLog文件,该条XLog的位置即是备份结束的XLog位置 - 数据文件传输在
SendTableSpaceForBackup()中,XLog传输在StartReplication()中
3 其它
3.1 如何保证备份数据的一致性
- 服务器发送完数据文件后会新插入一条日志,并记录该XLog的位置,然后将该位置发送到
gs_basebackup的主进程,用于通知日志接收子进程接收终止位置。这个过程保证了备份的XLog覆盖整个数据文件备份的过程,即使在复制数据文件时由于数据库并发刷盘导致的数据页可能出现不一致的情况,也能够通过XLog进行恢复,保证备份数据的一致性。
3.2 参考内容
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




