mysql的备份恢复之percona-xtrabackup物理备份

发布时间 2023-06-21 14:50:14作者: 数据库小白(专注)

1. mysql的备份恢复之percona-xtrabackup物理备份

1.1. 背景

大数据量备份与还原,始终是个难点。关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天推荐另一个备份工具innobackupex。

innobackupex和mysqldump都可以对mysql进行热备份的,mysqldump对mysql的innodb的备份可以使用single-transaction参数来开启一个事务,利用innodb的mvcc来不进行锁表进行热备份,mysqldump备份是逻辑备份,备份出来的文件是sql语句,所以备份和恢复的时候很慢,但是备份和恢复时候很清楚。当MYSQL数据超过10G时,用mysqldump来导出备份就比较慢了,此种情况下用innobackupex这个工具就比mysqldump要快很多,现在我们就利用它对mysql做全量和增量备份.

Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。

Percona XtraBackup是一款开放源代码且免费的MySQL热备份软件,是目前最流行的 MySQL备份软件之一,可以非阻塞地对InnoDB和XtraDB数据库进行备份。 使用Percona XtraBackup,可以:
• 快速可靠地完成备份。
• 在备份期间不间断地处理事务。
• 节省磁盘空间和网络带宽。
• 自动备份验证。
• 更快地恢复,以保障业务有更长的在线时间。

Percona XtraBackup支持所有版本的Percona Server、MySQL和MariaDB分支的MySQL 热备份,可以进行流备份、压缩备份、增量备份,对InnoDB、XtraDB和HailDB存储引擎 支持完全非阻塞的备份。此外,还可以简单地备份MyISAM、Merge和Archive存储引擎 (会锁定表)。 注意:本章内容根据XtraBackup 2.4.4版本撰写,在该版本中innobackupex命令为xtrabackup的软链接,本 质上它们是同一个二进制程序。

1.2. Xtrabackup是什么?

官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/intro.html

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex(mysql 8.0开始innobackupex 已经完成和Xtrabackup合并,移除了innoxtrabackup命令)

  • xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  • innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

1.3. 使用场景

mysql 5.7及以下的版本使用innobackupex
mysql 5.7以上的版本使用Xtrabackup

1.4. Xtrabackup可以做什么?

  1. 在线(热)备份整个库的InnoDB、 XtraDB表
  2. 在xtrabackup的上一次整库备份基础上做增量备份(innodb only)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
  3. MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。
  4. Xtrabackup工具支持对InnoDB存储引擎的增量备份。

1.5. Xtrabackup版本及下载地址

官网地址:https://www.percona.com/doc/percona-xtrabackup

1.6. Percona XtraBackup工作流程

a

2

1.7. Xtrabackup 使用说明文档

Xtrabackup下载与安装:
https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html

Xtrabackup增量备份与恢复:
https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html

Xtrabackup全量备份与恢复:
https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/full_backup.html

Xtrabackup参数选项及使用说明:
https://www.percona.com/doc/percona-xtrabackup/LATEST/xtrabackup_bin/xbk_option_reference.html

1.8. XtraBackup备份原理

1.8.1. 完全备份与恢复原理

1.8.1.1. 完全备份流程图

完全备份流程(图片源自网络)
备份流程图

图2

1.8.1.2. 完全备份流程解析

