----------------------------  xtrabackup  ------------------------------------

安装8.0版本的xtrabackup

yum install -y libe

下载:​​https://www.percona.com/downloads/Percona-XtraBackup-LATEST/​

wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.26-18/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm

yum localinstall percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm

xtrabackup -version

创建数据库用户并分配权限

Linux层面:

对于要备份的datadir,即数据目录,需要rw权限;对于存放备份的目录,即xtrabackup的输出目录,需要rwx


数据库层面:

1.RELOAD,LOCK TABLES,这些权限用于实现备份锁,例如执行flush tables with read lock和flush engine logs

2.BACKUP_ADMIN,此权限用于查询performance_schema.log_status,和执行lock instance for backup,lock binlog for backup,lock tables for backup,针对MySQL8.0

3.replication client,用于查看binlog位点,拥有该权限可以执行show master status,show slave status,show binary logs

4.create tablespace,此权限用于导入表,在恢复单表或表级恢复时需要用到

5.process,用于执行show engine innodb status和show processlist

6.super,此权限用于控制复制线程

7.create,用于创建percona_schema.xtrabackup_history

8.insert,用于插入percona_schema.xtrabackup_history

9.select,用于在使用–incremental-history-name或–incremental-history-uuid时在PERCONA_SCHEMA.xtrabackup_history查询innodb_to_lsn的值


例如:


CREATE USER 'backup'@'localhost' IDENTIFIED BY '备份用户密码';

GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';

GRANT SELECT ON performance_schema.log_status TO 'backup'@'localhost';

FLUSH PRIVILEGES;

 

备份数据

xtrabackup -u'用户名' -p'用户密码' --backup --target-dir=备份目录_`date +%Y%m%d` #按日期分割

恢复数据

xtrabackup --prepare --target-dir=备份目录_20211010

xtrabackup --copy-back --target-dir=备份目录_20211010

关于“预备”(Prepare)操作

使用 XtraBackup 产生的备份数据由于数据文件复制的时间点不同,数据会不一致而无法使用。直接恢复的话 InnoDB 会将这些数据文件视为损坏,将拒绝启动。

所以,在恢复之前需要对数据进行“预备”(Prepare)操作(--prepare),使数据文件完全一致,然后才能用于数据恢复及在 InnoDB 中运行。


在预备操作时发生了什么?

在预备时,XtraBackup 将启动内嵌的修改版 InnoDB 引擎,以处理复制的备份文件,使数据文件保持一致。


配置文件问题

在备份过程中,会在备份目录生成 backup-my.cnf 文件,保存 InnoDB 配置信息。在预备操作时,需要该配置文件,会被自动加载。错误的配置文件会导致错误的恢复。

增量备份恢复问题

如果有增量备份,在恢复之前也需要通过prepare将增量备份的数据合并到全量备份数据中,然后再把合并后完整的数据进行恢复

 

增量备份

在已做全量备份的基础上可以做增量备份,增量备份有两种模式,一个是每次都在上一次增量备份的基础上做增量备份,另一种是每次都在上一次全量备份的基础上做增量备份

对应的恢复模式也有两种,第一种需要恢复全量备份后,再依次把每个增量备份都恢复一次,另一种只需要恢复全量备份后,直接恢复最后一次增量备份就可以了

两种方式的运作流程没有本质区别,只是通过获取incremental-basedir指定的目录下的xtrabackup_checkpoints文件的结束点来获知增量备份的起点而已

 

先做全量备份

xtrabackup -u'用户名' -p'用户密码' --backup --target-dir=/backup/mysql/20211010/base

再做增量备份

方式1:

xtrabackup -u'用户名' -p'用户密码' --backup --target-dir=/backup/mysql/20211010/incr1 --incremental-basedir=/backup/mysql/20211010/base/

xtrabackup -u'用户名' -p'用户密码' --backup --target-dir=/backup/mysql/20211010/incr2 --incremental-basedir= /backup/mysql/20211010/incr1/

然后查看cat /backup/mysql/20211010/incr1/xtrabackup_checkpoints文件,就可以看到备份的起始点和结束点,后面的增量备份的起始点和结束点都需要衔接的上


方式2:

xtrabackup -u'用户名' -p'用户密码' --backup --target-dir=/backup/mysql/20211010/incr1 --incremental-basedir=/backup/mysql/20211010/base/

xtrabackup -u'用户名' -p'用户密码' --backup --target-dir=/backup/mysql/20211010/incr2 --incremental-basedir= /backup/mysql/20211010/base/

 

增量恢复

增量备份和全量备份的--prepare执行的方式是不一样的。在全量备份中,可以通过两种操作保持数据库的一致性:已提交的事务将根据数据文件和日志文件进行重放操作,并回滚未提交的事务。

在准备增量备份时,必须跳过未提交事务的回滚,因为在备份的过程中,可能存在进行中且未提交的事务,并且这些事务很可能在下一次的增量备份中才进行提交,所以必须使用--apply-log-only选项来防止回滚操作。

方式1:

xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/20211010/base

xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/20211010/base --incremental-dir=/backup/mysql/20211010/incr1

xtrabackup --prepare --target-dir=/backup/mysql/20211010/base --incremental-dir=/backup/mysql/20211010/incr2

xtrabackup --copy-back --target-dir=/backup/mysql/20211010/base

