DBA面试考点[XtraBackup]

[toc]

XtraBackup

全备

graph LR
A[Innobackupex全备流程] -->B[1. 连接mysql]
A-->C[2. 读取配置文件,找到相应的数据和日志位置]
A-->D[3. start xtrabackup_log:创建xtrabackup_logfile文件.模拟mysql instance方式,以读写模式打开并读取redolog,检查到当前checkpoint点,从当前checkpoint点位置开始复制redolog,同时持续扫描redolog,有新的redolog数据就复制到xtrabackup_logfile文件中]
A-->E[4. 复制innodb引擎表的:.ibd/.ibdata1/undo logs等文件]
A-->F[5. 执行Flush NO_WRITE_TO_BINLOG TABLE/flush tables with read lock]
A-->G[6. 复制非Innodb引擎的表.MYD/.MYI/.frm/.opt/misc等文件和innodb引擎表的.frm/.opt/misc等文件]
A-->H[7. 获取二进制日志文件位置或GTID,并写到xtrabackup_binlog_info文件]
A-->I[8. 执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS语句]
A-->J[9. 停止日志复制线程 <复制redolog的线程>]
A-->K[10. 执行UNLOCK TABLES语句]
A-->L[11. 最后,生成backup-my.cnf/xtrabackup_info等文件]

说明

  • 步骤5. FTWRL加的只读S锁,原因,方式读取数据时发生DDL操作,并获取binlog位置,redo日志暂时也会卡在这里
  • 步骤8. 执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS语句将innodb层的redolog持久化到磁盘后进行复制(因为xtrabackup并不备份二进制日志,如果这个过程出现问题,就导致恢复之后丢失redolog中的数据,做主从复制可能会同步出错),然后停止读redolog复制线程,innobackupex备份数据的时间点是停止redolog复制时的数据对应的时间点
全量备份流程总结
  1. 复制已有的redo log,然后监听redo log变化并持续复制
  2. 复制事务引擎数据文件
  3. 等到数据文件复制完成
  4. 加锁:全局读锁
  5. 备份非事务引擎数据文件及其他文件
  6. 获取binlog点位信息等元数据
  7. 停止复制redo log
  8. 解锁:全局读锁
  9. 复制buffer pool dump
  10. 备份完成
FAQ
  1. 为什么要先复制redo log,而不是直接开始复制数据文件?

因为XtraBackup是基于InnoDB的crash recovery机制进行工作的。如上图2中的页2,由于是热备操作,在备份过程中可能有持续的数据写入,直接复制出来的数据文件可能有缺失或被修改的页,而redo log记录了InnoDB引擎的所有事务日志,可以在还原时应用redo log来补全数据文件中缺失或修改的页。所以为了确保redo log一定包含备份过程中涉及的数据页,需要首先开始复制redo log。

  1. 加全局读锁的作用?

因为要保证”非事务资源 自身的一致性“ 和 ”非事务资源与 事务资源的一致性“。在加锁期间,没有新数据写入,XtraBackup会复制此时的binlog位置信息,frm表结构,MyISAM等非事务表。

  1. 为什么要先停止复制redo log,再解锁全局读锁?

也是因为要保证“非事务资源与事务资源的一致性”,保证通过redo log回放后的InnoDB数据与非InnoDB数据都是处于读锁期间取得的位点。

全备恢复

graph LR
A[全备恢复流程] -->B[1. 进入指定的备份目录,查看备份文件是否已经执行过apply-log<prepared>.这在xtrabackup_checkpoint文件中的backup_type=full-backuped字段有记录,如果已经apply-log过的,该字段为:backup_type=full-prepared]
A-->C[2. 在备份目录下读取xrabackup_logfile文件,识别出文件大小和其实LSN号]
A-->D[3. 读取备份目录下的backup-my.cnf中的参数,为下一步的恢复过程启动一个mini innodb instance]
A-->E[4. 通过redolog的其实LSN号,往后扫描需要恢复的所有redolog]
A-->F[5. 备份文件执行apply-log的过程,被视同为非正常关闭的数据库之后的重启数据库,这个时候会对备份数据文件执行CrashRecivery]
A-->G[6. 应用redolog完成后,会执行一次正常关闭mini innodb instance操作<innodb_fast_shutdown=1的方式>]
A-->H[7. 重新启动mini innodb instance,使用backup-my.cnf配置文件中的redo log file配置生成新的redo log file重新启动mini innodb instance时又会重新执行一次crash recovery]
A-->I[8. 重新启动mini innodb instance正常之后,就执行正常的shutdown操作,完成apply-log过程]
全备还原流程
  1. 模拟MySQL进行recover,将redo log回放到数据文件中
  2. 等到recover完成
  3. 重建redo log,为启动数据库做准备
  4. 将数据文件复制回MySQL数据目录
  5. 还原完成
FAQ

在recover完成后,InnoDB数据与非InnoDB数据是达成一致的吗?

