1 Percona XtraBackup的工作原理:
xtrabackup特性:
1、支持热备份
2、支持对InnoDB、MyISAM,xtradb存储引擎的备份
3、备份过程快速、可靠
4、备份过程不会打断正在执行的事务
5、能够基于压缩等功能节约磁盘空间和流量
6、自动实现备份检验
7、还原速度快
1.XtraBackup复制InnoDB数据文件,这会导致内部不一致的数据,但是它会对文件执行崩溃恢复,以使其再次成为一个一致的可用数据库
2.这样做的可行性是因为InnoDB维护一个REDO日志,也称为事务日志。REDO日志包含了InnoDB数据每次更改的记录。当InnoDB启动时,REDO日志会检查数据文件和事务日志,并执行两个步骤。它将已提交的事务日志条目应用于数据文件,并对任何修改了数据但未提交的事务执行undo操作
3.Percona XtraBackup会在启动时记住日志序列号(LSN),然后复制数据文件。这需要一些时间来完成,如果文件正在改变,那么它会在不同的时间点反映数据库的状态。同时,Percona XtraBackup运行一个后台进程,用于监视事务日志文件,并从中复制更改。
Percona XtraBackup需要持续这样做,因为事务日志是以循环方式写入的,并且可以在一段时间后重新使用。
Percona XtraBackup开始执行后,需要复制每次数据文件更改对应的事务日志记录。
2 安装xtrabackup
解压安装包 :
tar -xvf percona-xtrabackup-8.0.33-28-Linux-x86_64.glibc2.17.tar.gz
mv percona-xtrabackup-8.0.33-28-Linux-x86_64 xtrabackup
3 使用xtrabackup备份
此时的全量备份可以用于数据恢复,
因为未提交的事务会在启动时被 MySQL 处理。
首先对全量备份应用日志,以作为增量的基础:
/data/xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --host=localhost --user=root --password=mysql --port=3306 --socket=/data/mysql8/mysql.sock --backup --target-dir=/data/xbackup/
使用 XtraBackup 进行增量备份(仅仅备份自上次备份后变更的数据),并使用备份数据进行恢复。
增量备份原理:
1)每个 InnoDB Page 都包含 LSN,LSN 是整个数据库的系统版本号,每个 InnoDB Page 的 LSN 都展示 InnoDB Page 是如何变化的
2)在增量备份时,对比 InnoDB Page 的 LSN 与 全量备份的 LSN,如果 InnoDB Page 的 LSN 较新,则复制该 InnoDB Page
3)更进一步,如果你知道 LSN,则无需基础的全量备份,可以使用 –incremental-lsn 直接指定(但是恢复的时候依旧需要基础的全量备份)
注意事项:
1)该增量备份只能针对 MySQL 实例,而不能针对特定数据库或者特定数据表;
3.创建增量备份
3.1 创建全量备份
增量备份是在全量备份的基础之上,因此需要先创建全量备份:
[root@lys-mysql full]# xtrabackup --host=10.6.8.238 --user=user0001 --password=User0001! --port=3306 --databases="db01" --backup --target-dir=/data/backups/full --no-server-version-check
查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。
[root@lys-mysql full]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 18611669
last_lsn = 18611669
flushed_lsn = 18611669
3.2 创建增量备份
[root@lys-mysql inc1]# xtrabackup --no-server-version-check --backup --host=10.6.8.238 --user=user0001 --password=User0001! --port=3306 --databases="db01" --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/full
4.将备份文件目录打包传到目的机器
[root@localhost ]# cd /data
[root@localhost ]# tar -cvf xbackup.tar ./xbackup/
[root@localhost ]# scp xbackup.tar root@192.168.2.110:/data
1 解压文件。
5 停止目标mysql数据库。
6 备份原来mysql数据库的数据目录,(这里要是binlog日志不是放在data目录的话,需要将binlog日志要删除掉)
7.xtrabackup恢复
/opt/xtrabackup-8.0.7/bin/xtrabackup --defaults-file=/opt/mha/mysql8/conf/my.cnf --user=root --prepare --target-dir=/opt/mha/xbackup/
/opt/xtrabackup-8.0.7/bin/xtrabackup --defaults-file=/opt/mha/mysql8/conf/my.cnf --user=root --copy-back --target-dir=/opt/mha/xbackup/
4.2 应用首个增量备份准备
最后新的备份数据位于/data/backups/full 目录,即该目录数据已经被修改,不再是原先的全量备份。
注意事项,增量备份目录(/data/backups/inc1)只能使用一次,如果以后会再次使用,需要先将其备份。
[root@lys-mysql full]# xtrabackup --no-server-version-check --prepare --apply-log-only --host=10.6.8.238 --user=user0001 --password=User0001! --port=3306 --databases="db01" --target-dir=/data/backups/full --incremental-dir=/data/backups/inc1
5.修改目录属性启动数据库:
[root@localhost mysql8]# cd /opt/mha/mysql8
[root@localhost mysql8]# chown -R mysql:mysql ./data ##数据文件
[root@localhost mysql8]# chown -R mysql:mysql ./mysqllog ##binlog存储路径
[root@localhost mysql8]# su - mysql
[mysql@localhost ~]$ /opt/mha/mysql8/bin/mysqld_safe --defaults-file=/opt/mha/mysql8/conf/my.cnf --user=mysql &
8.配置从库
在从库上执行
/opt/mha/mysql8/bin/mysql -h localhost -uroot -pmysql -P13306 -S /opt/mha/mysql8/mysql.sock
重新指定通道属性 不需要进行reset slave了 。
change master to master_host='192.168.1.134',
master_port=13306,
master_user='repl',
master_password='mysql',
master_log_file='binlog.000006',
master_log_pos=195;
这里的master_log_file和master_log_post可以从xtrabackup_info的信息找到
[mysql@localhost data]$ more xtrabackup_info
uuid = 7b3c84a0-e021-11e9-8c80-525400c8dc1f
name =
tool_name = xtrabackup
tool_command = --defaults-file=/opt/mha/mysql8/conf/my.cnf --host=localhost --user=root --password=... --port=13306 --socket=/opt/mha/mysql8/mysql.sock --backup --target-dir=/opt/mha/xbackup/
tool_version = 8.0.7
ibbackup_version = 8.0.7
server_version = 8.0.17
start_time = 2019-09-26 13:49:56
end_time = 2019-09-26 13:50:01
lock_time = 0
binlog_pos = filename 'binlog.000006', position '195', GTID of the last change 'bd3f495f-cfb6-11e9-9e6f-525400c8dc1f:1-22'
innodb_from_lsn = 0
innodb_to_lsn = 19847436
partial = N
incremental = N
format = file
compressed = N
encrypted = N
7.启动从库
mysql> start slave;
遇到的问题:
报错信息:
error connecting to master 'repl@192.168.1.134:13306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
解决办法:
alter user 'repl'@'%' identified with mysql_native_password by 'mysql';
flush privileges;