MySQL备份还原方法1----xtrabackup

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)中的未提交事务

  1. --apply-log-only
    • 作用 :只应用已提交事务的重做日志,不回滚未提交事务。
    • 使用场景 :准备增量备份的中间步骤(每次合并增量前都需加此参数)。
    • 结果:数据文件处于"部分准备"状态,仍包含未提交事务的脏页。
  2. 不带 --apply-log-only
    • 作用 :应用所有重做日志(包括回滚未提交事务),完全准备数据文件。
    • 使用场景:最终准备全量备份(或合并完最后一个增量后)。
    • 结果:数据文件完全一致,可立即用于恢复。

简单总结

  • 处理全量备份时,直接用第二个命令(最终准备)。
  • 处理增量备份时,中间步骤用第一个命令,最后一步去掉 --apply-log-only 完成回滚。
相关推荐
Redemption2 小时前
嵌软面试每日一阅----Linux驱动之字符设备驱动
linux·面试·职场和发展
赵民勇2 小时前
Linux桌面/usr/share/menu目录详解
linux
charlie1145141912 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(5):调试进阶篇 —— 从 printf 到完整 GDB 调试环境
linux·c++·单片机·学习·嵌入式·c
一根狗尾巴草2 小时前
【Linux】linux软链接硬链接区别
linux·运维·服务器
wang09072 小时前
Linux性能优化之CPU利用率
java·linux·运维
双翌视觉2 小时前
基于机器视觉实现开口卡簧自动化装配
运维·数码相机·自动化
浪潮IT馆2 小时前
WSL2 + Docker Desktop 部署 Dify
运维·docker·容器
梦年华12 小时前
Dell 避风港实验环境部署(四)CyberRecovery配置与恢复演练
linux·运维·centos
大卡片2 小时前
环境变量配置
linux