MySQL物理备份实战:冷备、热备与 XtraBackup 应用

来自AI助手的总结
文章介绍了MySQL物理冷备、热备及Xtrabackup增量备份恢复方法。
MySQL物理备份实战:冷备、热备与 XtraBackup 应用

一、物理冷备份

冷备份其实就是停掉数据库服务,cp数据文件的方法;这种方法对MyISAM和InnoDB存储引擎都合适,但是一般很少使用,

因为很多应用是不允许长时间停机的。

  • 进行备份的操作过程:

停掉MySQL服务,在操作系统级别备份MySQL的数据文件和日志文件到备份目录;

  • 进行恢复的操作过程:

停掉MySQL服务,在操作系统级别恢复MySQL的数据文件,然后重启MySQL服务,使用mysqlbinlog工具恢复增量数据日志;

二、物理热备份

在MySQL中,对于不同的存储引擎热备份方法也有所不同,下面主要介绍MyISAM和InnoDB两种最常用的存储引擎的热备份方法;

2.1 数据库存储引擎应用:MyISAM

MyISAM存储引擎的热备份有很多方法,本质其实就是将要备份的表加读锁,然后再cp数据文件到备份目录:

方法一:使用mysqlhotcopy工具

mysqlhotcopy是MySQL自带的一个热备份工具,使用方法很简单:


[root@master ~]# mysqlhotcopy db_name [/path/to/new_directory]

-- mysqlhotcopy有很多选项,具体可以使用--help查看帮助信息;

参考官方链接说明:https://dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html

方法二:手工锁表copy

在mysqlhotcopy使用不熟悉的情况下,可以手工来做热备份,操作步骤如下:


# 对数据库中所有表加读锁:

mysql> flush tables for read;

-- 然后cp数据文件到备份目录即可;

2.2 数据库存储引擎应用:InnoDB

ibbackup是Innobase公司的一个热备份工具,专门对InnoDB存储引擎进行物理热备份,此工具是收费的,但可以免费使用1个月;

Innobase公司已经于2005年被Oracle公司所收购。

使用ibbackup备份工具的备份步骤简要说明:

01 编辑用于启动的配置文件my.cnf和用于备份的配置backup-my.cnf

# 配置文件配置参考:my.cnf
[mysqld]
datadir=/data/3306/data
innodb_data_home_dir=/data/3306/data
innodb_data_file_path=ibdata1:100M;ibdata2:200M;ibdata3:500M:autoextend
innodb_log_group_home_dir=/data/3306/data
set-variable=innodb_log_files_in_group=2
set-variable=innodb_log_file_size=20M
# 配置文件配置参考:backup-my.cnf
[mysqld]
datadir=/data/3306/backup
innodb_data_home_dir=/data/3306/backup
innodb_data_file_path=ibdata1:100M;ibdata2:200M;ibdata3:500M:autoextend
innodb_log_group_home_dir=/data/3306/backup
set-variable=innodb_log_files_in_group=2
set-variable=innodb_log_file_size=20M

02 实现数据文件信息热备过程:


-- ibbackup工具不会覆盖任何重名的文件,因此在新的备份开始之前,需要确保备份目录中没有重名文件,否则备份可能会失败

[root@master ~]# ibbackup /data/3306/my.cnf /data/3306/backup-my.cnf

... 省略部分信息...

-- 备份成功后,备份目录下包含有数据文件和日志文件等相关数据信息;

[root@master ~]# ll /data/3306/backup

Xtrabackup(PXB)是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,属于物理备份数据工具;

具有开源、免费、支持在线热备、备份恢复速度快、占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。

官方软件下载链接:https://www.percona.com/downloads/

对于数据库8.0.20版本,需要使用PXB 8.0.12+以上版本,对于数据库8.0.11~8.0.19,可以使用PXB 8.0正式版本;

PXB 8.0只能备份MySQL 8.0版本数据,不能备份低版本数据信息;如果想备份数据库服务低版本程序数据,需要下载使用PXB 2.4版本;

xtrabackup包含两个主要的工具:xtrabackup和innobackupex

  • xtrabackup 只能备份InnoDB和XtraDB两种类型的数据表,而不能备份MyISAM类型数据表;

  • innobackupex 是一个封装了xtrabackup的perl脚本,支持同时备份InnoDB和MyISAM,但对MyISAM备份时需要加全局读锁;

由于PXB属于第三方软件工具程序,因此需要进行单独下载安装:


# 进行软件程序上传

[root@master ~]# cd /usr/local/

[root@master local]# rz -y

[root@master local]# ll percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm

-r-------- 1 root root 13097340 11月 27 02:08 percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm

