跳转至

MySQL备份2 ----- 物理备份

一. 使用xtrabackup8.4对MySQL8.4进行物理备份

1. 安装xtrabackup

[root@4 ~]# ls
anaconda-ks.cfg  percona-xtrabackup-84.zip
[root@4 ~]# mount /dev/sr0 /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.
[root@4 ~]# unzip  percona-xtrabackup-84.zip
Archive:  percona-xtrabackup-84.zip
   creating: percona-xtrabackup-84/
  inflating: percona-xtrabackup-84/percona-telemetry-agent-1.0.1-1.el9.x86_64.rpm  
  inflating: percona-xtrabackup-84/percona-xtrabackup-84-8.4.0-1.1.el9.x86_64.rpm  
  inflating: percona-xtrabackup-84/percona-xtrabackup-84-debuginfo-8.4.0-1.1.el9.x86_64.rpm  
  inflating: percona-xtrabackup-84/percona-xtrabackup-84-debugsource-8.4.0-1.1.el9.x86_64.rpm  
  inflating: percona-xtrabackup-84/percona-xtrabackup-test-84-8.4.0-1.1.el9.x86_64.rpm  
[root@4 ~]# cd percona-xtrabackup-84
[root@4 percona-xtrabackup-84]# dnf -y install percona-xtrabackup-84-8.4.0-1.1.el9.x86_64.rpm

3. 备份原理的实现

对于Innodb引擎备份过程

在备份开始的时候(10:00开始,10:02备份结束)立即出发checkpoint动作,将内存数据页刷写到磁盘。

拷贝次数所有的数据文件(LSN=1000),再次过程中产生的日志文件(LSN=1000),在此过程中产生的日志文件(to_lsn=1000 redo lats_lsn=1020和undo)也信息备份数据页面+日志

热备份:备份某个时间点的数据,将北方过程中产生的变化也备份出来

4. 备份命令简单实用和备份内容介绍

[root@4 percona-xtrabackup-84]# xtrabackup --user=root --password=Abcd1234 --backup --target-dir=/backup
[root@4 percona-xtrabackup-84]# cd /backup/ && ls               #进入到备份好的的文件中
backup-my.cnf   ibdata1             sys       uuu                     xtrabackup_logfile
binlog.000007   mysql               test      xtrabackup_binlog_info  xtrabackup_tablespaces
binlog.index    mysql.ibd           undo_001  xtrabackup_checkpoints
ib_buffer_pool  performance_schema  undo_002  xtrabackup_info
[root@4 backup]# cat /backup/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 22474647
last_lsn = 22474647
flushed_lsn = 22474647
redo_memory = 0
redo_frames = 0

# backup-my.cnf: 包含备份数据库的如下信息:innodb的一些配置信息、数据库的server ID、数据库的服务器UUID、master key id(安全相关)

# xtrabackup_binlog_info: 其记录了备份完成时binlog的位置和GTID信息,用于复制的搭建

# xtrabackup_ckeckpoints: 该文件对于后续的增量备份有用

backup_type = full-backuped # 备份类型:全备份

from_lsn = 0 # 备份中包含的事务日志序列号的起点

to_lsn = 22474647 # 操作保存时的事务日志序列号的结束点

last_lsn = 22474647 # 备份结束时的事务日志系列号,下次增量备份的起始位置,这里的数值会自动增加9 flushed_lsn = 22474647 # 刷新的LSN点

二. 利用xtrabackup进行全备份及恢复

1. 全备份

