MySQL中级-xtrabackup全量/增量备份与恢复

xtrabackup全量/增量备份与恢复

1.Xtrabackup介绍

实际环境中增量备份是非常实用的,数据量非常大的话,需要定制数据备份策略,mysql冷备/mysqldump/mysql热拷贝均无法实现增量备份,列如:每周实施完整备份,周一到周六实现增量备份,而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,其中有俩个工具xtrabackupinnobackup
支持mysql,percona server和mariadb,开源免费,xtrabackup只能备份innoDB和xtraDB俩种引擎的表不能备份mylSAM数据表

2.Xtrabackup优点

1.备份速度快,物理备份可靠
2.备份过程中不会打断正在执行的事务(无需锁表)
3.能够基于压缩等功能节约磁盘和流量
4.自动备份校验
5.还原速度快
6.可以流传备份传输到另外一台机器上
7.在不增加服务器负载的情况备份数据

3.xtrabackup中的俩个工具

xtrabackup:用于热备innoDB,而xtraDB表中数据的工具,不能备份其他类型的表,也不能备份myisam表的能力
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

4.xtrabackup常用选项

–u:用户
-p:密码
-P:端口号
-h:指定主机
-S:指定套接字
-databases:指定数据库
/backup:指定备份目录
incremental:创建增量
increment-basedir:指定包含全量备份的目录
increment-dir:指定包含增量备份的目录
-apply-log:对备份进行预处理操作
-redo-only:不回滚未提交数据
–copy-back:恢复备份目录

5.安装

版本下载地址: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
MySQL中级-xtrabackup全量/增量备份与恢复_第1张图片
MySQL中级-xtrabackup全量/增量备份与恢复_第2张图片
下载操作如下:

#下载
[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 
6.xtrabackup全量备份与恢复实战
1.全量备份
[root@clq ~]# innobackupex --user root --password Hauwei0917@ /backup/.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 510 19:18 /tmp/mysql.sock
lrwxrwxrwx. 1 root  root  15 510 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 511 19:08 clq
-rw-r-----. 1 mysql mysql      290 511 19:08 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 511 19:08 ibdata1
drwxr-x---. 2 mysql mysql     4096 511 19:08 mysql
drwxr-x---. 2 mysql mysql     8192 511 19:08 performance_schema
drwxr-x---. 2 mysql mysql     8192 511 19:08 sys
-rw-r-----. 1 mysql mysql      431 511 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)
6.1该实验可能会出现的问题与解决问题

问题: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

7.增量备份与还原实战
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)

你可能感兴趣的:(MySQL,数据库,mysql,运维,sql,mariadb)