InnoDB数据会被恢复至备份结束时(全局读锁时)的状态,而非InnoDB数据本身即是在全局读锁时被复制出来,它们的数据一致

增量备份

大部分流程跟全部相同,只有在步骤2 有所区别
步骤2. 读取配置文件,找到相应的数据和日志文件的位置,读取上一次备份的to_lsn号作为增备的起始位置

FAQ
  1. 开始做一个增量备份, 那么 如何识别InnoDB的哪些数据是增量的?

数据文件中的数据页都有LSN号, LSN可以看做是数据页的变更时间戳。 通过这个时间戳, 就可以识别 数据页 在 全量备份后 是否修改过, 即通过LSN可以识别数据是否是增量的

  1. 如果一个数据页原本不是增量范围内的, 在增量备份的过程中, 数据页更新了, 那么增量备份是否会涵盖这个数据页?

本质, 与全量备份中的数据页新旧不一致的问题 相同, 解决方案也相同: 通过恢复时回放redo log, 解决数据新旧不一致的问题.
也就是说: 增量备份过程中, 如果数据页被更新了, 那数据文件中的这个数据页** 有可能 被拷贝到备份中, 也可能 没有被拷贝到备份中, 但这个更新信息一定会被redo log记录**, 并被记录在备份中. 在恢复过程中, redo log会被"安全地"回放成功, 达成数据的新旧一致.

增备恢复

graph LR
A[增备恢复流程] -->A1[1. 对全备执行appl-log+redo-only]
    A1-->B[1.1. 进入指定的备份目录,查看备份文件是否已经执行过apply-log<prepared>.这在xtrabackup_checkpoint文件中的backup_type=full-backuped字段有记录,如果已经apply-log过的,该字段为:backup_type=full-prepared]
    A1-->C[1.2. 在备份目录下读取xrabackup_logfile文件,识别出文件大小和其实LSN号]
    A1-->D[1.3. 读取备份目录下的backup-my.cnf中的参数,为下一步的恢复过程启动一个mini innodb instance]
    A1-->E[1.4. 通过redolog的其实LSN号,往后扫描需要恢复的所有redolog]
    A1-->F[1.5. 备份文件执行apply-log的过程,被视同为非正常关闭的数据库之后的重启数据库,这个时候会对备份数据文件执行CrashRecivery]
    A1-->G[1.6. 应用redolog完成后,会执行一次正常关闭mini innodb instance操作<innodb_fast_shutdown=1的方式>注:全备应用redolog时对未提交的事物不会执行回滚]

A[增备恢复流程] -->A2[2. 对增备执行apply-log+redo-only合并到全备中]
    A2-->H[2.1 进入指定备份目录,读取增备目录中的 xtabackup_checkpoint 文件的from_lsn字段的LSN值]
    A2-->I[2.2 查看xtabackup_checkpoint文件中backup_type字段是否为log-appled,如果是则表示全备目录已经执行过apply-log+redo-only]
    A2-->J[2.3 在备份目录下读取xtrabackup_logfile文件,识别出文件大小和其实LSN号]
    A2-->K[2.4 读取备份目录下的backup-my.cnf中的参数,获取增备目录下的backup-my.cnf中的innodb_log_group_home_dir参数值]
    A2-->L[2.5 从增备目录下扫描所有innodb表增备的表空间文件:ibdata1/ibd,独立undolog并吧这些增量的表空间数据页应用到全备的对应表空间数据文件中]
    A2-->M[2.6 通过redolog的其实LSN号,往后扫描需要恢复的所有redolog]
    A2-->N[2.7 应用redolog完成之后,会执行一次正式关闭mini innodb instance操作<innodb_fast_shutdown=1方式>注:全备应用redolog时对未提交的事务不会执行回滚]
    A2-->O[2.8 从增备目录中复制.opt/.frm/.MYI/.MYD等非innodb引擎相关数据和表定义等文件,覆盖增备目录下,完成apply-log+redo-only操作]
    
 A[增备恢复流程] -->A3[对全备执行apply-log]
 A3-->P[与全备流程图过程一样]
增量备份流程总结
  1. 先还原一个全量备份 到 临时目录
  2. 开始还原增量备份, 将增量备份中的增量的数据文件, 覆盖到临时目录中
  3. 将增量备份中的redo log, 回放到临时目录中
  4. 将其他文件覆盖到临时目录中
  5. 增备还原完成
  6. 重建redo log, 为启动数据库做准备
  7. 将临时目录中的文件, 拷贝到MySQL的数据目录中
FAQ

非事务类的信息, 能否产生增量备份?

非事务类的信息 没有提供识别增量的机制, 只能采用全局读锁+全部拷贝+全部回放的机制进行备份

参考链接
[原理解析] XtraBackup全量备份还原
[原理解析] XtraBackup增量备份还原
[原理解析] XtraBackup 备份恢复时为什么要加apply-log-only参数?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容