[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup --target-dir=/backup/full
[root@4 ~]# ls /backup/full
backup-my.cnf  ib_buffer_pool  mysql.ibd           test      uuu                     xtrabackup_info
binlog.000010  ibdata1         performance_schema  undo_001  xtrabackup_binlog_info  xtrabackup_logfile
binlog.index   mysql           sys                 undo_002  xtrabackup_checkpoints  xtrabackup_tablespaces

2. 恢复全备份

Ⅰ. 前提

恢复的路径(为MySQL数据文件所在的目录)必须是空的,MySQL不需要启动

Ⅱ. 停止数据库

[root@4 ~]# systemctl kill mysqld

Ⅲ. 删除数据

[root@4 ~]# ls /data/mysql/data/
 auto.cnf         '#ib_16384_0.dblwr'  '#innodb_temp'           private_key.pem   test
 ca-key.pem       '#ib_16384_1.dblwr'   mysql                   public_key.pem    undo_001
 ca.pem            ib_buffer_pool       mysql.ibd               server-cert.pem   undo_002
 client-cert.pem   ibdata1              mysql_upgrade_history   server-key.pem    uuu
 client-key.pem   '#innodb_redo'        performance_schema      sys
[root@4 ~]# rm -rf /data/mysql/data/*
[root@4 ~]# ls /data/mysql/data/

Ⅳ. 准备备份恢复(使用redo前滚,使用undo回滚,保证数据一致性)

[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full
[root@4 ~]# xtrabackup --prepare --target-dir=/backup/full
[root@4 ~]# rm -rf /backup/full/binlog*

Ⅴ. 恢复数据

模拟数据故障

将数据全部删除[root@4 ~]# rm -rf /data/mysql/data/*

Ⅵ. 恢复数据

[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --port=3306 --datadir=/data/mysql/data --copy-back --target-dir=/backup/full

此方法依赖于/etc/my.cnf

Ⅶ. 修改权限启动数据库服务

[root@4 ~]# chown -R mysql.mysql /data/mysql/data/*
[root@4 ~]# systemctl start mysqld

三. 利用xtrabackup进行全备份、增量备份以及恢复

1. 增量备份介绍

增量备份只备份从上一次备份以来发生变化的数据,而不是每次都拷贝全部数据。优点是节省磁盘空间和备份时间。

2. 增量备份的链条关系

每次增量备份都依赖它前面的那次备份。例如:

周日:全备份(A)     ← 基础,不依赖任何备份
周一:增量备份(B)   ← 依赖 A,记录周日→周一的变化
周二:增量备份(C)   ← 依赖 B,记录周一→周二的变化

恢复顺序必须为: 先恢复 A → 把 B 合并到 A → 把 C 合并到 A,缺任何一环都无法恢复。这就是"依赖于全备份和上一次备份"的意思。

每次备份都会记录一个 LSN(日志序列号)范围,保证备份之间的数据是连续的、可衔接的。

3. XBK(XtraBackup)的增量恢复方式

XBK 工具本身不能直接用增量备份来恢复。正确做法是:

# 1. 先把全备份做 prepare(预备)
xtrabackup --prepare --apply-log-only --target-dir=/backup/full

# 2. 把增量备份合并(apply)到全备份中
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1

# 3. 再用合并后的全备份去恢复
xtrabackup --copy-back --target-dir=/backup/full

简记:增量不能直接用,必须先合并到全备份,再用全备份恢复。

4. 增量备份策略的设计与实现

备份策略:每周日全备份,周一到周六是增量备份

(1). 周日全备份

[root@4 ~]# rm -rf /backup/*
[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup --target-dir=/backup/full

(2). 模拟数据改变

# 1. 先进入数据库
[root@4 ~]# mysql -uroot -p
Enter password: 
-- 2. 创建数据库
mysql> create database full charset utf8mb4;
Query OK, 1 row affected, 1 warning (0.00 sec)
-- 3. 进入数据库并创建表t1
mysql> use full;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.00 sec)
-- 4. 在t1表中加入数据
mysql> insert into t1 values(1),(2),(3);
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0
-- 5. 提交数据
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> \q
Bye

(3). 周一的增量备份

[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup\
>  --target-dir=/backup/inc1 --incremental-basedir=/backup/full

(4). 周二数据模拟

[root@4 ~]# mysql -uroot -pAbcd1234

mysql> create database inc1 charset utf8mb4;
Query OK, 1 row affected (0.00 sec)

mysql> use inc1;
Database changed
mysql> create table t2(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

(5). 周二的增量备份

[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --backup \
>  --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

(6). 查看备份信息

[root@4 ~]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 22706065
last_lsn = 22706065
flushed_lsn = 22706065
redo_memory = 0
redo_frames = 0
[root@4 ~]# cat /backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 22706065
to_lsn = 22737561
last_lsn = 22737561
flushed_lsn = 22737561
redo_memory = 0
redo_frames = 0
[root@4 ~]# cat /backup/inc2/xtrabackup_checkpoints
[root@4 ~]# cat /backup/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 22737561
to_lsn = 22754110
last_lsn = 22754110
flushed_lsn = 22754110
redo_memory = 0
redo_frames = 0

5. 全备份与增量备份的恢复

a. 准备备份

备份完成后我们得到了非一致性的备份文件

即需要对未提交的事务进行回滚以及对提交的事务进行前滚

这个过程在xtrabackup中叫做准备阶段(prepare stage)

只有这个阶段完成后该备份文件才可以被使用

第一次全备份、第一次增量备份、第二次增量备份三次备份我们同意可以使用--aply-log进行恢复动作,相当于Oracle的recover动作

我们需要以此进行prepare,即按照如下步骤进行:

prepare第一次全备份

prepare第一次增量备份

prepare第二次增量备份还有需要

其中需要注意的是和prepare全备份不一样,除了最后一步,我们都需要在备份时候加上--apply-log-only

该参数使prepare支队commit过的语句进行提交,而不是回滚未提交的语句,这样做是为了能够继续prepare

如果没有加上--apply-log-only则prepare过的数据文件为一致转繁体,无法继续prepare

如果有内存空闲,可以使用--use-memory加快速度

合并备份

# 第1步:prepare 全备份
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full

# 第2步:合并 inc1
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1

# 第3步:合并 inc2(★ 也加 --apply-log-only)
[root@4 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc2

# 第4步:最终化全备份(★ 不加 --apply-log-only)
[root@4 ~]# xtrabackup --prepare --target-dir=/backup/full
# 查看恢复准备的备份信息
[root@4 ~]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 22754110
last_lsn = 22754110
flushed_lsn = 22754110
redo_memory = 0
redo_frames = 0

# 注:为什么最后一步不加?

加了 --apply-log-only → 只应用已提交事务,不回滚未提交的,方便后续继续合并增量

不加(最后一步)→ 既应用已提交的,也回滚未提交的,数据变成最终一致状态,不能再合并增量的

b. 模拟故障

[root@4 ~]# systemctl kill mysqld
[root@4 ~]# ss -tuanp|grep 3306
[root@4 ~]# rm -rf /data/mysql/data/*
[root@4 ~]# ls /data/mysql/data/*
[root@4 ~]# rm -rf /data/mysql/log/*

c. 恢复

[root@4 ~]# xtrabackup --user=root --password=Abcd1234 --port=3306\
>  --datadir=/data/mysql/data --copy-back --target-dir=/backup/full
#此方法依赖于/etc/my.cnf
[root@4 ~]# chown -R mysql.mysql /data/mysql/data/*
[root@4 ~]# systemctl start mysqld
#修改权限,并重启数据库服务

四. xtrabackup全备份+增量备份故障案例演练