1.xtrabackup
去官网找对应的版本下载
一定要和虚拟机系统版本契合
我的redhat9
bash
[root@bogon ~]# ls
anaconda-ks.cfg percona-xtrabackup-84-8.4.0-5.1.el9.x86_64.rpm
[root@bogon ~]# dnf install percona-xtrabackup-84-8.4.0-5.1.el9.x86_64.rpm -y
[root@bogon ~]# mkdir /backup
1.1创建新用户
模拟真实环境,不用root
bash
mysql> create user 'bkuser'@'localhost' identified with caching_sha2_password by 'Back@123'; #创建用户语句
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON
-> *.* TO 'bkuser'@'localhost'; #授予核心备份权限
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkuser'@'localhost'; #授予 performance_schema.log_status 表的 SELECT 权限
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT ON performance_schema.keyring_component_status TO
-> 'bkuser'@'localhost'; #授予 performance_schema.keyring_component_status 表的 SELECT 权限
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT ON performance_schema.replication_group_members TO
-> 'bkuser'@'localhost'; # 授予 performance_schema.replication_group_members 表的 SELECT 权限
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; #刷新权限
Query OK, 0 rows affected (0.01 sec)
为 MySQL 创建一个专门用于备份的专用账户
bkuser。一个标准的最小化权限账户。
1.2完全备份
bash
[root@bogon ~]# mkdir /backup/xtra -p
[root@bogon ~]# xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtra/base --user=bkuser --password='Back@123'
[root@bogon ~]# ls /backup/xtra/base/
backup-my.cnf ibdata1 performance_schema undo_002 xtrabackup_logfile
binlog.000003 mydb school xtrabackup_binlog_info xtrabackup_tablespaces
binlog.index mysql sys xtrabackup_checkpoints
ib_buffer_pool mysql.ibd undo_001 xtrabackup_info
1.3增量备份
bash
1.#第一次增量
mysql> insert into school.Student values(7,'john','男',22,'电子商务');
Query OK, 1 row affected (0.01 sec)
[root@bogon ~]# xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/incr1/ --incremental-basedir=/backup/xtra/base --user=bkuser --password='Back@123'
2.#第二次增量
mysql> insert into school.Student values(8,'bob','女',21,'英语'),
-> (9,'smith','男',20,'计算机网络');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
[root@bogon ~]# xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/incr2/ --incremental-basedir=/backup/incr1 --user=bkuser --password='Back@123'
1.4模拟数据破坏
bash
mysql> drop database school;
Query OK, 2 rows affected (0.02 sec)
1.5还原过程 & 验证
bash
1.准备完全备份
[root@bogon ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/xtra/base/
2.应用第一次增量备份到完全备份
[root@bogon ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/xtra/base/ --incremental-dir=/backup/incr1/
3.应用第二次增量备份到完全备份
[root@bogon ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/xtra/base/ --incremental-dir=/backup/incr2/
4.
4.1#准备备份
[root@bogon ~]# xtrabackup --prepare --target-dir=/backup/xtra/base/
4.2#停止数据库:因为要覆盖数据文件,MySQL 不能处于运行状态。
[root@bogon ~]# systemctl stop mysqld
4.3#清空旧数据:删除原来的所有数据文件,为恢复做准备。
[root@bogon ~]# rm -rf /var/lib/mysql/*
[root@bogon ~]# ls /var/lib/mysql/
4.4#把整理好的备份文件复制回 /var/lib/mysql/。
[root@bogon ~]# xtrabackup --copy-back --target-dir=/backup/xtra/base/
4.5#确保mysql权限问题
[root@bogon ~]# ll /var/lib/mysql/
total 86044
-rw-r-----. 1 root root 158 Mar 31 15:03 binlog.000005
-rw-r-----. 1 root root 14 Mar 31 15:03 binlog.index
-rw-r-----. 1 root root 3623 Mar 31 15:03 ib_buffer_pool
-rw-r-----. 1 root root 12582912 Mar 31 15:03 ibdata1
-rw-r-----. 1 root root 12582912 Mar 31 15:03 ibtmp1
drwxr-x---. 2 root root 6 Mar 31 15:03 '#innodb_redo'
drwxr-x---. 2 root root 24 Mar 31 15:03 mydb
drwxr-x---. 2 root root 143 Mar 31 15:03 mysql
-rw-r-----. 1 root root 29360128 Mar 31 15:03 mysql.ibd
drwxr-x---. 2 root root 8192 Mar 31 15:03 performance_schema
drwxr-x---. 2 root root 44 Mar 31 15:03 school
drwxr-x---. 2 root root 28 Mar 31 15:03 sys
-rw-r-----. 1 root root 16777216 Mar 31 15:03 undo_001
-rw-r-----. 1 root root 16777216 Mar 31 15:03 undo_002
-rw-r-----. 1 root root 612 Mar 31 15:03 xtrabackup_info
[root@bogon ~]# chown -R mysql: /var/lib/mysql/
[root@bogon ~]# ll /var/lib/mysql/
total 86044
-rw-r-----. 1 mysql mysql 158 Mar 31 15:03 binlog.000005
-rw-r-----. 1 mysql mysql 14 Mar 31 15:03 binlog.index
-rw-r-----. 1 mysql mysql 3623 Mar 31 15:03 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Mar 31 15:03 ibdata1
-rw-r-----. 1 mysql mysql 12582912 Mar 31 15:03 ibtmp1
drwxr-x---. 2 mysql mysql 6 Mar 31 15:03 '#innodb_redo'
drwxr-x---. 2 mysql mysql 24 Mar 31 15:03 mydb
drwxr-x---. 2 mysql mysql 143 Mar 31 15:03 mysql
-rw-r-----. 1 mysql mysql 29360128 Mar 31 15:03 mysql.ibd
drwxr-x---. 2 mysql mysql 8192 Mar 31 15:03 performance_schema
drwxr-x---. 2 mysql mysql 44 Mar 31 15:03 school
drwxr-x---. 2 mysql mysql 28 Mar 31 15:03 sys
-rw-r-----. 1 mysql mysql 16777216 Mar 31 15:03 undo_001
-rw-r-----. 1 mysql mysql 16777216 Mar 31 15:03 undo_002
-rw-r-----. 1 mysql mysql 612 Mar 31 15:03 xtrabackup_info
4.6#重启&&验证
[root@bogon ~]# systemctl start mysqld
mysql> select * from school.Student
-> ;
+----+--------+-----+-----+-----------------+
| no | name | sex | age | dept |
+----+--------+-----+-----+-----------------+
| 1 | 陆亚 | 男 | 24 | 计算机网络 |
| 2 | tom | 男 | 26 | 英语 |
| 3 | 张阳 | 男 | 21 | 物流管理 |
| 4 | alex | 女 | 22 | 电子商务 |
| 7 | john | 男 | 22 | 电子商务 |
| 8 | bob | 女 | 21 | 英语 |
| 9 | smith | 男 | 20 | 计算机网络 |
+----+--------+-----+-----+-----------------+
7 rows in set (0.01 sec)
一定要查看这些文件是不是mysql用户和用户组
因为:MySQL 服务程序是以
mysql这个系统用户的身份在后台运行的。如果文件不属于
mysql用户,MySQL 进程就没有权限去读取、修改或写入这些数据文件,数据库就会启动失败或无法正常工作。所以必须确保所有文件都属于
mysql,这样数据库才能正常读写。
核心区别在于是否应用重做日志(redo log)中的未提交事务:
--apply-log-only
- 作用 :只应用已提交事务的重做日志,不回滚未提交事务。
- 使用场景 :准备增量备份的中间步骤(每次合并增量前都需加此参数)。
- 结果:数据文件处于"部分准备"状态,仍包含未提交事务的脏页。
- 不带
--apply-log-only
- 作用 :应用所有重做日志(包括回滚未提交事务),完全准备数据文件。
- 使用场景:最终准备全量备份(或合并完最后一个增量后)。
- 结果:数据文件完全一致,可立即用于恢复。
简单总结:
- 处理全量备份时,直接用第二个命令(最终准备)。
- 处理增量备份时,中间步骤用第一个命令,最后一步去掉
--apply-log-only完成回滚。