Loading

xtrabackup使用

1,背景知识:

innodb 存储图

逻辑单元从大到小:
表空间(tablespace) 段(segment) 区extent 页 page 行row 每个大逻辑单元内部都包含N个小单元

LSN:日志序列编号

增量备份原理:
每个page 有自己的LSN号码,全局递增,越大越新,增量备份时只选择比上次备份时LSN大的page进行复制。

备份过程:

1. innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,然后就等待 xtrabackup 备份完 ibd 数据文件;
2. xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程之前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;然后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程中,innobackupex 进程一直处于等待状态(等待文件被创建)。
3. xtrabackup 拷贝完成idb后,通知 innobackupex(通过创建文件),同时自己进入等待(redo 线程仍然继续拷贝);
4. innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程中,因为数据库处于全局只读状态,如果在业务的主库备份的话,要特别小心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响一定要评估到。
5. 当 innobackupex 拷贝完所有非 InnoDB 表文件后,通知 xtrabackup(通过删文件) ,同时自己进入等待(等待另一个文件被创建);
6. xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就停止 redo 拷贝线程,然后通知 innobackupex redo log 拷贝完成(通过创建文件);
7. innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;
8. 最后 innobackupex 和 xtrabackup 进程各自完成收尾工作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。

对于innodb表,pxb为热备。

2,安装

安装yum源及epel 源

https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ 
2.3.3之后死锁不再堵塞备份,如果数据库是mysql 5.7之后的必须要装2.4.4才可以用, 会向下兼容的。

yum -y install perl-Digest-MD5

如果有依赖可在http://rpmfind.net/linux/rpm2html/search.php?query=libev&submit=Search+... 找rpm 

xtrabackup 选项:

1) innobackupex 参数选项
--defaults-file=[MY.CNF]    //指定配置文件:只能从给定的文件中读取默认选项。 且必须作为命令行上的第一个选项;必须是一个真实的文件,它不能是一个符号链接。
--databases=#               //指定备份的数据库和表,格式为:--database="db1[.tb1] db2[.tb2]" 多个库之间以空格隔开,如果此选项不被指定,将会备份所有的数据库。
--include=REGEXP        //用正则表达式的方式指定要备份的数据库和表,格式为 --include=‘^mydb[.]mytb’ ,对每个库中的每个表逐一匹配,因此会创建所有的库,不过是空的目录。--include 传递给 xtrabackup --tables。
--tables-file=FILE    //此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称,格式为databasename.tablename。该选项传递给 xtrabackup --tables-file,与--tables选项不同,只有要备份的表的库才会被创建。
                 注意:部分备份(--include、--tables-file、--database)需要开启 innodb_file_per_table 。