-- 利用yum方式安装本地的rpm包程序,可以有效解决软件依赖的问题;

# 进行软件程序安装

[root@master local]# yum install -y percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm

-- 验证

[root@master local]# which xtrabackup

/usr/bin/xtrabackup

Xtrabackup(PXB)属于物理备份工具(针对数据文件进行备份),具体备份逻辑如下:(支持增量备份数据)

  • 在数据库服务运行期间,通过拷贝数据文件(实质拷贝的是数据页),进而实现数据备份目的;

  • 在进行数据文件拷贝的同时,会将备份期间的变化redo日志信息同时进行备份(拷贝);

Xtrabackup(PXB)属于物理备份工具(针对数据文件进行备份),具体恢复逻辑如下:

  • 在进行数据恢复时,模拟了InnoDB Crash recovery(CR)的运行过程,需要将备份进行处理,才能进行数据恢复;

  • 在进行数据恢复时,对于备份进行处理操作,特指的就是前滚操作(redo)和回滚操作(undo),从而解决数据恢复一致性问题;

Xtrabackup数据备份方式01:实现全量备份


# 全量备份操作:

-- 进行物理备份的目标目录不能存在数据信息,需要指定一个空目录进行备份

[root@master ~]# mkdir /data/backup/full -p

-- backup参数信息表示进行全备操作

[root@master ~]# xtrabackup --defaults-file=/data/3306/data/my.cnf --host=10.0.0.51 --user=root --password=123456 --port=3306 --backup  --target-dir=/data/backup/full

或者使用参数--datadir替换掉参数--defaults-file

[root@master ~]# xtrabackup --datadir=/data/3306/data  --user=root --password=123456 --port=3306 --backup --target-dir=/data/backup/full

# 物理备份命令执行输出信息说明:

221127 02:46:11 >> log scanned up to (277574297)

-- 记录日志位置点信息,表示进行拷贝数据的checkpoint的SN号码,相当于磁盘当前数据页的SN号码;

Using undo tablespace './undo_001'.

Using undo tablespace './undo_002'.

Opened 2 existing undo tablespaces.

221127 02:46:11 [01] Copying ./ibdata1 to /data/backup/full/ibdata1

221127 02:46:11 [01]        ...done

221127 02:46:11 [01] Copying ./sys/sys_config.ibd to /data/backup/full/sys/sys_config.ibd

221127 02:46:11 [01]        ...done

221127 02:46:11 [01] Copying ./mysql.ibd to /data/backup/full/mysql.ibd

... 省略部分信息...

-- 进行相关数据文件、日志文件、共享表空间文件、数据表空间文件等文件的拷贝,并且拷贝过程是不会进行锁表操作的;

-- 数据表空间信息备份完毕后,会有提示字段信息,并且此时会锁定binlog日志文件,并将binlog日志文件复制到备份目录;

-- 在进行binlog日志文件备份时,会生成xtrabackup_binlog_info文件信息,用于记录物理备份后的二进制日志位置点;

-- 二进制日志文件备份完毕后,会释放binlog日志文件锁定状态,并再次检查checkpoint的SN号码,确认redo日志是否变化;

-- 可以看到将原有数据库的数据目录信息,已经基本迁移到指定的物理备份目录中;

[root@master backup]# ll /data/backup/full/

Xtrabackup数据备份工具在热备操作后产生的特殊数据文件说明:

序号 文件名称 解释说明
01 xtrabackup_binlog_info 表示用于存储备份时的binlog位置点信息
02 xtrabackup_checkpoints 表示用于记录备份时的数据页LSN信息,主要用于接下一次备份,需要保证连续性;
03 xtrabackup_info 表示整体物理备份信息的总览
04 xtrabackup_logfile 表示存储在备份数据期间产生的新的的redo日志的信息;
05 xtrabackup_tablespaces 表示用于存储表空间的其余信息

Xtrabackup数据恢复方式01:全量备份恢复

