实际环境中增量备份是非常实用的,数据量非常大的话,需要定制数据备份策略,mysql冷备/mysqldump/mysql热拷贝均无法实现增量备份,列如:每周实施完整备份,周一到周六实现增量备份,而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,其中有俩个工具xtrabackup,innobackup。
支持mysql,percona server和mariadb,开源免费,xtrabackup只能备份innoDB和xtraDB俩种引擎的表,不能备份mylSAM数据表
1.备份速度快,物理备份可靠
2.备份过程中不会打断正在执行的事务(无需锁表)
3.能够基于压缩等功能节约磁盘和流量
4.自动备份校验
5.还原速度快
6.可以流传备份传输到另外一台机器上
7.在不增加服务器负载的情况备份数据
xtrabackup:用于热备innoDB,而xtraDB表中数据的工具,不能备份其他类型的表,也不能备份myisam表的能力
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
–u:用户
-p:密码
-P:端口号
-h:指定主机
-S:指定套接字
-databases:指定数据库
/backup:指定备份目录
incremental:创建增量
increment-basedir:指定包含全量备份的目录
increment-dir:指定包含增量备份的目录
-apply-log:对备份进行预处理操作
-redo-only:不回滚未提交数据
–copy-back:恢复备份目录
版本下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
包地址:https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/8/x86_64/Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar
下载操作如下:
#下载
[root@clq src]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/8/x86_64/Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar
#解压该包
[root@clq src]# tar -xf Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar
[root@clq src]# ls
debug
kernels
mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bundle.tar
percona-xtrabackup-24-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-24-debuginfo-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-24-debugsource-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-test-24-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-test-24-debuginfo-2.4.22-1.el8.x86_64.rpm
#yum安装该主包
[root@clq src]# yum -y install percona-xtrabackup-24-2.4.22-1.el8.x86_64.rpm
1.全量备份
[root@clq ~]# innobackupex --user root --password Hauwei0917@ /backup/
1.1问题分析:二进制安装的mysql可能会找不到套接字而报错,问题如下:
Failed to connect to MySQL server: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
1.2问题解决(创建软连接即可)
[root@clq ~]# mkdir /var/lib/mysql
[root@clq ~]# ln -s /tmp/mysql.sock /var/lib/mysql/
[root@clq ~]# ll /var/lib/mysql/mysql.sock /tmp/mysql.sock
srwxrwxrwx. 1 mysql mysql 0 5月 10 19:18 /tmp/mysql.sock
lrwxrwxrwx. 1 root root 15 5月 10 20:42 /var/lib/mysql/mysql.sock -> /tmp/mysql.sock
2.#观察到全量备份的大小
[root@clq ~]# du -sh /backup/
26M /backup/
2.1#查看备份文件类型
[root@clq 2021-05-10_20-51-03]# ls
backup-my.cnf(配置文件) ib_buffer_pool
mysql(数据库) sys xtrabackup_info(信息)
clq(自己创建的数据库) ibdata1(数据文件) performance_schema(性能模式)
xtrabackup_checkpoints(检查点) xtrabackup_logfile(日志文件)
[root@clq 2021-05-10_20-51-03]# tree clq
clq
├── db.opt(text文本文档)
├── student02.frm(表定义的文件类型)
├── student02.ibd(数据类型)
├── student.frm
└── student.ibd
3.关闭mysql服务(必须关闭改服务,否则该实验无法实现)
[root@clq ~]# systemctl stop mysqld
4.误删数据(生产环境建议mv切记)
[root@clq ~]# rm -rf /opt/data/*
5.进行全量备份数据还原
[root@clq ~]# innobackupex --copy-back /backup/2021-05-10_20-51-03 2>>/backup/mysql/copyback.log
#考虑到以后的脚本,可以这样写,(2>>/backup/mysql/copyback.log)可忽略
6.查看是否恢复成功
[root@clq data]# ls
clq ib_buffer_pool ibdata1 mysql performance_schema sys xtrabackup_info
7.授mysql用户权限
[root@clq data]# chown mysql.mysql /opt/data/*
[root@clq data]# ll /opt/data/
总用量 12324
drwxr-x---. 2 mysql mysql 58 5月 11 19:08 clq
-rw-r-----. 1 mysql mysql 290 5月 11 19:08 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 5月 11 19:08 ibdata1
drwxr-x---. 2 mysql mysql 4096 5月 11 19:08 mysql
drwxr-x---. 2 mysql mysql 8192 5月 11 19:08 performance_schema
drwxr-x---. 2 mysql mysql 8192 5月 11 19:08 sys
-rw-r-----. 1 mysql mysql 431 5月 11 19:08 xtrabackup_info
8.重启
systemctl start mysqld
9.完成!!
mysql> select * from student;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 6 | zhangshan | 20 |
| 7 | lisi | 100 |
| 8 | chenshuo | 10 |
| 9 | wangwu | 100 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+
11 rows in set (0.00 sec)
问题:1.重启不成功,2.数据没恢复成功看不到
解决:1.之前删除数据/opt/data时,导致进程文件和套接字文件的缺失,需重新创建进程文件 touch /opt/data/mysql.pid
创建软连接 /ln -s /var/lib/mysql/mysql.sock /tmp/
2.innobackupex对应会找到/etc/my.cnf配置文件,使其/opt/data权限全部为mysql用户,
chown mysql.mysql /opt/data/* -R
chown mysql.mysql /var/lib/mysql/mysql.sock -R
chown mysql.mysql /tmp/mysql.sock -R
1.先做个全量备份
[root@clq backup]# innobackupex --user root --password Huawei0917@ /backup/
[root@clq 2021-05-11_20-14-53]# cat xtrabackup_checkpoints
backup_type = full-backuped #完全备份日志
from_lsn = 0
to_lsn = 2747697
last_lsn = 2747706
compact = 0
recover_binlog_info = 0
flushed_lsn = 2747706
2.在数据库内增加新的数据
mysql> insert into student(name,age) values('A',20),('B',21),('C',22);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
3.基于全量备份进行增量备份
[root@clq backup]# innobackupex --user=root --password=Huawei0917@ --incremental /backup/ --incremental-basedir=/backup/2021-05-11_20-14-53
--user:用户 --password:密码 --incremental:创建增量备份 --incremental-basedir:指定包含全量备份的目录
#创建备份A<<------导入增加------包含全量备份
[root@clq 2021-05-11_20-32-10]# cat xtrabackup_checkpoints
backup_type = incremental#增量备份
from_lsn = 2747697 #观察到从上一个备份的结束日志开始保存的
to_lsn = 2749590
last_lsn = 2749599
compact = 0
recover_binlog_info = 0
flushed_lsn = 2749599
4.进行增量备份还原
[root@clq backup]# ls
2021-05-11_20-14-53(全量备份) 2021-05-11_20-32-10(增量备份)
4.1对全量备份进行一个预处理:
[root@clq backup]# innobackupex --apply-log --redo-only /backup/2021-05-11_20-14-53/
4.2全量备份的基础上再继续一个增量备份预处理:
[root@clq backup]# innobackupex --apply-log --redo-only /backup/2021-05-11_20-14-53/ --incremental-dir=/backup/2021-05-11_20-32-10
--incremental-dir:指定包含增量备份的目录 apply-log:应用日志 redo-only:仅重新做
4.3观察文件
[root@clq 2021-05-11_20-14-53]# cat xtrabackup_checkpoints
backup_type = log-applied #全量备份变成了应用日志
from_lsn = 0
to_lsn = 2749590 #增加了许多
last_lsn = 2749599
compact = 0
recover_binlog_info = 0
flushed_lsn = 2749599
[root@clq 2021-05-11_20-32-10]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2747697
to_lsn = 2749590
last_lsn = 2749599
compact = 0
recover_binlog_info = 0
flushed_lsn = 2749599
4.4关闭mysql服务
[root@clq ~]# systemctl stop mysqld.service
4.5删掉数据 (建议mv)慎用
[root@clq ~]# rm -rf /opt/data/*
4.6进行恢复备份数据
[root@clq ~]# innobackupex --copy-back /backup/2021-05-11_20-14-53/(全量变成apply-log的增量文件)
4.7授予mysql权限
[root@clq ~]# chown mysql.mysql /opt/data/*
4.8开启mysql服务
[root@clq tmp]# systemctl start mysqld.service
4.9查看数据情况
mysql> select * from student;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | wangqing | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 6 | zhangshan | 20 |
| 7 | lisi | 100 |
| 8 | chenshuo | 10 |
| 9 | wangwu | 100 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
| 12 | A | 20 |
| 13 | B | 21 |
| 14 | C | 22 |
+----+-------------+------+
14 rows in set (0.00 sec)
整个过程:1.全备:innobackupex -uroot -p /backup
2.增加数据后,增备:innobackup -uroot -p --incremental /backup --incremental-basedir /backup/全备
3..依次类推
4.全备预处理:innobackupex -uroot -p --apply-log --redo-only /backup/全量文件
5.增量预处理:innobackupex -uroot -p --apply-log --redo-only /backup/全量文件 --incremental-dir /backup/增量文件
6.恢复:innobackupex -uroot -p --copy-back /back/(全量备份文件apply-log)