MySQL 物理备份 xtrabackup

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 616 17:08 ib_buffer_pool
-rw-r----- 1 root root 12582912 616 17:08 ibdata1
drwxr-x--- 2 root root     4096 616 17:08 mysql
drwxr-x--- 2 root root     8192 616 17:08 performance_schema
drwxr-x--- 2 root root     8192 616 17:08 sys
-rw-r----- 1 root root      423 616 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值