前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GDB查看xtrabackup备份流程

GDB查看xtrabackup备份流程

原创
作者头像
大大刺猬
发布2023-03-03 17:22:29
8120
发布2023-03-03 17:22:29
举报
文章被收录于专栏:大大刺猬大大刺猬

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吧

代码语言:javascript
复制
gdb `which xtrabackup`
代码语言:javascript
复制
break main

运行程序

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

代码语言:javascript
复制
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. 备份流程如下

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 环境准备
  • 开始GDB
    • 进入GDB 打断点
      • 运行程序
        • innobackupex
          • xtrabackup_backup_func
            • 获取当前LSN
            • 创建新线程去拷贝日志
            • 整了4个线程去加载表空间信息
            • 创建 2(parallel) 个线程去拷贝数据(innodb)
            • 拷贝myisam表
            • 获取最新的lsn
            • 停止日志拷贝线程
            • 复制完成(backup_finish)
        • 总结
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档