当数据库数据破坏后进行恢复时,需要注意的几点地方:

  • 1)/data目录下所有的目录和文件所属者都被修改为root,需要手动执行chown -R mysql.mysql /data/*命令进行修改

  • 2)如果配置文件也存放在/data目录下,删除后无法进行恢复,需要提前进行备份保存。最好提前做好配置文件和数据进行分离

  • 3)/data/3306/logs/目录下所有日志文件都会被清理,如果有需要,需要提前进行备份操作

模拟进行数据库数据破坏性操作:

[root@master ~]# pkill mysqld
[root@master ~]# rm -rf /data/3306/data/*
[root@master ~]# rm -rf /data/3306/logs/*
[root@master ~]# rm -rf /data/3306/binlog/*

进行数据库数据恢复的操作过程:


-- 表示模拟CR过程,将redo日志进行前滚,undo日志进行回滚,让恢复数据信息保持一致性状态

[root@master ~]# xtrabackup --prepare --target-dir=/data/backup/full

...忽略部分信息...

Shutdown completed; log sequence number 19214860

221127 16:31:58 completed OK!

-- 将进行物理备份后的数据,再次进行还原恢复到备份前的目录中(拷贝回数据)

[root@master ~]# xtrabackup --copy-back  --target-dir=/data/backup/full

-- 重新设置数据目录权限,并重新启动恢复数据库业务

[root@master ~]# chown -R mysql.mysql /data/*

[root@master ~]# /etc/init.d/mysqld start

Xtrabackup数据备份方式02:实现增量备份

xtrabackup物理备份数据时,实现增量备份原理分析:

  • 增量备份的实质是,基于上一次备份LSN变化过的数据页,进行相应的备份操作,从而可以不断实现增量备份操作;

  • 在备份同时产生的新的变更,会将redo日志信息备份;

  • 第一次增量备份时依赖于全量备份的,将来的恢复操作也要合并到全备中,再进行统一恢复;

说明:利用XPK增量备份数据,主要目的是减少频繁全备数据的时间开销,可以将每天增量的数据进行更快速的备份

Day009-数据库服务日志文件管理-图4


# 增量备份准备:

-- 提前准备好全量备份的目录;

[root@master ~]# mkdir /data/backup/full -p

-- 提前准备好增量备份的目录;

[root@master ~]# mkdir /data/backup/inc -p

# 进行备份操作:

-- 进行全量备份操作,并且开启并发线程备份功能(--parallel=4),从而提高备份效率(建议4~8个)

[root@master ~]# xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-dir=/data/backup/full

-- 模拟登陆数据库,进行相关操作,实现增量备份的效果

mysql> create database pxb;

mysql> use pxb

mysql> create table t1(id int);

mysql> insert into t1 values(1),(2),(3);

mysql> commit;

-- 进行增量备份操作

[root@master ~]# xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-dir=/data/backup/inc --incremental-basedir=/data/backup/full

# 可以进行继续备份操作(了解)

-- 提前准备好增量备份的增量备份目录;

[root@master ~]# mkdir /data/backup/inc02 -p

-- 模拟登陆数据库,进行相关操作,实现增量备份的效果

mysql> create database pxb02;

mysql> use pxb02

mysql> create table t1(id int);

mysql> insert into t1 values(1),(2),(3);

mysql> commit;

-- 进行增量备份操作的下一次增量备份

[root@master ~]# xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-dir=/data/backup/inc02 --incremental-basedir=/data/backup/inc

Xtrabackup数据恢复方式02:增量备份恢复

模拟进行数据库数据破坏性操作:

[root@master ~]# pkill mysqld
[root@master ~]# rm -rf /data/3306/data/*
[root@master ~]# rm -rf /data/3306/logs/*
[root@master ~]# rm -rf /data/3306/binlog/*

进行数据库数据恢复的操作过程:


# 准备相关备份日志信息

-- 准备全量备份的日志;

[root@master ~]# xtrabackup --prepare  --apply-log-only  --target-dir=/data/backup/full

-- 准备增量备份的日志,并且将增量备份合并到全量备份中;如果后面还有增量数据继续合并到全量备份中,比如再将/data/backup/inc02目录下面的数据合并到/data/backup/full目录当中xtrabackup --prepare  --apply-log-only  --target-dir=/data/backup/full --incremental-dir=/data/backup/inc02

[root@master ~]# xtrabackup --prepare  --apply-log-only  --target-dir=/data/backup/full --incremental-dir=/data/backup/inc

-- 在全量和增量数据合并后,在整体做日志信息的准备;

[root@master ~]# xtrabackup --prepare  --target-dir=/data/backup/full

# 进行数据备份拷回操作

-- 将进行物理备份后的数据,再次进行还原恢复到备份前的目录中(拷贝回数据)

[root@master ~]# xtrabackup --datadir=/data/3306/data --copy-back  --target-dir=/data/backup/full

或者

[root@master ~]# xtrabackup  --copy-back  --target-dir=/data/backup/full

# 重新启动恢复业务功能

-- 重新设置数据目录权限,并重新启动恢复数据库业务

[root@master ~]# chown -R mysql.mysql /data/*

[root@master ~]# /etc/init.d/mysqld start

官方参数参考链接:https://docs.percona.com/percona-xtrabackup/8.4/xtrabackup-option-reference.html?h=apply+log#apply-log-only

相关参数说明:

  • –apply-log-only:在恢复数据过程中,不加载undo文件内容,保证数据恢复一致性
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容