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
注: 把源码也下载下来, 不然有些函数光看名字可能不知道意思...
假设不熟悉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
前面都是初始化参数, 没啥好看的. 基本上都直接next了, 直接到handle_options
这里会比较程序名字是否为innobackupex, 是的话设置innobackupex_mode为true
如果上面的innobackupex_mode为true的话, 就做参数转换(ibx_init) ,为的就是兼容老版本
参数初始完成后(含连接Mysql), 就到了备份函数, 使用step进入备份函数, 查看详情
可以使用thread 2 切换到2线程去, 看下这个线程的栈帧
别忘了切回来 thread 1
不锁表(--no-lock)的话,会停SQL_THREAD (STOP SLAVE SQL_THREAD)
直接next了, 不去细看了
释放锁(含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拷贝线程
释放锁和其它资源
拷贝完成