暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql备份---XtraBackup备份

程序猿读历史 2021-05-31
1374


一、前言

Percona XtraBackup(简称PXB)是 Percona 公司开发的用于MySQL物理热备的备份工具,支持 MySQL、Percona Server 和 MariaDB,并且完全开源。是目前mysql最流行、最牛逼的备份工具。阿里云的rds for mysql的备份是基于该工具实现的。

tar包方式安装完成后,bin目录下的文件,如下:

  1. [root@192-168-0-171 xtrabackup]# tree bin

  2. bin

  3. ├── innobackupex -> xtrabackup

  4. ├── xbcloud

  5. ├── xbcloud_osenv

  6. ├── xbcrypt

  7. ├── xbstream

  8. └── xtrabackup

  9. [root@192-168-0-171 xtrabackup]#

其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C++ 编译的二进制。Percona 在2.3 版本后用C重写了 innobackupex ,innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary,另外为了使用上的兼容考虑,innobackupex 作为 xtrabackup 的一个软链接。(Percona XtraBackup 2.3 发布之后,推荐的备份方法是使用 xtrabackup 脚本。 )

xtrabackup只能用于备份InnoDB表,不能备份非InnoDB的表,备份innodb表时和mysql服务没有交互,所以备份innodb表时对源库性无干扰。innobackupex 脚本用来备份非 InnoDB 表,同时会调用xtrabackup命令来备份 InnoDB 表,还会和 mysql服务进行交互,如加FTWRL锁、获取位点等。总之来,innobackupex是在 xtrabackup 之上做了一层封装。

一般情况下,我们是希望能备份MyISAM 表的,虽然业务表不会是MyISAM 表,但是 mysql库下的系统表是MyISAM 的,所以需要通过 innobackupex命令实现;另外一个原因是我们可能需要保存mysql服务的位点信息。

xbcrypt 是加解密用的,xbstream 类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式。两在备份和解压时都会用到(如果备份用了加密和并发)。xbcloud 工具的作用是:把全部或部分 xbstream 档案从云上下载或上传到云。

我们主要介绍 innobackupex 和 xtrabackup。

二、XtraBackup备份原理

  • 全量备份步骤

  1. 1、备份开始时首先会开启一个后台检测进程,实时检测mysql redo的变化,一旦发现redo中有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中。

  2. 2、之后复制innodb的数据文件和系统表空间文件ibdata1,待复制结束后。

  3. 3、执行flush tables with read lock操作。

  4. 4、复制.frmMYIMYD,等文件(执行flush tableswith read lock的目的是为了防止数据表发生DDL操作,并且在这一时刻获得binlog的位置)。

  5. 5、最后会发出unlock tables,把表设置为可读可写状态。

  6. 6、最终停止xtrabackup_log

  • 增量备份步骤

  1. 支持对InnoDB存储引擎的增量备份

  2. 1、首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。

  3. 2、在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDBlogfilextrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

三、常用参数

