Xtrabackup全备、增量备份及恢复示例
https://www.modb.pro/db/43686
https://cloud.tencent.com/developer/article/1783831 #没时间戳
https://cloud.tencent.com/developer/article/1441289 #脚本
一、全库备份与恢复
备份时需要启动MySQL,恢复时需要关闭MySQL,清空MySQL数据目录且不能重新初始化。
1.执行备份
# mkdir -p /xtrabackup/full
# innobackupex --socket=/usr/local/mysql/data/mysql.sock --user=root --password='P@ssw0rd' /xtrabackup/full
2.查看备份文件夹内容
# pwd
/xtrabackup/full/2021-01-06_14-27-09
# ls -l
backup-my.cnf #备份用到的配置选项文件
ib_buffer_pool
ibdata1 #数据文件
mysql
performance_schema
sys
xtrabackup_binlog_info #MySQL服务器当前使用的binlog
xtrabackup_checkpoints #备份的类型、状态
xtrabackup_info
xtrabackup_logfile #备份的日志文件
3.执行恢复
恢复可以恢复到本机或其他机器,执行步骤如下:
1)停止数据库
# service mysqld stop
2)清理数据文件
# rm -rf /usr/local/mysql/data/
3)重演回滚(回滚日志文件,恢复数据文件)
-- 回滚日志
# innobackupex --apply-log /xtrabackup/full/2021-01-06_14-27-09/
-- 恢复数据文件
# innobackupex --copy-back /xtrabackup/full/2021-01-06_14-27-09/
4)修改权限
# chown -R mysql:mysql /usr/local/mysql/data
5)启动数据库
# systemctl start mysqld
二、增量备份恢复
在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。
1.数据验证准备
mysql> create database test_db;
mysql> use test_db;
mysql> create table test_tab(id int);
-- 插入“1”
mysql> insert into test_tab values(1);
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
2.执行完全备份
# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock /xtrabackup
3.插入数据“2”
mysql> insert into test_tab values(2);
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
4.执行增量备份
# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-01-06_15-33-55
注:
--incremental: 增量备份存放路径
--incremental-basedir: 基于哪个目录增量
5.插入数据“3”
mysql> insert into test_tab values(3);
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
6.再次执行增量备份
# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-01-06_15-41-53
注:由于这里是第二次增量备份,那么--incremental-basedir的指向应为第一次增量备份的路径
7.查看增量的备份
# cd /xtrabackup/increment/
# ls -lrt
2021-01-06_15-33-55
2021-01-06_15-41-53
2021-01-06_15-49-48
其中,第一个目录为全量备份,第二、三个目录分别为第一次增量和第二次增量的备份。注意第二次增量备份是针对第一次增量的。
8.增量的恢复
1)停止数据库
# ps -ef|grep mysql
# service mysqld stop
2)清理数据文件
# rm -rf /usr/local/mysql/data
3)依次重演回滚redo log(恢复数据)
# innobackupex --apply-log --redo-only /xtrabackup/2021-01-06_15-33-55/
# innobackupex --apply-log --redo-only /xtrabackup/2021-01-06_15-33-55/ --incremental-dir=/xtrabackup/2021-01-06_15-41-53/
# innobackupex --apply-log --redo-only /xtrabackup/2021-01-06_15-33-55/ --incremental-dir=/xtrabackup/2021-01-06_15-49-48/
注:--apply-log --redo-only用于合并全备目录数据,确保数据的一致性
--apply-log --redo-only --incremental-dir用于将全备和增量备份数据目录进行合并,合并到全备目录中
2021-01-06_15-33-55为全备的目录
2021-01-06_15-41-53为第一次增量备份的目录
2021-01-06_15-49-48为第二次增量备份的目录
恢复数据文件
# innobackupex --copy-back /xtrabackup/2021-01-06_15-33-55/
注:数据文件的备份位于第一次全量备份的路径下
4)修改权限
# chown -R mysql:mysql /usr/local/mysql/data
5)启动数据库
# service mysqld start
6)验证数据
mysql> use test_db;
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
三、差异增量备份
差异增量备份需要先执行一个全量备份,后面的每一个增量备份都是针对全量的,而不是针对上一次增量。所以在恢复时,只需要使用最后一次的增量就行。
1.数据验证准备
mysql> create database test_db;
mysql> use test_db;
mysql> create table test_tab(id int);
-- 插入“1”
mysql> insert into test_tab values(1);
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
2.执行完全备份
# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock /xtrabackup
3.插入数据“2”
mysql> insert into test_tab values(2);
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
4.执行差异备份(基于全备)
# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-01-08_10-34-36
注: 2021-01-08_10-34-36为全备目录
5.插入数据“3”
mysql> insert into test_tab values(3);
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
6.再次差异增量备份(基于全备)
(命令与上一次增量备份一模一样)
# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-01-08_10-34-36
注: 2021-01-08_10-34-36为全备目录
7.查看增量的备份
# cd /xtrabackup/increment/
# ls -lrt
2021-01-08_10-34-36
2021-01-08_10-39-28
2021-01-08_10-42-53
其中,第一个目录为全量备份,第二、三个目录分别为第一次增量和第二次增量的备份,注意两次增量的备份都是针对全量的。
8.增量的恢复
1)停止数据库
# ps -ef|grep mysql
# service mysqld stop
2)清理数据文件
# rm -rf /usr/local/mysql/data
3)重演回滚redo log(恢复数据)
# innobackupex --apply-log --redo-only /xtrabackup/2021-01-08_10-34-36/
# innobackupex --apply-log --redo-only /xtrabackup/2021-01-08_10-34-36/ --incremental-dir=/xtrabackup/2021-01-08_10-42-53/
注:--apply-log --redo-only用于合并全备目录数据,确保数据的一致性
--apply-log --redo-only --incremental-dir用于将全备和增量备份数据目录进行合并,合并到全备目录中
2021-01-08_10-34-36为全备的目录
2021-01-08_10-42-53为最后一次增量备份的目录
恢复数据文件
# innobackupex --copy-back /xtrabackup/2021-01-08_10-34-36/
注:数据文件的备份位于第一次全量备份的路径下
4)修改权限
# chown -R mysql:mysql /usr/local/mysql/data
5)启动数据库
# service mysqld start
6)验证数据
mysql> use test_db;
mysql> select * from test_tab;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
最后需要注意一下,我们上面示例的三种备份方式,都只是恢复到了备份那个时间点,并没有通过binlog恢复到最近的位置。比如我们在昨晚11点做了全备或增量备份,早上9点时出了故障,我们通过以上方式也只能恢复到昨晚11点的备份时间。11点-9点这段时间的数据并不会得到恢复
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2021-01-03 centos7升级内核
2021-01-03 Linux sync命令
2021-01-03 生产环境中的Kubernetes
2021-01-03 https://www.jianshu.com/p/f1e7a1630c64
2020-01-03 shell web状态监测
2018-01-03 diff目录或文件比较