1、innobackupex备份原理
1、innobackupex启动并fork一个进程启动xtrabackup,然后等待xtrabackup备份InnoDB文件; 2、xtrabackup备份时存在两个线程,一个负责复制redo,一个负责复制ibd文件; redo复制线程先启动,从最新checkpoint开始顺序复制redo 数据复制线程在redo线程后启动,负责复制ibd文件,innobackupex一直处于等待状态 3、xtrabackup拷贝完成idb后,通知innobackupex,同时自己进入等待,redo线程仍然继续复制redo; 4、innobackupex收到xtrabackup通知后,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件; 包括 frm、MYD、MYI、CSV、opt、par等文件,此时数据库全局只读状态非InnoDB表比较多的话时间可能会比较长 5、当innobackupex拷贝完所有非InnoDB表文件后,通知xtrabackup,同时自己进入等待; 6、xtrabackup收到innobackupex备份完非InnoDB通知后,就停止redo拷贝线程,然后通知innobackupex日志复制完成; 7、innobackupex收到redo备份完成通知后,就开始解锁,执行UNLOCK TABLES; 8、innobackupex和xtrabackup进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex等待xtrabackup子进程结束后退出。
2、常用参数说明
常用参数: --user=USER #指定备份用户,不指定的话为当前系统用户 --password=PASSWD #指定备份用户密码 --port=PORT #指定数据库端口 --defaults-group=GROUP-NAME #在多实例的时候使用 --host=HOST #指定备份的主机,可以为远程数据库服务器 --apply-log #回滚日志 --database #指定需要备份的数据库,多个数据库之间以空格分开 --defaults-file #指定mysql的配置文件 --copy-back #将备份数据复制回原始位置 --incremental #增量备份,后面跟要增量备份的路径 --incremental-basedir=DIRECTORY #增量备份时使用指向上一次的增量备份所在的目录 --incremental-dir=DIRECTORY #增量备份还原的时候用来合并增量备份到全量,用来指定全备路径 --redo-only #对增量备份进行合并 --rsync #加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用 --safe-slave-backup #会暂停slave的sql线程,待备份结束后再启动 --no-timestamp #生成的备份文件不以时间戳为目录. --slave-info #打印二进制日志的position和主库的名字,写入xtrabackup_slave_info文件
3、全量备份与恢复
##全量备份 innobackupex --defaults-file=/data01/3306/my3306.cnf --user=root --password=root --socket=/data01/3306/run/mysql.sock /data01/3306/backup ##全量恢复 innobackupex --apply-log /data01/3306/backup/2018-08-14_21-02-01 ##将恢复的数据文件复制到datadir innobackupex --defaults-file=/data02/3307/my3307.cnf --user=root --password=root --copy-back /data01/3306/backup/2018-08-14_21-02-01
4、增量备份与恢复
xtrabackup是支持增量备份的,但是只能对InnoDB做增量,InnoDB每个page有个LSN号,LSN是全局递增的,page被更改时会记录当前的LSN号,每次备份会记录当前备份到的LSN(xtrabackup_checkpoints文件中),增量备份就是只拷贝LSN大于上次备份的page,比上次备份小的跳过,每个ibd文件最终备份出来的是增量 delta 文件。
MyISAM 是没有增量的机制的,每次增量备份都是全部拷贝的。
增量备份过程和全量备份一样,只是在ibd文件拷贝上有不同。
##全量备份 innobackupex --defaults-file=/data01/3306/my3306.cnf --user=root --password=root --socket=/data01/3306/run/mysql.sock /data01/3306/backup ##增量备份 innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --incremental /data01/3306/backup/incr --incremental-basedir=/data01/3306/backup/2018-08-14_21-02-01 --parallel=2 innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/tmp/mysql.sock --incremental /data01/3306/backup/incr --incremental-basedir=/data01/3306/backup/incr/2018-08-14_22-02-01 --parallel=2 ##增量恢复 --全量恢复 innobackupex --apply-log --redo-only /data01/3306/backup/2018-08-14_21-02-01 ##将增量1应用到完全备份## innobackupex --apply-log --redo-only /data01/3306/backup/2018-08-14_21-02-01 --incremental-dir=/data01/3306/backup/incr/2018-08-14_22-02-01 ##将增量2应用到完全备份,注意不加 --redo-only 参数了## innobackupex --apply-log /data01/3306/backup/2018-08-14_21-02-01 --incremental-dir=/data01/3306/backup/incr/2018-08-14_23-02-01 ##把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据## innobackupex --apply-log /data01/3306/backup/2018-08-14_21-02-01