一 备份介绍
### 优点:
1. **在线备份:** XtraBackup 支持在线备份,这意味着你可以在 MySQL 服务器运行的同时进行备份,而无需停止数据库服务。这对于生产环境中的数据库是非常关键的,因为可以最小化停机时间。
2. **增量备份:** XtraBackup 支持增量备份,允许你仅备份自上次完整备份或增量备份以来发生更改的数据。这可以减少备份所需的时间和磁盘空间。
3. **高性能:** XtraBackup 通过使用 InnoDB 的快速检查点算法来实现高性能备份。这可以显著减少备份所需的时间,并降低对生产系统的影响。
4. **支持 InnoDB 和 XtraDB 存储引擎:** XtraBackup 不仅支持 MySQL 的默认存储引擎 InnoDB,还支持 Percona 的增强版 XtraDB 存储引擎。这使其成为使用这两种存储引擎的用户的理想选择。
5. **完整性检查和验证:** XtraBackup 在备份过程中会对备份数据的完整性进行检查,以确保备份文件是可用且正确的。这提供了额外的安全性。
二 工作原理
1. 创建快照: 2. 应用日志: ┌──────────────┐ ┌──────────────────┐ │ MySQL 数据库 │ │ 事务日志 (redo log)│ └──────────────┘ └──────────────────┘ │ │ ▼ ▼ ┌──────────────┐ ┌──────────────────┐ │ 创建数据库快照│ │ 应用事务日志到快照 │ └──────────────┘ └──────────────────┘ 3. 备份元数据: 4. 创建备份文件: ┌──────────────┐ ┌──────────────┐ │ 数据库元数据 │ │ 备份文件 │ └──────────────┘ └──────────────┘ │ │ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ 备份数据库元数据 │ │ 备份文件操作 │ └──────────────┘ └──────────────┘
三 获取xtarbackup
Percona 官方网站: 你可以从 Percona 的官方网站下载 XtraBackup。访问 Percona XtraBackup 下载页面https://www.percona.com/downloads/XtraBackup/
使用包管理工具: 对于一些 Linux 发行版,你还可以使用系统的包管理工具来安装 XtraBackup。以下是一些示例
sudo apt-get install percona-xtrabackup
sudo yum install percona-xtrabackup
源码编译: 如果你需要特定版本或者无法通过包管理工具获取 XtraBackup,你还可以从源代码编译。在 Percona XtraBackup GitHub 仓库 上可以找到源代码
3.1 安装完整的xtrabackup软件
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/tarball/percona-xtrabackup-2.4.28-Linux-x86_64.glibc2.17.tar.gz tar -zxvf percona-xtrabackup*.tar.gz rm -f *.tar.gz mv percona-xtrabackup* /usr/local/xtrabackup-2.4 echo "export PATH=/usr/local/xtrabackup-2.4/bin:$PATH" >> ~/.bashrc source ~/.bashrc xtrabackup --version
这里
/path/to/destination
是你想要安装 XtraBackup 的目标目录。##适用于数据库5.7的mysql 若是8.0以上数据库则需要下载8.0版本
四 xtrabackup全库备份和恢复
4.1 创建数据db_one db_two 一个使用myisam引擎和innodb引擎
CREATE TABLE db_two ( stock VARCHAR(255), price INT ) ENGINE = MyISAM; CREATE TABLE db_one ( stock VARCHAR(255), price INT ) ENGINE =INNODB;
INSERT INTO db_two (stock, price) VALUES ('三倍半导体做多', 18), ('三倍科技做多', 51); INSERT INTO db_one (name, com) VALUES ('小明', '中国'), ('华为', '美国');
4.2 准备数据库备份的账号
CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY '123456'; GRANT REPLICATION CLIENT, RELOAD, PROCESS ON *.* TO 'xtrabackup'@'localhost'; FLUSH PRIVILEGES;
'xtrabackup'
是你希望创建的用户名,你可以根据需要更改它。'localhost'
指定该用户只能从本地主机连接。如果你希望从远程主机连接,请替换为相应的主机名或 IP 地址。'123456'
是用户的密码,确保你选择一个强密码。GRANT REPLICATION CLIENT
授予用户REPLICATION CLIENT
权限,使其能够执行主从复制操作。GRANT RELOAD
授予用户RELOAD
权限,以便在备份期间执行FLUSH TABLES WITH READ LOCK
操作。GRANT PROCESS
授予用户PROCESS
权限,以便能够查看正在运行的进程
4.3 备份数据库
mkdir /tmp/xbackup ##创建存储路径 xtrabackup --backup --target-dir=/tmp/xbackup --user=xtrabackup --password=123456
GRANT ALL PRIVILEGES ON *.* TO 'xtrabackup'@'localhost'; FLUSH PRIVILEGES; ##权限问题可以直接给这个用户全部权限 实验状态下
[root@master local]# ll /tmp/xbackup/
总用量 18456
-rw-r----- 1 root root 487 11月 13 17:07 backup-my.cnf
drwxr-x--- 2 root root 110 11月 13 17:07 db_defualt
-rw-r----- 1 root root 1581 11月 13 17:07 ib_buffer_pool
-rw-r----- 1 root root 18874368 11月 13 17:07 ibdata1
-rw-r----- 1 root root 21 11月 13 17:07 xtrabackup_binlog_info
-rw-r----- 1 root root 138 11月 13 17:07 xtrabackup_checkpoints
-rw-r----- 1 root root 520 11月 13 17:07 xtrabackup_info
-rw-r----- 1 root root 2560 11月 13 17:07 xtrabackup_logfilextrabackup --backup --target-dir=/tmp/xbackup/xtra-$(date +"%Y-%m-%d") --user=xtrabackup --password=123456 --apply-log
##第一次执行的命令就是备份前进行备份,但是在备份中的数据就不在了,然后这次使用apply-log参数 用于存储日志
4.4 模拟数据库故障及恢复
rm -rf /var/lib/mysql/data xtrabackup --copy-back --target-dir=/tmp/xbackup/$(date +"%Y-%m-%d") --user=xtrabackup --password=123456 chown -R mysql:mysql /var/lib/mysql/data
五 增量备份
因为xtrabackup是专注数据目录的恢复,所以每次恢复需要直接删除数据目录
增量备份基于已有的全备份(包含所有数据库文件和二进制日志文件)和之前的增量备份
rm -rf /tmp/xbackup
这边使用xtrabackup的封装,相对于xtraback命令更加直接一点
进行完整备份:这会创建数据库的一个基本副本。
innobackupex --user=root --password=123456 /tmp/xbackup
准备把全量备份中数据日志进行整合(就是第一条命令中备份时产生的数据)
[root@master xbackup]# ll 总用量 0 drwxr-x--- 8 root root 286 11月 14 11:01 2023-11-14_11-01-05 [root@master xbackup]# innobackupex --user=root --password=123456 --apply-log --redo-only /tmp/xbackup/2023-11-14_11-01-05/
5.1 向数据库中写入数据
mysql> INSERT INTO db_one (姓名,国家) VALUES ('小明', '中国'), ('华为', '日本');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from db_defualt.db_one
-> ;
+--------+--------+
| 姓名 | 国家 |
+--------+--------+
| 小明 | 中国 |
| 华为 | 美国 |
| 小明 | 中国 |
| 华为 | 日本 |
+--------+--------+
5. 2 做增量备份innobackupex --user=root --password=123456 --backup --incremental /tmp/xbackup --incremental-basedir=/tmp/xbackup/2023-11-14_11-01-05/ ##执行增量备份 基于11-01-05的 innobackupex --user=root --password=123456 --apply-log --redo-only /tmp/xbackup/2023-11-14_11-01-05/ --incremental-dir=/tmp/xbackup/2023-11-14_11-20-13/ ##应用日志到全量备份
5.3 删除数据库
rm -rf /var/lib/mysql/data/*
全量备份恢复
innobackupex --user=root --password=123456 --copy-back /tmp/xbackup/2023-11-14_11-01-05/ chown -R mysql:mysql /var/lib/mysql