innobackupex备份和恢复原理
innobackupex
全备份原理:
1.执行一次checkpoint,找到最后那个checkpoint的lsn
2.从这个lsn开始记录所有产生的redo log
3.cp innodb data
4.flush tables with read lock
5.cp 非innodb 数据(myisam数据,.FYM,FIM等文件)
6.锁定binlog文件并且记录当前的binlog postion
7.释放所有binlog 锁 ,释放unlock tables
增量备份的原理:在第三步的有所变化
3.数据页面的比对(lsn),记录下有lsn不一样的数据页面
备份命令:
全备:
innobackupex --user=$user --password=$pass --socket=$sock_path --no-timestamp --parallel=$num $DIR$basedir/basebk
增量备份:
innobackupex --user=$user --password=$pass --socket=$sock_path --no-timestamp --parallel=$num --incremental-basedir=$dir_bak
--incremental $dir_incre
常用参数:
--no-timestamp : 使用自定义目录
--parallel=$num : 并行的线程数
--databases:指定需要备份db列表,还可以指定到表
--incremental-basedir:上一次备份目录
innobackupex 恢复原理:将page head 部的lsn和 redo log 中lsn进行对比,
如果redo lsn 比页面的page的head 中的lsn大 ,就恢复该页面,
1.只有全备
innobackupex --apply-log /storage/group2/bak/basebk
2.有增量备份
innobackupex --apply-log --redo-only /storage/group2/bak/basebk
innobackupex --apply-log --incremental /storage/group2/bak/basebk --incremental-dir=/storage/group2/bak/incbk1
常用参数:
--apply-log: 应用全部的redo log
--redo-only:只应用commit的redo的 log
--incremental:每次恢复的过程中都是全备
问题2:(确认)
在应用最后一个增量备份的时候使用了 --redo-only 参数,导致 mysql 启动失败
,报错:日志丢失或者文件损坏问题分析
解释:在mysql启动时候会对mysql数据页面数据的完整性进行检测,发现有问题的页面就试图
恢复,而恢复是要通过redolog的,当redolog找不到的时候,就会报错,页面损坏。
问题3:(已经确认)
在有增量备份的时候进行恢复,是否可以不要--redo-only 参数
不可以,可能会造成部分数据数据丢失