• innobackupex在开始备份时,首先使用指定的账号和密码连接MySQL,该数据库 连接用于在备份过程中执行如加锁、解锁,刷新redo日志等与数据库进行交互操作。 
• 读取--defaults-file选项指定的配置文件,解析innodb_data_home_dir和innodb_log_ group_home_dir等系统参数,找到数据表空间和redo日志文件的位置。创建 xtrabackup_logfile文件,模拟MySQL实例方式,以读写模式打开并读取redo日志,检查当 前检查点,从当前检查点位置开始复制redo日志,同时持续扫描redo日志,有新产生的 redo日志数据就复制到xtrabackup_logfile文件中(在整个备份过程中一直在复制redo日 志,通过查看备份目录下的xtrabackup_logfile文件,可以看到这个文件在不断增长)。 
• 另外一个线程调用xtrabackup命令开始复制数据文件(包括共享表空间文件和独立 表空间文件,相当于获得了redo日志、undo日志和数据文件,只是没有内存中的脏页数 据,不过没有关系,直接用redo日志来恢复就可以了)。 
• 全局执行FLUSH TABLES WITH READ LOCK语句(下文中提到的FTWRL为该语 句的简写)加一个S锁,此时数据库处于不可写状态(执行FLUSH TABLES WITH READ LOCK语句的目的是为了防止读取数据时发生DDL操作,并且获取binlog文件位置)。 redo日志暂时也会卡在这里。 
• 开始复制表结构文件,即.MYD和.MYI文件(由于前面步骤会锁定表,所以如果 数据库中有很大的MyISAM表就要注意了,会一直锁定到MyISAM的.MYD、.MYI、.frm 文件复制完成且获取了binlog文件位置之后才解锁。如果没有MyISAM表,那么在复制完
表空间文件之后的操作是非常快的,可能不到1分钟就完成了复制表.frm文件,获取到 binlog文件位置。 
• 先执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS语句将InnoDB层的redo日 志持久化到磁盘后进行复制(因为xtrabackup并不备份二进制日志,所以,如果这个过程 出现问题,就会导致恢复之后丢失redo日志中的数据,做主从复制可能会同步出错,但在 XtraBackup 2.2.3之后不会再出现丢失redo日志的情况),然后停止读redo日志复制的线 程。需要注意,innobackupex备份数据的时间点是停止redo日志复制时的数据对应的时间 点。
• 当redo日志的复制线程停止之后,执行UNLOCK TABLES语句解锁表。 
• innobackupex完成收尾工作,如释放资源、记录与备份相关的元数据信息等(例如 backup-my.cnf和xtrabackup_info文件),最后退出innobackupex备份进程(在XtraBackup 2.3之前的版本中,innobackupex和xtrabackup是两个程序,innobackupex需要等待 xtrabackup子进程结束后再退出。关于两个程序之间的协调下文中会详细介绍,这里不再 赘述)

1.8.1.3. 完全备份恢复流程图

图1

1.8.1.4. 完全备份恢复流程解析

• 在备份恢复时,启动一个mini instance(最小化数据库实例),把数据文件复制到 内存中,然后再读取xtrabackup_log中的redo日志进行应用,最后对没有提交的事务使用 undo日志进行回滚。 
• 如果查看备份恢复时打印的日志,就会发现使用innobackupex命令执行备份恢复的 过程和mysqld进程启动过程非常相似,在使用innobackupex命令执行备份恢复的过程中会 做一次 crash recovery(崩溃恢复)操作。恢复的目的是把备份数据恢复到一个一致性位 点(undo、redo日志和表空间中的数据相对应)。 
• 备份时执行FTWRL后,数据库处于只读状态,非InnoDB表是在持有全局读锁的情 况下复制的,所以其本身就对应于FTWRL的时间点。InnoDB的.ibd文件复制是在FTWRL
前做的,复制出来的不同.ibd文件的最后更新时间点是不一样的,这种状态的.ibd文件是 不能直接用的,但是redo日志是从备份开始就一直持续复制的,最后的redo日志时间点是 在执行FTWRL后取得的,所以最终通过redo日志应用后的.ibd文件数据的时间点和 FTWRL的时间点是一致的。因此,恢复过程只涉及InnoDB文件的恢复,非InnoDB表是不 需要恢复的。当备份恢复完成后,就可以把数据文件复制到对应的目录下,通过mysqld来 启动了。

1.8.2. 增量备份与恢复

1.8.2.1. 增量备份流程图

涂

1.8.2.2. 增量备份流程解析

每个InnoDB页面都会包含一个LSN号,每当相关的数据发生改变时,相关页面的LSN 号就会自动增长。这正是InnoDB表可以进行增量备份的基础,innobackupex可以通过把上 一次备份之后发生改变的那一部分页面复制出来以实现增量备份。也就是说,增量备份基 于上一次备份的LSN号,备份大于该LSN号的那一部分数据文件页。在xtrabackup_ checkpoints或xtrabackup_info等文件中from_lsn、to_lsn、last_lsn记录的是LSN号,其中, from_lsn表示备份数据开始的LSN号(如果是增量备份,则该LSN号与上一次备份中的 to_lsn相等),to_lsn表示备份数据结束的LSN号(也是备份中最新的检查点位置), last_lsn表示备份结束时复制的redo日志LSN号。增量备份是基于上一次备份中的to_lsn来 实现的(即:基于上一次备份的检查点位置)。检查点机制可以确保LSN号小于检查点位 置的数据页已经被刷新到磁盘中,所以在执行增量备份时,通过比对数据文件中数据页的 LSN号,就能够找出哪些数据页需要被复制(只要是LSN号大于上一次备份的to_lsn的数 据页,在执行增量备份时就需要被复制)。第一次增量备份必须基于一次完整的备份进 行,第二次增量备份可以基于第一次增量备份进行,依此类推(当然,第二次增量备份也 可以基于完全备份进行,如果采用这样的备份策略,那么第二次增量备份与第一次增量备 份之间就没有关联了,恢复时需要一次完全备份+一次增量备份)。

1.8.2.3. 增量备份恢复流程图

3

1.8.2.4. 增量备份恢复流程解析

在增量备份恢复时,除最后一次增量备份外,其他的完全备份和增量备份(如果进行 了多次增量备份)必须同时使用--apply-log和--redo-only选项,即只做前滚,不做回滚。 最后一次增量备份恢复时禁用--redo-only选项,单独使用--apply-log选项,即回滚操作放 在最后一次增量备份上。 不管是完全备份还是增量备份,当备份完成时都会获取备份完成时刻的检查点,用于 生成xtrabackup_checkpoints文件。

1.8.3. 使用XtraBackup备份数据时,关于文件权限的说明

xtrabackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。
为什么要用rw模式呢?直接read模式不好么?因为xtrabackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。

1.9. 备份恢复实例

1.9.1. xtrabackup的备份

全量备份
备份:

xtrabackup --defaults-file=/etc/my.cnf --user=backup --password=123456 --socket=/usr/local/mysql/mysqld.sock --databases=zabbix --backup --host=ip --target-dir=/data/backup/xtrabackup/

--host=ip 数据库的ip,本地的可以不加(适用于远程备份)。
恢复:

准备恢复
xtrabackup --prepare --target-dir=/data/backup/xtrabackup/

执行数据恢复
xtrabackup --host=localhost --user=root --password=oracle --port=3306 --datadir=/data/mysqldata/3306/data --copy-back --target-dir=/backup/mysql/data/

--copy-back  :复制数据到目标目录下,当前备份数据不删除
--move-back  :移动数据到目标目录下,当前数据会删除(适合存储空间不大的情况)

后台执行:nohup backup.sh > backup.log &

增量备份
备份:

首先先创建完全备份:
xtrabackup --user=backup --password=123456 --databases=zabbix --backup --target-dir=/data/backup/xtrabackup/

创建第一次增量备份:
xtrabackup --user=backup --password=123456 --databases=zabbix --backup --target-dir=/data/backup/inc1 --incremental-basedir=/data/backup/xtrabackup/

--incremental-basedir=/data/backup/ 全备目录
--target-dir=/data/backup/inc1 增备目录
创建第二次增量备份:
xtrabackup --user=backup --password=123456 --databases=zabbix --backup --target-dir=/data/backup/inc2 --incremental-basedir=/data/backup/inc1

--incremental-basedir=/data/backup/inc1上次增备的目录
--target-dir=/data/backup/inc2 增备目录

应用日志:

先准备全量备份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/xtrabackup/

将第一次增量备份应用到完全备份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/xtrabackup/ --incremental-dir=/data/backup/inc1

准备第二次增量备份是一个类似的过程:
xtrabackup --prepare --target-dir=/data/backup/xtrabackup/ --incremental-dir=/data/backup/inc2/

恢复数据

xtrabackup --host=localhost --user=root --password=oracle --port=3306 --datadir=/data/mysqldata/3306/data --copy-back --target-dir=/backup/mysql/data/

1.9.2. innobackupex的备份

全量备份:

远程流备份:
互信配置:
ssh-keygen 
cat ~/.ssh/id_*.pub|ssh root@192.169.100.52 'cat>>~/.ssh/authorized_keys'
ssh-copy-id -i  ~/.ssh/id_rsa.pub root@192.169.100.52
ssh root@192.169.100.52 date

innobackupex --defaults-file=/etc/mysql3307.cnf --parallel=2 --user=root --password='root' --socket=/data/danmaku/data/mysql3307.sock --host='192.169.100.107' --stream=xbstream /bakdir | ssh root@192.169.100.52 "xbstream --parallel=2 -x -C /bakdir" &

应用日志:

/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --apply-log /bakdir &

还原数据:

/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --move-back /bakdir &

增量备份:

innobackupex --defaults-file=/etc/my.cnf --parallel=2 --user=root --password=123456 --socket=/data/mysql/mysqld.sock /data/backup/full

全量备份(以xbstream流的方式备份到远程服务器上)
innobackupex --defaults-file=/etc/mysql3307.cnf --parallel=2 --user=root --password='root' --socket=/data/danmaku/data/mysql3307.sock --host='192.169.100.107' --stream=xbstream /bakdir | ssh root@192.169.100.52 "xbstream --parallel=2 -x -C /bakdir" &

或者(强压缩的方式备份):
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkuser --password=pwd --no-timestamp --slave-info --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --extra-lsndir=${lsndir}/lsn_full  -t=${tmpDir} $backdir/full 2> $out_log |pbzip2 -fz -p10 -m2000 -5 > $backdir/full/full-`date +%Y%m%d`.xbstream.bz2
第一次增备
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456--socket=/usr/local/mysql/mysqld.sock --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/full/2017-12-24_10-22-30/ --parallel=2

--incremental 表示增备目录
--incremental-basedir 表示增量备份的全备目录

或者
innobackupex --defaults-file=$file_cnf  --no-timestamp --host=$host --user=$user_name --password=$password --parallel=4 --throttle=200 --stream=xbstream  --use-memory=4G --extra-lsndir=$lsndir  --incremental --incremental-basedir=$lsndir  $backdir/rec0 2> $out_log | pbzip2 -fz -p10 -m2000 -5   > $backdir/rec0-`date +%Y%m%d`.bz2


第二次增量备份:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/usr/local/mysql/mysqld.sock --incremental /data/backup/incremental/--incremental-basedir=/data/backup/full/2017-12-24_10-22-30/ --parallel=2

或者
innobackupex --defaults-file=$file_cnf  --no-timestamp --host=$host --user=$user_name --password=$password --parallel=4 --throttle=200 --stream=xbstream   --use-memory=4G --extra-lsndir=$lsndir  --incremental --incremental-basedir=$lsndir  $backdir/rec1 2> $out_log |pbzip2 -fz -p10 -m2000 -5   > $backdir/rec1-`date +%Y%m%d`.bz2

应用日志:

/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --apply-log /bakdir &

还原数据:

/usr/bin/innobackupex --defaults-file=/etc/mysql3307.cnf --user root --move-back /bakdir &

1.9.3. 强压缩方式备份

/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --user=backup --password='dIwBO8UVp*s!' --no-timestamp  --parallel=6 --throttle=200 --stream=xbstream --use-memory=4G --extra-lsndir=/datas/backup/lsn_full  -t=/datas/backup/tmp /datas/backup/full 2> /datas/backup/bak.log |pbzip2 -fz -p10 -m2000 -5 > /datas/backup/full/full-`date +%Y%m%d`.xbstream.bz2

强压缩方式数据的解压:

1。解压bz2文件成为strea流  (强压缩 备份时间短,但是解压时间长)
bzip2 -d full-20200813.xbstream.bz2

-p 10  (可以指定-p32)  表示使用32颗CPU

2.解压strea流 成为数据文件:
xbstream -x < full-20200813.xbstream  -C /tmp/fullbak

如
xbstream -x < full-20201014 -C /data/bakdata/

full-20201014 为流格式的压缩文件
/data/bakdata/ 为解压的目录,即需要还原到的mysql的数据目录。

**注意:
mysql 8.0里面需要删除掉-t=${tmpDir}

/bin/xtrabackup --defaults-file=/etc/my.cnf --socket=/tmp/mysql3306.sock --user=backup --password='dIwBO8UVp*s!' --backup --no-timestamp --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --backup --extra-lsndir=/data/bakData/mysql/lsn_full > /data/bakData/mysql/xtrabackup_log_20210407 |pbzip2 -fz -p10 -m2000 -5 > /data/bakData/mysql/full/full-`date +%Y%m%d`.xbstream.bz2

1.9.4. Xtrabackup优点

(1)备份速度快,物理备份可靠

(2)备份过程不会打断正在执行的事务(无需锁表)

(3)能够基于压缩等功能节约磁盘空间和流量

(4)自动备份校验

(5)还原速度快

(6)可以流传将备份传输到另外一台机器上

(7)在不增加服务器负载的情况备份数据

(8)可并行备份,并且可以现在备份的压力

(9)可增量备份

定制数据备份策略。例如每周日完整备份,周一到周六增量备份。

xtrabackup 本身只能备份 InnoDB 和 XtraDB ,不能备份 MyISAM;
innobackupex 本身是 Hot Backup 脚本修改而来,同时可以备份 MyISAM 和 InnoDB,但是备份 MyISAM 需要加读锁。

1.10. 常用参数说明

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

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

--compact
建立一个忽略耳机索引页的简洁备份。

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

--compres-threads=#
并行压缩的工作进场数量,它直接提交给xtrabackup的子进程

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

--copy-back
复制所有的备份到他们原来的位置

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

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

--defaults-file=[my.cnf]
通过制定一个字符串来设置MySQL的默认选项

--defaults-extra-file=[my.cnf]
在从标准的默认文件中取值默认之前的额外文件。接收一个字符串作为选项

--defaults-group=GROUP-NAME
如果用了Mysqld_multi,可设置读取配置文件的特定组

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

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

--encrypt-key-file=ENCRYPTION_KEY_FILE
当用选项--encrpyt加密时使用存储在ENCRYPTION_KEY_FILE里存储的加密key

--encrypt-threads=#
指定并行加密的工作线程数。它直接传给子进程

--encrypt-chunk-size=#
指定每个加密进程使用的内粗工作缓冲区的尺寸,以字节计算大小

--export
它用于导出单个表用于导入另一个server

--extra-lsndir=DIRECTORY
指定xtrabackup_checkpoints文件的保留目录

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

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

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

--ibbackup=IBBACKUP-BINARY
接收字符串参数,它用来指定要使用的xtrabackup binary、

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

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

--incremental-basedir=DIRECTORY
指定一个包换全库备份的目录作为增量备份的基础数据库

--incremental-dir=DIRECTORY
指定增量备份与全库备份合并去建立一个新的全备份的目录。

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

--kill-long-queries-timeout=SECONDS
该选项指定innobackupex在开始FLUSH TABLES WITH READ LOCK和杀掉这些阻碍他的查询之间的时间的等待时间,以秒计算,默认为0,意味着innobackupex不尝试杀任何查询,
该选项需要process and super权限

--kill-long-query-type=all|select
指定解锁全局锁时将被杀掉的查询类型,默认是all

--lock-wait-timeout=SECONDS
运行FLUSH TABLES WITH READ LOCK之前,innobackupex等待阻塞查询的时间数(秒数)

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

--lock-wait-query-type=all|update
指定innobackupex发出一个全局锁之前什么类型的查询允许完成

--lock-copy-interval=#
指定日志日志复制线程检车完成的时间间隔,以毫秒计算

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

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

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

--no-version-check
禁止版本检查

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

--password=PASSWORD
指定连接到数据库的账户密码

--port=PORT
该选项指定通过TCP/IP连接到数据库时所用的端口

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

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

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

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

--safe-slave-backup
停止从SQL进程并等待启动备份直到slave_open_temp_tables的值为0。如果没有打开临时表,备份会进行,否则SQL进程将启动并直到没有打开的临时表时停止。如果slave_open_temp_tables在--
safe-slave-backup-timeout秒后没有变成0,则备份会失败。备份结束后,从SQL进程将重新启动

--safe-slave-backup-timeout=SECONDS

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

--scopt=SCP-OPTIONS
当参数--remost-host指定时传递给scp的参数

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

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

--sshopt=SSH-OPTIONS
当使用参数--remost-host时,使用ssh的命令行参数

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

--tables-file=FILE
指定备份的表的列表,格式为database.tablename

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

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

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

--user=USER
指定连接到mysql时使用的用户名

--version
显示innobackupex的版本信息和版权等信息

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

xtrabackup相关参数
--apply-log-only

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

1.11. 常用备份恢复命令

1.11.1. 流的方式备份恢复

1.11.1.1. 配置互信:

ssh-keygen 
cat ~/.ssh/id_*.pub|ssh root@192.169.100.52 'cat>>~/.ssh/authorized_keys'
ssh-copy-id -i  ~/.ssh/id_rsa.pub root@192.169.100.52
ssh root@192.169.100.52 date

如果认证报错
可以通过修改.ssh/know_host 文件中的秘钥信息,重新创建连接

1.11.1.2. 备份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password='root' --host='192.169.100.107' --stream=xbstream /bakdir | ssh root@192.169.100.52 "xbstream -x -C /bakdir" &

1.11.1.3. 应用日志:

/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --apply-log /bakdir &

1.11.1.4. 还原数据:

/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --move-back /bakdir &

1.11.1.5. 更改用户权限:

chmod -R 755 /mysql/data/
chown -R mysql:mysql /mysql/data/

1.11.1.6. 启动数据库:

mysqld_safe --defaults-file=/etc/my.cnf &

1.11.1.7. 获取gtid位置信息

cat xtrabackup_binlog_info
a39dd15a-820c-11ea-8c17-000c29034b31:1-3

1.11.1.8. 配置gtid信息

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='a39dd15a-820c-11ea-8c17-000c29034b31:1-3';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

1.11.1.9. 非GTID模式

获取位置信息

在231.145上配置同步
change master to master_host='10.25.231.144',\
master_port=3309,master_user='repl',master_password='datarepl@#Dba',\
master_log_file='xxx',master_log_pos=xxx;

1.11.1.10. 配置同步

CHANGE MASTER TO
MASTER_HOST='192.169.100.50',
MASTER_USER='repl',
MASTER_PASSWORD='repl@Abc123',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;

1.11.1.11. 启动复制

start slave;
show slave status \G;

select * from  mysql.slave_master_info\G

1.11.2. 强压缩备份

1.11.2.1. 解压缩:

管道的方式一步解压:
pbzip2 -dc -p10 -m2000 -5 /data/backup/mgyw/mysql.last/full/full-20190110.bz2 |xbstream -x


分步执行解压(会占用两份空间)
1。解压bz2文件成为strea流  (强压缩 备份时间短,但是解压时间长)
bzip2 -d full-20220110.xbstream.bz2

nohup sh unzip.sh > unzip.log &
-p 10  (可以指定-p32)  表示使用32颗CPU

2.解压strea流 成为数据文件:
xbstream -x < full-20220110.xbstream  -C /datas/backup/full

vi xbstream.sh
nohup sh xbstream.sh > xbstream.log &

如
full-20201014 为流格式的压缩文件
/data/bakdata/ 为解压的目录,即需要还原到的mysql的数据目录。

1.11.2.2. 应用日志:

/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --apply-log /datas/backup/full &

1.11.2.3. 还原数据:

/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user root --move-back /datas/backup/full &

1.11.2.4. 更改用户权限:

mkdir -p /datas/database/mysql
mkdir -p /datas/logs/mysql
mkdir -p /datas/database/tmp

chown -R mysql:mysql /datas/database
chown -R mysql:mysql /datas/logs

1.11.2.5. 启动数据库:

mysqld_safe --defaults-file=/etc/my.cnf &

1.11.2.6. 获取位置信息

1.11.2.7. 配置同步

change master to master_host='10.25.231.144',\
master_port=3309,master_user='repl',master_password='datarepl@#Dba',\
master_log_file='xxx',master_log_pos=xxx;

1.11.2.8. 启动复制

start slave;
show slave status \G;

select * from  mysql.slave_master_info\G

1.11.3. mysql 8.0备份恢复

1.11.3.1. 配置互信

ssh-keygen 
ssh -p 16818 oracle@10.25.108.9 date

ssh-copy-id -i  ~/.ssh/id_rsa.pub mysql@10.25.xx.xxx
cat ~/.ssh/id_*.pub|ssh mysql@10.25.xx.xxx 'cat>>~/.ssh/authorized_keys'

三、备份指定的数据库:
1.创建备份

常规备份
xtrabackup --user=backup --password=123456 --databases=zabbix --backup --target-dir=/data/backup/xtrabackup/


常规流备份方式
xtrabackup --defaults-file=/etc/my.cnf --socket=/tmp/mysql3306.sock --backup --user=root --password='Admin@123' --no-timestamp --throttle=200 --parallel=4 --host='10.25.33.231' --stream=xbstream | ssh root@10.25.33.232 "xbstream --parallel=2 -x -C /data/bak/" &

强压缩备份方式
xtrabackup --defaults-file=/etc/my.cnf --socket=/tmp/mysql3306.sock --backup --user=root --password='Admin@123' --no-timestamp --parallel=4 --throttle=200 --stream=xbstream --use-memory=4G --backup --extra-lsndir=/data/bak/  -t=/data/bak/ 2> /data/bak/bac.log |bzip2 -fz > /data/bak/full/full-`date +%Y%m%d`.xbstream.bz2
nohup sh bak.sh > bak.log 2>&1 &

Plugin initialization aborted with error Generic error.
xtrabackup: innodb_init(): Error occured.

2.将备份推送到测试机

scp -r xtrabackup/ root@192.168.20.201:/data/backup/

3.准备备份

非增量方式
xtrabackup --prepare --apply-log-only --target-dir=/data/bak/

增量方式
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --use-memory=2G --user root  --apply-log  /data/databackup/full --incremental-dir=/data/databackup/rec4 &

4.恢复备份

/usr/bin/xtrabackup --defaults-file=/etc/my.cnf --use-memory=2G --parallel=10 --user root --move-back /data/bak/ &

5.更改权限:

chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /data/log
chown -R mysql:mysql /var/run/mysql

6.启动数据库:

mysqld_safe --defaults-file=/etc/my.cnf &

7.获取gtid位置信息
在最后一次增备中获取gitd的位点信息:

[root@localhost rec4]# cat /data/databackup/rec4/xtrabackup_binlog_info 
mysql-bin.000316	314746908	23d75ae2-1b3c-11e6-8474-78acc0f8bc20:1-6362590505,
6013ccd5-1b3e-11e6-8482-52540071a7f7:1-497091575,
9e841bb0-4b71-11e7-8426-78acc0fbff52:1-647435776

8.配置gtid信息

reset master;(慎重使用)

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='23d75ae2-1b3c-11e6-8474-78acc0f8bc20:1-6362590505,6013ccd5-1b3e-11e6-8482-52540071a7f7:1-497091575,9e841bb0-4b71-11e7-8426-78acc0fbff52:1-647435776';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

9.配置同步

CHANGE MASTER TO
MASTER_HOST='10.25.182.66',
MASTER_USER='repl',
MASTER_PASSWORD='Wq45h*ohPUKf',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;

10.启动同步:

start slave;
show slave status \G;

select * from  mysql.slave_master_info\G