Xtrabackup 和 innobackupex 工具的参数很多,这里介绍一些常用的和可能用到的一些参数,想要了解所有的参数详解请点击附录官方文档的说明。

  • innobackupex 常用参数

  1. --apply-log


  2. 通过应用同一目录下的事务日志文件xtrabackup_logfile,在BACKUP-DIR目录准备一个备份。页建立一个新的事务日志文件。innoDB的配置是从innobackupex备份时建立的文件backup-my.cnf读取。


  3. --close-files


  4. 不保持文件被打开。默认备份时tablespace不关闭,但如果表空间很大并且不适合任何限制,有一个可选的方法是关闭不再访问的文件。使用该选项会产生不一致的备份。


  5. --compact


  6. 建立一个忽略索引页的简洁备份。


  7. --compress


  8. 建立一个innoDB数据文件的压缩备份。它直接提交给xtrabackup的子进程


  9. --compres-threads=#


  10. 并行压缩的工作进场数量,它直接提交给xtrabackup的子进程


  11. --compress-chunk-size=#


  12. 指定每个压缩进程的内部工作缓冲区的尺寸,用字节来测量。它直接提交给xtrabackup的子进程


  13. --copy-back


  14. 复制所有的备份到他们原来的位置


  15. --databases=LIST


  16. 指定将要备份的数据库列表。支持databasename.tablename格式,如果没指定参数,则备份所有数据库


  17. --decompress


  18. 解压所有以选项--compress备份的,结尾是.qp的文件。使用参数--parallel允许多个文件同时被解密和或解压。


  19. --decrypt=ENCRPYTION-ALGORITHM

  20. 解密用--encrpyt选项加密的以.xbcrypt结尾的文件。


  21. --defaults-file=[my.cnf]


  22. 通过制定一个字符串来设置MySQL的默认选项


  23. --defaults-extra-file=[my.cnf]


  24. 在从标准的默认文件中取值默认之前的额外文件。接收一个字符串作为选项


  25. --defaults-group=GROUP-NAME


  26. 如果用了Mysqld_multi,可设置读取配置文件的特定组


  27. --encrypt=ENCRYPTION-ALGORITHM


  28. 该选项指引xtrabackup使用参数ENCRYPTION_ALGORITHM参数制定的算法,加密innoDB数据文件的备份,它直接指向子进程


  29. --encrypt-key=ENCRYPTION_KEY


  30. 指示xtrabackup在备份时使用ENCRYPTION_KEY指定的key做--encrypt加密。它直接传给子进程


  31. --encrypt-key-file=ENCRYPTION_KEY_FILE


  32. 当用选项--encrpyt加密时使用存储在ENCRYPTION_KEY_FILE里存储的加密key


  33. --encrypt-threads=#


  34. 指定并行加密的工作线程数。它直接传给子进程


  35. --encrypt-chunk-size=#


  36. 指定每个加密进程使用的内粗工作缓冲区的尺寸,以字节计算大小


  37. --export


  38. 它用于导出单个表用于导入另一个server


  39. --extra-lsndir=DIRECTORY


  40. 指定xtrabackup_checkpoints文件的保留目录


  41. --force-non-empty-directories


  42. 该参数使得选项--copy-back or --move-back选项传输文件到非空目录。不存在的文件将被覆盖。如果选项--copy-back or --move-back必须从备份目录到一个已经存在的目标目录,则将失败


  43. --galera-info


  44. 该选项在备份时建立包含本地节点状态xtrabackup_galera_info文件。用于执行Percona-XtraDB-Cluster备份


  45. --host=HOST


  46. 执行通过TCP/IP连接访问数据库的主机,它传给mysql的子进程


  47. --ibbackup=IBBACKUP-BINARY


  48. 接收字符串参数,它用来指定要使用的xtrabackup binary


  49. --include=REGEXP


  50. 指定一个正则表达式,用语匹配格式为databasename.tablename的表名称,它传递给--tables选项


  51. --incremental


  52. 建立一个增量备份,传递给xtrabackup的子进程。该参数可以和参数--incremental-lsn or --incremental-basedir配合使用。


  53. --incremental-basedir=DIRECTORY


  54. 指定一个包换全库备份的目录作为增量备份的基础数据库


  55. --incremental-dir=DIRECTORY


  56. 指定增量备份与全库备份合并去建立一个新的全备份的目录。


  57. --incremental-lsn=LSN


  58. 指定增量备份将要开始的LSN,它替代选项--incremental-basedir


  59. --kill-long-queries-timeout=SECONDS


  60. 该选项指定innobackupex在开始FLUSH TABLES WITH READ LOCK和杀掉这些阻碍他的查询之间的时间的等待时间,以秒计算,默认为0,意味着innobackupex不尝试杀任何查询,

  61. 该选项需要process and super权限


  62. --kill-long-query-type=all|select


  63. 指定解锁全局锁时将被杀掉的查询类型,默认是all


  64. --lock-wait-timeout=SECONDS


  65. 运行FLUSH TABLES WITH READ LOCK之前,innobackupex等待阻塞查询的时间数(秒数)


  66. --lock-wait-threashold=SECONDS


  67. 选项指定查询运行时间阀值,当innobackupex发现长运行查询伴随着--lock-wait-timeout的一个非0值,


  68. --lock-wait-query-type=all|update


  69. 指定innobackupex发出一个全局锁之前什么类型的查询允许完成


  70. --lock-copy-interval=#


  71. 指定日志日志复制线程检车完成的时间间隔,以毫秒计算


  72. --move-back


  73. 移动之前的所有备份从一个备份目录到他们的原始位置


  74. --no-lock


  75. 不允许使用flush tables with read lock表锁。如果你的所有表示INNODB并且你不关心二进制日志备份的位置。如果有任何DDL语句被执行或任何非INNODB表上的update操作,这个选项就不能使用


  76. --notimestamp


  77. 把备份放在一个通过选项backup-root-dir指定的子目录里


  78. --no-version-check


  79. 禁止版本检查


  80. --parallel=NUMBER-OF-THREADS


  81. 该选项接收一个整数,xtarbackup子进程将用于同时备份文件的并发数。如果有多个.ibd文件可以并行,如果只有一个表空间文件,则该选项无效


  82. --password=PASSWORD


  83. 指定连接到数据库的账户密码


  84. --port=PORT


  85. 该选项指定通过TCP/IP连接到数据库时所用的端口


  86. --rebuild-indexes


  87. 只有用--apply-log选项时它才有效,当应用日志后使得xtrabackup重建所有的二级索引。一般用于准备简约备份


  88. --rebuild-threas=NUMBER-OF-THREADS


  89. 当一起使用选项--apply-log and --rebuild-indexes选项时才有用,使用后,当重建索引时,xtrabackup处理表空间时用一定数量的线程的并行模式


  90. --redo-only


  91. 选项用于准备全库备份和合并处最有一个备份外的所有增量备份。它强制xtrabackup忽略“rollback”阶段只做“redo”.


  92. --rsync


  93. 使用rsync工具优化本地文件传输。它让xtrabackup使用rsync复制所有非innoDB文件,而不是使用多个cp


  94. --safe-slave-backup


  95. 停止从SQL进程并等待启动备份直到slave_open_temp_tables的值为0。如果没有打开临时表,备份会进行,否则SQL进程将启动并直到没有打开的临时表时停止。如果slave_open_temp_tables在--

  96. safe-slave-backup-timeout秒后没有变成0,则备份会失败。备份结束后,从SQL进程将重新启动


  97. --safe-slave-backup-timeout=SECONDS


  98. --safe-slave-backup要等slave_open_temp_tables变成0的时间,默认为300


  99. --scopt=SCP-OPTIONS


  100. 当参数--remost-host指定时传递给scp的参数


  101. --slave-info


  102. 当备份一个复制从库操作的时候用,它打印二进制日志的position和主库的名字,它页把这些信息写入xtrabackup_slave_info文件作为一个CHANGE MASTER命令


  103. --socket=SOCKET


  104. 指定连接到本地数据库sever时使用的一个unix domain socket,它没有修改的传入mysql子进程


  105. --sshopt=SSH-OPTIONS


  106. 当使用参数--remost-host时,使用ssh的命令行参数


  107. --stream=STREMNAME


  108. 当使用流备份时使用的特定格式。备份将以特定格式传到STDOUT。支持的格式为tar and xbstream


  109. --tables-file=FILE


  110. 指定备份的表的列表,格式为database.tablename


  111. --throttle=IOS


  112. 指定I/O操作的数量/秒。该参数只适用于备份阶段。不适用于参数--apply-log,--copy-back


  113. --tmpdir=DIRECTORY


  114. 在参数--stream使用时指定,是指临时文件被存储的位置


  115. --use-memory=#


  116. 该参数只能和参数--apply-log配合使用,被用于xtrabackupcreash恢复时准备锁使用的内存量(单位:字节)。也支持其他单位,如:1MB,1M,1GB,1G


  117. --user=USER


  118. 指定连接到mysql时使用的用户名


  119. --version


  120. 显示innobackupex的版本信息和版权等信息


  121. --version-check


  122. 指定该选项后,innobackupex将在建立一个连接后,在备份阶段执行一个版本检查

  • xtrabackup相关参数

  1. --apply-log-only


  2. 这个参数使在准备备份时,只执行重做阶段,这对于增量备份非常重要。

