GDB查看xtrabackup备份流程
 南窗  分类:IT技术  人气:172  回帖:0  发布于1年前 收藏

xtrabackup备份原理其实到处都能找到, 也有很多源码解读的, 但是都不太直观, 所以本文使用GDB查看下xtrabacup的备份流程(仅全备流程)

写在前面

gdb的基础使用可以看前面的文章: https://cloud.tencent.com/developer/article/2226040

新增如下gdb命令(可选)

LWP lightweight process 就是线程

命令

解释

info threads

查看线程信息, 带*的表示是当前的线程

thread n

切换到第n个线程

run

运行程序

环境准备

gdb OS自带的即可, 本文:7.6.1-120.el7

xtrabackup:2.4.26 (顺便看下innobackupex和xtrabackup为啥解析参数不一样)

xtrabackup-2.4.26 二进制包下载地址: https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.26/binary/tarball/percona-xtrabackup-2.4.26-Linux-x86_64.glibc2.12.tar.gz

xtrabackup-2.4.26 源码包下载地址:https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.26/source/tarball/percona-xtrabackup-2.4.26.tar.gz

注: 把源码也下载下来, 不然有些函数光看名字可能不知道意思...

开始GDB

进入GDB 打断点

假设不熟悉xtrabackup的源码, 那我们直接断点main吧

gdb `which xtrabackup`
break main

运行程序

如果你下载了源码, 可以设置下路径, 方便gdb查看源码

set substitute-path /mnt/workspace/percona-xtrabackup-2.4-binary-tarball/label_exp/min-centos-6-x64/percona-xtrabackup-2.4.26 /root/percona_xtraback/percona-xtrabackup-percona-xtrabackup-2.4.26
run --defaults-file=/data/mysql_3308/conf/mysql_3308.cnf --user=root --port=3308 --password=123456 --host=192.168.101.21 --parallel=2 --target-dir=/data/backup/t20230303 --backup

innobackupex

前面都是初始化参数, 没啥好看的. 基本上都直接next了, 直接到handle_options

这里会比较程序名字是否为innobackupex, 是的话设置innobackupex_mode为true

如果上面的innobackupex_mode为true的话, 就做参数转换(ibx_init) ,为的就是兼容老版本

xtrabackup_backup_func

参数初始完成后(含连接Mysql), 就到了备份函数, 使用step进入备份函数, 查看详情

获取当前LSN

创建新线程去拷贝日志

可以使用thread 2 切换到2线程去, 看下这个线程的栈帧

别忘了切回来 thread 1

整了4个线程去加载表空间信息

创建 2(parallel) 个线程去拷贝数据(innodb)

拷贝myisam表

不锁表(--no-lock)的话,会停SQL_THREAD (STOP SLAVE SQL_THREAD)

直接next了, 不去细看了

获取最新的lsn

停止日志拷贝线程

复制完成(backup_finish)

释放锁(含Binlog)之类的, 如果停止了sql_thread线程的话, 也会启动

然后就是资源释放, 关闭刚才那4个线程

总结

1. 为了兼容innobackupex, xtrabackup内部做了程序名校验

2. backup: xtrabackup_backup_func()

prepare: xtrabackup_prepare_func

copy/move: xtrabackup_copy_back/xtrabackup_move_back

3. xtrabackup是以备份结束时间点为恢复点的, (mysqldump是以备份开始的时间点作为恢复点的). 因为xtrabackup是利用的redo记录备份期间的数据变化的, Mysqldump是以事务(--single-transaction)去保证数据一致的

4. 备份流程如下

开始备份
初始化参数
获取当前LSN
拷贝redo log(持续拷贝)
获取表空间(innodb)信息
拷贝innodb数据
拷贝myisam表(可能会锁,和参数--no-lock有关)
获取最新的LSN
停止redo log拷贝线程
释放锁和其它资源
拷贝完成

讨论这个帖子(0)垃圾回帖将一律封号处理……