【Xtrabackup】Xtrabackup全备、增量备份及恢复示例

发布时间 2024-01-03 21:57:00作者: 技术颜良

 

https://www.modb.pro/db/43686

 

https://cloud.tencent.com/developer/article/1783831

一、全库备份与恢复

备份时需要启动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点这段时间的数据并不会得到恢复