四、实际例子

4.1 全量备份

  • 方式1--全库备份

  1. innobackupex --defaults-file=/etc/my.cnf --no-lock --user=root --password='123456' /backup/full/

  2. 说明:

  3. a.--no-lock为备份中不锁非innodb

  • 方式2--压缩备份

  1. innobackupex --defaults-file=/etc/my.cnf --no-lock --user=root --password='123456'  --stream=tar /backup/full/  2>/backup/full/eg.log | gzip 1>/backup/full/eg.tar.gz


  2. 说明:

  3.      a. --database=单独对test数据库做备份 ,若是不添加此参数那就那就是对全库做备份

  4.      b.2>/backup/full/eg.log  输出信息写入日志中

  5.      c.1>/backup/full/eg.tar.gz 打包压缩存储到该文件中

  6. 这种备份时间会比较长,主要是执行压缩操作。这种方式打的包需要使用tar izxvf解压。参数-i是必须加上的。

  • 方式3--备份到远程服务器

  1. innobackupex  --database="testinnodb test" --user=root --password='123456'   --defaults-file=/etc/my.cnf  --no-lock --stream=tar /data0/backup/mysql/|ssh root@192.168.1.101  cat ">"/data0/backup.tar

4.2 增量备份

注意: 增量备份的前提是有一个全量备份,在全量备份的基础上进行增量备份)

第一次增量备份

  1. innobackupex  --defaults-file=/etc/my..cnf --user=root --password='123456'  --no-lock --incremental /backup/incremental/ --incremental-basedir=/backup/full/

  第二次增量备份

  1. innobackupex  --defaults-file=/etc/my..cnf --user=root --password='123456' --no-lock --incremental /backup/incremental/ --incremental-basedir=/backup/incremental/2019-09-15_17-31-45/

  参数说明:

--incremental :指定存储本次增量备份的目录

--incremental-basedir:上次备份的存储目录

五、附录

xtrabackup 官方地址

innobackupex 参数官方地址 

xtrabackup 参数官方地址。

文章转载自程序猿读历史,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论