--compact    //创建紧凑型备份,忽略所有辅助索引页,只备份data page;通过--apply-log中重建索引--rebuild-indexs。
--compress    //此选项指示xtrabackup压缩备份的InnoDB数据文件,会生成 *.qp 文件。
--decompress    //解压缩qp文件,为了解压缩,必须安装 qpress 工具。 Percona XtraBackup不会自动删除压缩文件,为了清理备份目录,用户应手动删除 * .qp文件:find /data/backup -name "*.qp" | xargs rm。
--no-timestamp    //指定了这个选项备份将会直接存储在 BACKUP-DIR 目录,不再创建时间戳文件夹。
--apply-log    //应用 BACKUP-DIR 中的 xtrabackup_logfile 事务日志文件。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件使得数据文件处于一致性状态。
--use-memory=#    //此选项接受一个字符参数(1M/1MB,1G/1GB,默认100M),仅与--apply-log一起使用,该选项指定prepare时用于崩溃恢复(crash-recovery)的内存。
--copy-back    //拷贝先前备份所有文件到它们的原始路径。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项。
--force-non-empty-directories    //恢复时指定此选项,可使 --copy-back 和 --move-back 复制文件到非空目录,即原data目录下可以有其他文件,但是不能有与恢复文件中同名的文件,否则恢复失败。
--rsync    //此选项可优化本地文件(非InnoDB)的传输。rsync工具一次性拷贝所有非InnoDB文件,而不是为每个文件单独创建cp,在备份恢复很多数据库和表时非常高效。此选项不能和 --stream 一起使用。
--incremental    //这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。它传递到 xtrabackup 子进程。当指定这个选项,可以设置 --incremental-lsn 或 --incremental-basedir。如果这2个选项都没有被指定,--incremental-basedir 传递给 xtrabackup 默认值,默认值为:基础备份目录的第一个时间戳备份目录。
--incremental-basedir=DIRECTORY    //该选项接受一个字符串参数,该参数指定作为增量备份的基本数据集的完整备份目录。它与 --incremental 一起使用。
--incremental-dir=DIRECTORY    //该选项接受一个字符串参数,该参数指定了增量备份将与完整备份相结合的目录,以便进行新的完整备份。它与 --incremental 选项一起使用。
--redo-only    //在“准备基本完整备份” 和 “合并所有的增量备份(除了最后一个增备)”时使用此选项。它直接传递给xtrabackup的 xtrabackup --apply-log-only 选项,使xtrabackup跳过"undo"阶段,只做"redo"操作。如果后面还有增量备份应用到这个全备,这是必要的。有关详细信息,请参阅xtrabackup文档。
--parallel=NUMBER-OF-THREADS    //此选项接受一个整数参数,指定xtrabackup子进程应用于同时备份文件的线程数。请注意,此选项仅适用于文件级别,也就是说,如果您有多个.ibd文件,则它们将被并行复制; 如果您的表一起存储在一个表空间文件中,它将不起作用。
2) xtrabackup 参数选项
--apply-log-only    //这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要。

 3,备份与恢复

1)完全备份

1,备份数据
xtrabackup   -uroot  -predhat  --backup    --target-dir=/data/mysql    # target-dir 为要备份储存的目录
关闭服务,删除/var/lib/mysql 下数据文件
2,准备数据文件
xtrabackup   --prepare   --target-dir=/data/mysql/
3,恢复数据
xtrabackup   --copy-back   --target-dir=/data/mysql/
改变拷贝过去的数据的属组属主
chown  -R  mysql.mysql   /var/lib/mysql

2)增量备份

1,创建目录,mkdir   /data/{mysql,inc,inc2}     全量备份,
  xtrabackup   -uroot  -predhat    --backup    --target-dir=/data/mysql
 2, 修改数据,第一次增量
 xtrabackup   -uroot  -predhat    --backup  --target-dir=/data/inc   --incremental-basedir=/data/mysql
 #目标目录为第一次增量的保存目录,增量基准目录为全量备份的目录
 3,修改数据库,第二次增量
 xtrabackup   -uroot  -predhat    --backup  --target-dir=/data/inc2   --incremental-basedir=/data/inc  
 #目标目录为第二次增量的保存目录,增量基准目录为第一次增量目录
 
 4,删除数据库数据  /var/lib/mysql  
   关闭数据库
 5,预准备第一次全量备份
 xtrabackup   --prepare  --apply-log-only   --target-dir=/data/mysql
 6,预准备第一次增量备份至全量备份目录
   xtrabackup   --prepare  --apply-log-only   --target-dir=/data/mysql   --incremental-dir=/data/inc
 7,第二次增量准备,合并至基准全量备份里
   xtrabackup   --prepare   --target-dir=/data/mysql   --incremental-dir=/data/inc2
   #注意:最后一次不需要--apply-log-only 
 8,恢复数据
   xtrabackup   --copy-back   --target-dir=/data/mysql
 9,改变权限,重启服务
     chown   -R  mysql.mysql   /var/lib/mysql/
posted @ 2019-05-12 13:16  Lust4Life  阅读(731)  评论(0)    收藏  举报