chown -R mysql:mysql 数据库data目录 #恢复数据库data目录权限,比如我们的数据库data目录在/data/mysql/data,那么就是 chown -R mysql:mysql /data/mysql/data

方式2:

xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/20211010/base

xtrabackup --prepare --target-dir=/backup/mysql/20211010/base --incremental-dir=/backup/mysql/20211010/incr2

xtrabackup --copy-back --target-dir=/backup/mysql/20211010/base

chown -R mysql:mysql 数据库data目录 #恢复数据库data目录权限

注意:

--apply-log-only 命令应该用在所有增量备份,但最后一次增量备份除外 ,这就是为什么恢复脚本中,最后一次的命令不包含--apply-log-only。

即使--apply-log-only在最后一次增量备份时被使用,备份仍将是一致的,但在这种情况下,数据库会执行回滚的操作。

多线程备份

xtrabackup -u'用户名' -p'用户密码' --backup --parallel=4 --target-dir=/backup/mysql/20211010 #4线程备份

 

压缩备份(压缩解压需要qpress,下载地址:​​https://pkgs.org/download/qpress​​)

yum localinstall https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm #centos7直接安装,其他版本请对应下载

xtrabackup -u'用户名' -p'用户密码' --backup --compress --target-dir=/backup/mysql/20211010/compress

多线程压缩

xtrabackup -u'用户名' -p'用户密码' --backup --parallel=4 --compress --compress-threads=4 --target-dir=/backup/mysql/20211010/compress #4线程备份,4线程压缩

解压备份

xtrabackup --parallel=4 --decompress --target-dir=/backup/mysql/20211010/compress #4线程解压

查看目录文件,会发现压缩文件和解压文件共存,如果不想保留原压缩文件,可以使用 --remove-original 命令

 

实例:

mkdir -p /backup/mysql/`date +%Y%m%d`/ && xtrabackup -u'backup' -p'xxxxxxx' --backup --parallel=4 --compress --compress-threads=4 --target-dir=/backup/mysql/`date +%Y%m%d`/base

xtrabackup -u'backup' -p'xxxxxxx' --backup --parallel=4 --compress --compress-threads=4  --target-dir=/backup/mysql/`date +%Y%m%d`/incr1 --incremental-basedir=/backup/mysql/`date +%Y%m%d`/base/

其他使用方法,如流式备份,备份加密,指定数据库和表备份等,参考:​​http://blog.itpub.net/29812844/viewspace-2658452/​

 

 

 

 

----------------------------  mysqldump  ------------------------------------

 

导出数据

mysqldump --master-data=2  --single-transaction --no-create-db --set-gtid-purged=OFF --column-statistics=0 数据库名 -u"用户名" -p"用户密码" -h 数据库地址 > 数据库名.`date +%Y%m%d%H`.sql

--master-data 指定为2,会在备份文件中生成CHANGE MASTER的注释,以便记录binlog的状态信息,包括MASTER_LOG_FILE和MASTER_LOG_POS,生成如下:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=100;

如果设置为1,则生成的是CHANGE MASTER的命令,而不是注释。


--single-transaction 获取InnoDB表的一致性备份

--column-statistics=0 如是使用8.0版本的mysqldump导出低版本的数据库,需要加上这个设置,因为低版本mysql的information_schema中没有column-statistics数据表

如果导出指定表

mysqldump 数据库名 数据表1 数据表2 数据表3 ......

如果导出需要排除指定表

mysqldump 数据库名 --ignore-table=数据表1 --ignore-table=数据表2

导入数据

mysql -u"用户名" -p"用户密码" -h 数据库地址 数据库名 < 数据库.sql

 

mysqldump的执行过程和原理:​​https://www.modb.pro/db/28325​

 

主要参数说明:

-A,--all-databases:该选项表示备份实例中的所有数据库

-B,--databases:指定要备份的数据库名称,后面可以同时跟多个数据库

-E,--events:表示备份过程中包括数据库中的事件

-F,--flush-logs:表示备份完成之后刷新日志,滚动日志点,如果没有开启二进制日志,使用该选项会提示错误

--flush-privileges:表示备份最新的权限表数据

--hex-blob:表示备份过程中包括数据库中的二进制数据(BINARY,VARBINARY,BLOG)

-x,--lock-all-tables:该选项的作用是在备份过程中锁定所有的表,通常用于备份MyISAM存储引擎类型的表数据

--single-transaction:该选项表示备份过程中保证数据的一致性,使用事务隔离状态和一致性快照保证,目前只支持InnoDB类型的表

    注:--lock-all-tables选项和--single-transaction选项同时只能用一个

--master-data=N:该选项用来设置在导出的数据中是否包括对二进制日志文件和日志点的记录,常用的值有:1和2

    1:表示在导出的sql文件中包括了"change master to master_log_file='',master_log_pos=N"内容,用来做快速主从复制

    2:表示在导出的sql文件中不包括"change master to master_log_file='',master_log_pos=N"内容

-t,--no-create-info:表示只备份数据,不备份表的创建信息

-d,--no-data:表示只备份表结构,不备份任何数据

-R,--routines:表示备份中同时备份存储过程和函数

--tables:如果不需要备份整个库,只需要备份部分表,可以使用该选项指定

--triggers:表示备份中同时备份触发器

-u:指定完成备份操作的用户名

-p:指定完成备份操作的用户密码

-h:指定完成备份操作的域名或者ip地址

-P:指定完成备份操作的端口号。注意,是大写的P