物理备份xtrabackup
Xtrabackup 是一个开源的免费的热备工具,在 Xtrabackup 包中主要有 Xtrabackup 和innobackupex 两个工具。其中Xtrabackup 只能备份 InnoDB 和 XtraDB 两种引擎; innobackupex则是封装了Xtrabackup,同时增加了备份MyISAM引擎的功能。
Xtrabackup备份时不能备份表结构、触发器等等,也不能智能区分.idb 数据文件。另外
innobackupex还不能完全支持增量备份,需要和xtrabackup结合起来实现全备的功能。
安装
-
下载安装包及依赖,根据版本下载
[root@node1 ~]# mysql -V mysql Ver 14.14 Distrib 5.7.42, for Linux (x86_64) using EditLine wrapper
https://www.percona.com/downloads
http://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
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.tar
-
解压安装
#上传文件 [root@node1 ~]# ls libev-4.04-2.el6.x86_64.rpm Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.tar [root@node1 ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm [root@node1 ~]# tar -xf Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.tar [root@node1 ~]# ls libev-4.04-2.el6.x86_64.rpm percona-xtrabackup-24-debuginfo-2.4.18-1.el7.x86_64.rpm Percona-XtraBackup-2.4.18-r29b4ca5-el7-x86_64-bundle.tar percona-xtrabackup-test-24-2.4.18-1.el7.x86_64.rpm percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm [root@node1 ~]# yum -y install percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm
-
配置文件
保证[mysqld]存在参数 datadir=/var/lib/mysql(指向数据目录),xtrbackup根据配置文件获取需要备份的文件。
-
重启mysqld
使用
用户权限
-
备份数据库时会涉及到两个用户:系统用户与数据库内部的用户。
-
系统用户
需要在 datadir(配置文件内设置的目录)上具有读写执行权限(rwx)。
-
数据内部用户
RELOAD 和 LOCK TABLES 权限,执行 FLUSH TABLES WITH READ LOCK; REPLICATION CLIENT 权限,获取 binary log(二进制日志文件)位置; CREATE TABLESPACE权限,导入表,用户表级别的恢复; SUPER权限,在slave环境下备份用来启动和关闭slave线程。
-
命令格式与参数
innobackupex [参数] [目的地址|源地址]
--user # 以什么用户身份进行操作 --password # 数据库用户的密码 --port # 数据库的端口号,默认3306 --stream # 打包(数据流) --defaults-file # 指定默认配置文件,默认读取/etc/my.cnf --no-timestamp # 不创建时间戳文件,而改用目的地址(可以自动创建) --copy-back # 备份还原的主要选项 --incremental # 使用增量备份,默认使用的完整备份 --incremental-basedir # 与--incremental选项联合使用,该参数指定上一级备份的地址来做增 量备份
完整备份
[root@node1 ~]# innobackupex --user=root --password=你自己密码 /backup/mysql/ #大量输出备份文件
#备份输出信息保存到文件
[root@node1 ~]# innobackupex --user=root --password=密码 /backup/mysql/ 2>> /backup/mysql/backup.log
[root@node1 ~]# ll /backup/mysql/
总用量 52
drwxr-x---. 5 root root 193 6月 12 12:02 2023-06-12_12-02-24
drwxr-x---. 5 root root 193 6月 12 12:10 2023-06-12_12-10-05
-rw-r--r--. 1 root root 51120 6月 12 12:10 backup.log
[root@node1 ~]# ls /backup/mysql/2023-06-12_12-02-24/
backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool mysql sys xtrabackup_info
#不使用时间戳创建目录
[root@node1 ~]# innobackupex --user=root --password=密码 --no-timestamp /backup/mysql/nostamp/ 2>> /backup/mysql/backup.log
[root@node1 ~]# ls /backup/mysql/
2023-06-12_12-02-24 2023-06-12_12-10-05 backup.log nostamp
数据还原
#innobackupex -copy-back不会覆盖已存在的文件。而且还原时需要先关闭服务,如果服务是启动的,那么就不能还原到 datadir
[root@node1 ~]# systemctl stop mysqld
[root@node1 ~]# rm -rf /var/lib/mysql/* #模拟数据崩溃
[root@node1 ~]# innobackupex --copy-back /backup/mysql/2023-06-12_12-02-24/ 2>>/backup/mysql/copyback.log
[root@node1 ~]# ll /var/lib/mysql
总用量 12324
-rw-r-----. 1 root root 350 6月 12 12:55 ib_buffer_pool
-rw-r-----. 1 root root 12582912 6月 12 12:55 ibdata1
drwxr-x---. 2 root root 4096 6月 12 12:55 mysql
drwxr-x---. 2 root root 8192 6月 12 12:55 performance_schema
drwxr-x---. 2 root root 8192 6月 12 12:55 sys
-rw-r-----. 1 root root 425 6月 12 12:55 xtrabackup_info
[root@node1 ~]# chown -R mysql:mysql /var/lib/mysql #重新授权
[root@node1 ~]# systemctl start mysqld
[root@node1 ~]# mysql -uroot -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
增量备份
增量备份的实现,依赖于innodb 页上面的 LSN(log sequence number),每次对数据库的修改
都会导致 LSN 自增。增量备份会复制指定 LSN<日志序列号>之后的所有数据页。
-
查看完整备份LSN
[root@node1 ~]# innobackupex --user=root --password=密码 /backup/mysql/ [root@node1 ~]# cat /backup/mysql/2023-06-12_13-38-21/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 2767400 last_lsn = 2767409 compact = 0 recover_binlog_info = 0 flushed_lsn = 2767409
-
以全备创建增量备份以某个文件时间为时间戳创建第一个增量备份
[root@node1 ~]# ll /backup/mysql/ 总用量 0 drwxr-x---. 5 root root 193 6月 12 13:47 2023-06-12_13-47-06
-
进入数据库,创建文件,查看LSN
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.01 sec) mysql> \q Bye
[root@node1 ~]# innobackupex --user=root --password=密码 --incremental /backup/mysql/ --incremental-basedir=/backup/mysql/2023-06-12_13-47-06/
[root@node1 ~]# innobackupex --user=root --password= 密码 --incremental --incremental-basedir=/backup/mysql/2023-06-12_13-47-06/ /backup/mysql/ 2>>/backup/mysql/backup.log
[root@node1 ~]# cat /backup/mysql/2023-06-12_14-11-53/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2767400
to_lsn = 2771841
last_lsn = 2771850
compact = 0
recover_binlog_info = 0
flushed_lsn = 2771850
-
恢复数据准备全量备份
innobackupex --apply-log --redo-only /backup/mysql/2023-06-12_13-47-06/ 2>>/backup/mysql/copyback.log
-
应用第一次增量备份到全量备份
innobackupex --apply-log --redo-only /backup/mysql/2023-06-12_13-47-06/ --incremental-dir=/backup/mysql/2023-06-12_14-11-53 2>>/backup/mysql/copyback.log #发现全量备份last_lsn与增量备份相同 [root@node1 ~]# cat /backup/mysql/2023-06-12_13-47-06/xtrabackup_checkpoints backup_type = log-applied from_lsn = 0 to_lsn = 2771841 last_lsn = 2771850 compact = 0 recover_binlog_info = 0 flushed_lsn = 2771850
-
备份整体做一次apply操作
innobackupex --apply-log /backup/mysql/2023-06-12_13-47-06/ 2>>/backup/mysql/copyback.log
-
停止服务移除数据目录
[root@node1 ~]# systemctl stop mysqld [root@node1 ~]# rm -rf /var/lib/mysql/*
-
使用–copy-back参数恢复拷贝到data目录
innobackupex --copy-back /backup/mysql/2023-06-12_13-47-06/ 2>/backup/mysql/copyback.log
-
验证数据完整性
[root@node1 ~]# ls -l /var/lib/mysql 总用量 122920 -rw-r-----. 1 root root 350 6月 12 14:38 ib_buffer_pool -rw-r-----. 1 root root 12582912 6月 12 14:38 ibdata1 -rw-r-----. 1 root root 50331648 6月 12 14:38 ib_logfile0 -rw-r-----. 1 root root 50331648 6月 12 14:38 ib_logfile1 -rw-r-----. 1 root root 12582912 6月 12 14:38 ibtmp1 drwxr-x---. 2 root root 4096 6月 12 14:38 mysql drwxr-x---. 2 root root 8192 6月 12 14:38 performance_schema drwxr-x---. 2 root root 8192 6月 12 14:38 sys drwxr-x---. 2 root root 58 6月 12 14:38 test_db -rw-r-----. 1 root root 502 6月 12 14:38 xtrabackup_info -rw-r-----. 1 root root 1 6月 12 14:38 xtrabackup_master_key_id #授权启动 [root@node1 ~]# chown -R mysql:mysql /var/lib/mysql/ [root@node1 ~]# systemctl start mysqld
-
进入数据库,验证数据是否恢复
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 mysql> select* from user_tb; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | +------+----------+ --成功!
(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目 录; (2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性; (3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中; (4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据 当中,再进行恢复。