MySQL 物理备份 xtrabackup
一、xtrabackup 介绍
Xtrabackup 是一个开源的免费的热备工具,在 Xtrabackup 包中主要有 Xtrabackup 和 innobackupex 两个工具。其中 Xtrabackup 只能备份 InnoDB 和 XtraDB 两种引擎; innobackupex则 是封装了Xtrabackup,同时增加了备份MyISAM引擎的功能。
Xtrabackup备份时不能备份表结构、触发器等等,也不能智能区分.idb 数据文件。另外 innobackupex还不能完全支持增量备份,需要和xtrabackup结合起来实现全备的功能。
二、xtrbackup 安装
1、下载安装包
Xtrabackup 下载地址 https://www.percona.com/downloads/ 选择自己的版本下载。
https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2. 4.18/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.t ar
依赖包下载,下载地址 http://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04- 2.el6.x86_64.rpm。
2、解压安装
[root@localhost ~]# ls
libev-4.04-2.el6.x86_64.rpm Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-
bundle.tar
[root@localhost ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm
warning: libev-4.04-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID
66534c2b: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:libev-4.04-2.el6 ################################# [100%]
[root@localhost ~]# tar -xf Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-
bundle.tar
[root@localhost ~]# ls
libev-4.04-2.el6.x86_64.rpm
Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm
percona-xtrabackup-24-debuginfo-2.4.14-1.el7.x86_64.rpm
percona-xtrabackup-test-24-2.4.14-1.el7.x86_64.rpm
[root@localhost ~]# yum -y install percona-xtrabackup-24-2.4.14-
1.el7.x86_64.rpm # 这里用yum安装,因为还有其他的依赖包
3、配置文件
修改配置文件/etc/my.cnf,保证[mysqld]模块存在参数datadir=/var/lib/mysql(指向数据目 录),因为xtrbackup是根据/etc/my.cnf配置文件来获取需要备份的文件。
4、重启mysqld。
三、xtrbackup 使用
一般使用的是 innobackupex 脚本,因为 innobackupex 是 perl 脚本对 xtrbackup 的封装和功能 扩展。
1、用户权限说明
备份数据库时会涉及到两个用户:系统用户与数据库内部的用户。
1)系统用户
需要在 datadir(配置文件内设置的目录)上具有读写执行权限(rwx)。
2)数据库内部用户
RELOAD 和 LOCK TABLES 权限,执行 FLUSH TABLES WITH READ LOCK;
REPLICATION CLIENT 权限,获取 binary log(二进制日志文件)位置;
CREATE TABLESPACE权限,导入表,用户表级别的恢复;
SUPER权限,在slave环境下备份用来启动和关闭slave线程。
2、常用命令格式和常用参数
1)命令格式:
innobackupex [参数] [目的地址|源地址]
2)常用参数
--user # 以什么用户身份进行操作
--password # 数据库用户的密码
--port # 数据库的端口号,默认3306
--stream # 打包(数据流)
--defaults-file # 指定默认配置文件,默认读取/etc/my.cnf
--no-timestamp # 不创建时间戳文件,而改用目的地址(可以自动创建)
--copy-back # 备份还原的主要选项
--incremental # 使用增量备份,默认使用的完整备份
--incremental-basedir # 与--incremental选项联合使用,该参数指定上一级备份的地址来做增量备份
3、xtrbackup 完整备份和还原
1)完整备份
[root@localhost ~]# innobackupex --user=root --password=Qfedu.123com
/backup/mysql/ # 有大量输出备份信息
[root@localhost ~]# innobackupex --user=root --password=Qfedu.123com
/backup/mysql/ 2>>/backup/mysql/backup.log # 将备份输出信息保存到文件
[root@localhost ~]# ls /backup/mysql/
2019-06-16_15-49-44 2019-06-16_15-51-23 backup.log
[root@localhost ~]# ls /backup/mysql/2019-06-16_15-49-44/
backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints
xtrabackup_logfile
ib_buffer_pool mysql sys xtrabackup_info
[root@localhost ~]# innobackupex --user=root --password=Qfedu.123com --notimestamp /backup/mysql/test/ 2>>/backup/mysql/backup.log # 不使用时间戳创建目录,可自动创建目的地址
[root@localhost ~]# ls /backup/mysql/
2019-06-16_15-49-44 2019-06-16_15-51-23 backup.log test
[root@localhost ~]# ls /backup/mysql/test/
2019-06-16_15-54-20
[root@localhost ~]# ls /backup/mysql/test/2019-06-16_15-54-20
backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints
xtrabackup_logfile
ib_buffer_pool mysql sys xtrabackup_info
2)数据还原
注意:innobackupex -copy-back不会覆盖已存在的文件。而且还原时需要先关闭服务,如果服务 是启动的,那么就不能还原到 datadir
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /var/lib/mysql/* # 危险操作,请在测试环境
测试
[root@localhost ~]# innobackupex --copy-back /backup/mysql/2019-06-16_15-49-44/ 2>>/backup/mysql/copyback.log
[root@localhost ~]# ll /var/lib/mysql
总用量 12324
-rw-r----- 1 root root 292 6月 16 17:08 ib_buffer_pool
-rw-r----- 1 root root 12582912 6月 16 17:08 ibdata1
drwxr-x--- 2 root root 4096 6月 16 17:08 mysql
drwxr-x--- 2 root root 8192 6月 16 17:08 performance_schema
drwxr-x--- 2 root root 8192 6月 16 17:08 sys
-rw-r----- 1 root root 423 6月 16 17:08 xtrabackup_info
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql # 重新授权,否则mysqld无法启动
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -pQfedu.123com
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
4、xtrbackup 增量备份的还原
增量备份的实现,依赖于innodb 页上面的 LSN(log sequence number),每次对数据库的修改 都会导致 LSN 自增。增量备份会复制指定 LSN<日志序列号>之后的所有数据页。
1)查看完整备份的LSN
[root@localhost ~]# innobackupex --user=root --password=Qfedu.123com /backup/mysql/
[root@localhost ~]# cat /backup/mysql/2020-03-12_16-45-17/xtrabackup_checkpoints
backup_type = full-backuped # 代表完整备份
from_lsn = 0
to_lsn = 2525919
last_lsn = 2525928
compact = 0
recover_binlog_info = 0
flushed_lsn = 2525928
2)以全备创建增量备份
创建一些数据,以2020-03-12_16-45-17时间戳创建第一个增量备份,并查看 LSN
[root@localhost ~]# mysql -uroot -pQfedu.123com
mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)
mysql> use test_db;
Database changed
mysql> create table user_tb(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user_tb values(1,'zhangsan');
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
[root@localhost ~]# innobackupex --user=root --password=Qfedu.123com --incremental /backup/mysql/ --incremental-basedir=/backup/mysql/2020-03-12_16-45-17/
[root@localhost ~]# innobackupex --user=root --password=Qfedu.123com --incremental --incremental-basedir=/backup/mysql/2020-03-12_16-45-17/ /backup/mysql/ 2>>/backup/mysql/backup.log
[root@localhost ~]# cat /backup/mysql/2020-03-12_16-48-08/xtrabackup_checkpoints
backup_type = incremental # 表示增量备份
from_lsn = 2525919
to_lsn = 2530689
last_lsn = 2530698
compact = 0
recover_binlog_info = 0
flushed_lsn = 2530698
3)恢复数据准备全量备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/mysql/2020-03-12_16-45-17/ 2>>/backup/mysql/copyback.log
4)应用第一次增量备份到全量备份
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/mysql/2020-03-12_16-45-17/ --incremental-dir=/backup/mysql/2020-03-12_16-48-08 2>>/backup/mysql/copyback.log
5)查看全量备份的 xtrabackup_checkpoints
[root@localhost ~]#cat /backup/mysql/2019-06-16_15-49-44/xtrabackup_checkpoints
对比之前查看的第一次增量备份的 last_lsn 位置,在应用第一次增量备份到全量后,可以看到 last_lsn 已经被应用和第一次全量备份的位置相同了
6)把备份整体进行一次apply操作
[root@localhost ~]# innobackupex --apply-log /backup/mysql/2020-03-12_16-45-17/ 2>>/backup/mysql/copyback.log
7)停止 mysql 服务并移除数据目录(生产环境建议用 mv )
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /var/lib/mysql/* # 危险操作建议用 mv
8)使用–copy-back 参数恢复拷贝到data目录
[root@localhost ~]# innobackupex --copy-back /backup/mysql/2020-03-12_16-45-17/ 2>/backup/mysql/copyback.log
9)验证数据还原
[root@localhost ~]# ls -l /var/lib/mysql
10)授权并启动MySQL
[root@localhost ~]# ls -l /var/lib/mysql
11)验证数据完整性
[root@localhost ~]# mysql -uroot -pQfedu.123com
mysql> use test_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from user_tb;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
2 rows in set (0.00 sec)
1)增量备份需要使用参数–incremental指定需要备份到哪个目录,使用incremental-dir指定全备目 录;
2)进行数据备份时,需要使用参数–apply-log redo-only先合并全备数据目录数据,确保全备数据目 录数据的一致性;
3)再将增量备份数据使用参数–incremental-dir合并到全备数据当中;
4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据 当中,再进行恢复。
5、xtrbackup 数据流压缩
-stream 选项
注意:使用–stream选项时,会输出打包的数据流,并不会直接生成打包文件,此时需要使用重定 向或其他命令对数据流进行处理。
1)使用重定向生成压缩文件
将标准输出重定向为tar文件,将标准错误重定向到日志文件
[root@localhost ~]# innobackupex --databases=test_db --user=root --password=Qfedu.123com --stream=tar /backup/mysql/> /backup/mysql/`date +%F`.tar 2> /backup/mysql/backup.log
[root@localhost ~]# ls //backup/mysql/
2019-09-29.tar backup.log
[root@localhost ~]# cd //backup/mysql/
[root@localhost ~]# mkdir test_db.bak
[root@localhost mysql]# tar xf 2019-09-29.tar -C ./test_db.bak # 注意: 解压时指定解压目录,压缩中没有归档目录
[root@localhost mysql]# ls test_db.bak
ib_buffer_pool xtrabackup_binlog_info xtrabackup_logfile
backup.log ibdata1 xtrabackup_checkpoints
backup-my.cnf test_db xtrabackup_info
2)使用 ssh 和 cat 组合命令,直接备份到其他服务器上
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id 192.168.5.70
[root@localhost ~]# ssh root@192.168.5.70 "mkdir /backup/mysql"
[root@localhost ~]# innobackupex --databases=test_db --user=root --password=Qfedu.123com --stream=tar 2>/backup/mysql/backup.log | ssh root@192.168.5.70 "cat - > /backup/mysql/`date +%F`.tar "
[root@localhost ~]# ssh 192.168.5.70
[root@1000phone mysql]# ls /backup/mysql # 查看备份文件
2019-09-29.tar
[root@1000phone mysql]# mkdir /backup/mysql/test_db.bak
[root@1000phone ~]# tar xf /2019-09-29.tar -C /backup/mysql/test_db.bak/ # 解压查看解压结果
[root@1000phone ~]# ls /backup/mysql/test_db.bak
backup-my.cnf ibdata1 xtrabackup_binlog_info xtrabackup_info
ib_buffer_pool test_db xtrabackup_checkpoints xtrabackup_logfile
[root@1000phone mysql]# exit
3)使用 gzip 再压缩一下
[root@localhost ~]# rm -rf /backup/mysql/*
[root@localhost ~]# innobackupex --databases=test_db --user=root --password=Qfedu.123com --stream=tar /backup/mysql/ 2>/backup/mysql/backup.log | gzip > /backup/mysql/`date +%F`.tar.gz
[root@localhost ~]# ls /backup/mysql/
2019-09-29.tar.gz backup.log
[root@localhost ~]# mkdir /backup/mysql/test_db.bak
[root@localhost ~]# tar zxf /backup/mysql/2019-09-29.tar.gz -C
/backup/mysql/test_db.bak
[root@localhost ~]# ls /backup/mysql/test_db.bak # 解压查看
ib_buffer_pool xtrabackup_binlog_info xtrabackup_logfile
backup.log ibdata1 xtrabackup_checkpoints
backup-my.cnf test_db xtrabackup_info