MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]

本文主要是介绍MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

  • 最近一直涉猎 MySQL 数据库的操作、集群部署知识
    注意到,为保证数据安全,掌握数据备份是极为重要的
    相比小型服务的冷备份而言
    在此推荐并整理,更受推崇的 XtraBackup 下的热备份技巧

☞ 概念了解 [XtraBackup]

XtraBackup 是一种物理备份工具,通过协议连接到 MySQL 服务端,然后读取并复制底层的文件,完成物理备份

  • 优势

    XtraBackup 备份过程中加读锁,数据可读,但是不可写(分以下情况)
    Innodb 引擎的备份是无阻塞的备份,不会影响表的读写操作
    MyISAML 引擎是要加读锁的,只能读不能写
    XtraBackup 备份过程不会打断正在执行的事务
    XtraBackup 能够基于压缩等功能节约硬盘空间和流量
    XtraBackup 还可以将数据加密,让他更加安全

    官方指导文档 —— 【 Percona XtraBackup-文档】

  • 环境

CentOS7.9	Percona XtraBackup 2.4	MySQL5.7.32

前期准备

1). 下载 Percona-XtraBackup

  • 可以通过 wget 命令在线下载
    也可以在浏览器下载后传到 linux 中 ( 资源链接:【Percona XtraBackup 2.4】)
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar
tar xvf Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar #解压命令
yum localinstall *.rpm #安装命令
  • 查看安装情况: rpm -qa|grep xtrabackup
[root@localhost download]# rpm -qa|grep xtrabackup
percona-xtrabackup-24-2.4.21-1.el7.x86_64
percona-xtrabackup-test-24-2.4.21-1.el7.x86_64
percona-xtrabackup-24-debuginfo-2.4.21-1.el7.x86_64
  • 查看安装目录: rpm -ql percona-xtrabackup-24-2.4.21-1.el7.x86_64
[root@localhost download]#  rpm -ql percona-xtrabackup-24-2.4.21-1.el7.x86_64
/usr/bin/innobackupex #是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup #最主要的备份工具,是用于热备 innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.21
/usr/share/doc/percona-xtrabackup-24-2.4.21/LICENSE
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

2). 创建用于备份的用户

  • 此处,作为入门可以先创建一个最简单的用户, SQL 语句如下:
    (后期,根据自己的实际需求再考虑更安全、完整的用户即可)
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bk_mT007';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

☛ 全量备份、全备恢复还原

全量备份与还原操作,根据实际业务是完全可以分开执行的 (平时做备份,出问题做还原)

▷ 全量备份操作

备份时需启动 MySQL 服务 【percona-xtrabackup2.4 文档 】

  • 此处提供两个 innobackupex 备份指令,可供选择
    对于各参数的解释,请阅读 【附录 - innobackupex 操作参数解释】
    当前操作,我将备份的文件都会存于"/www/server/backUp" 目录下

  • 第一个指令,
    不指定备份文件名称,会生成一个带时间戳的文件名,如:"2021-01-27_19-01-45"
    innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 /www/server/backUp

  • 第二个指令(本文演示使用第二个指令),
    指定了备份文件名称,此处会生成的文件为:"back_data"
    innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 --no-timestamp /www/server/backUp/back_data

  • 正常运行,
    最终会在目录 "/www/server/backUp/back_data" 中,查看到生成的备份数据
    打印信息展示如下:
    (对于各生成文件的解释可参考 【文件功能说明】)

...
210128 11:13:09 [00]        ...done
xtrabackup: Transaction log of lsn (2796124) to (2796169) was copied.
210128 11:13:09 completed OK! # 说明成功运行备份操作[root@localhost backUp]# ll
drwxr-x--- 6 root root    239 128 11:13 back_data[root@localhost backUp]# cd back_data/
[root@localhost back_data]# ll
总用量 12340
-rw-r----- 1 root root      487 128 11:13 backup-my.cnf # 备份用到的配置选项信息文件
-rw-r----- 1 root root      314 128 11:13 ib_buffer_pool
-rw-r----- 1 root root 12582912 128 11:13 ibdata1
drwxr-x--- 2 root root     4096 128 11:13 mysql
drwxr-x--- 2 root root     8192 128 11:13 performance_schema
drwxr-x--- 2 root root     8192 128 11:13 sys
drwxr-x--- 2 root root      102 128 11:13 test_pxc
-rw-r----- 1 root root       26 128 11:13 xtrabackup_binlog_info # 记录的是备份完成的那个时间点的 binlog 位点
-rw-r----- 1 root root      135 128 11:13 xtrabackup_checkpoints # 备份类型、状态和 LSN 信息等
-rw-r----- 1 root root      543 128 11:13 xtrabackup_info # 你备份的时候的一些参数,脚本版本,数据库版本,备份时间等
-rw-r----- 1 root root     2560 128 11:13 xtrabackup_logfile # 备份的日志文件

提示一下 : 至此,全量备份已完成,一般计划任务做到备份就可以咯!

▷ 使用全备恢复还原

其实,一般发现数据出现问题时,才会考虑使用 全量备份恢复还原

1). 拷贝一份现有数据,避免异常

关闭 mysql 服务: service mysql stop

生产环境,为了避免数据备份出差错后的恢复,建议:找到数据库 data 目录,删除数据或拷贝

  • 可在 my.cnf 文件中查看 "datadir" 参数,
    比如我的虚拟机中的配置信息为: "datadir=/var/lib/mysql/data"
    "/var/lib/mysql/data_back" 即为我拷贝到的新位置)
    则执行命令如下:
mv /var/lib/mysql/data /var/lib/mysql/data_back

2). 准备 (prepare) 一个完全备份

为了合并数据,使数据文件处于一致性的状态,回滚没有提交的事务,同步已经提交的事务到数据文件

  • apply-log 执行命令如下:
innobackupex --apply-log /www/server/backUp/back_data

最终会出现类似 "210128 14:40:27 completed OK!" 的打印信息,说明执行正确

3). 从一个完全备份中恢复数据

通过配置文件,copy 备份目录到 mysql 数据目录 (自行处理文件分区等)

  • 恢复数据,将备份数据文件拷贝到原数据目录
innobackupex  --defaults-file=/etc/my.cnf  --copy-back  /www/server/backUp/back_data
  • 此时,可以注意到,数据已恢复

4). 修改数据目录的所有者

当数据恢复至 DATADIR 目录以后,还需要确保所有的数据文件的属主和属组均为正确的用户

  • 这一步很重要:否则,在启动 mysql 之前还需要事先修改数据文件的属主和属组
chown mysql:mysql -R /var/lib/mysql/data

5). 重启 mysql 服务

注意一点,如果是 PXC集群,那么重启命令也可能不同

service mysql start # 普遍的 mysql 启动命令
systemctl start mysql@bootstrap.service # PXC 第一个节点的启动命令

如果,mysql 服务正常启动了,那就说明你的操作是顺利没有问题的咯!

▷ 总结

全库备份与恢复三步曲

a. innobackupex 全量备份,并指定备份目录路径;

b. 在恢复前,需要使用 --apply-log 参数先进行合并数据文件,确保数据的一致性要求;

c. 恢复时,直接使用 --copy-back 参数进行恢复,需要注意的是,在 my.cnf 中要指定数据文件目录的路径


☛ 增量备份、增备恢复还原

【注意】:增量备份仅能应用于 InnoDBXtraDB 表,对于 MyISAM 表而言,执行增量备份时其实进行的是完全备份

  • 【推荐阅读】
	使用 innobackupex 进行增量备份,每个 InnoDB 的页面都会包含一个 LSN 信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是 InnoDB 表可以进行增量备份的基础,即 innobackupex 通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推 ...

▷ 基于当前最新的全量备份

前提是,当下存在前面全量备份的文件哦,以我前面得到的 "back_data" 为例

为了模拟真实环境,此时可以在 mysql 数据库中创建一个表,或增删改动几条数据

  • 此处,指定生成的增量备份文件名为 "/www/server/backUp/inc_back_data"
    注意对参数 "--incremental-basedir" 的指定
    执行命令如下:
innobackupex --defaults-file=/etc/my.cnf --incremental --user=bkpuser --password=bk_mT007 --no-timestamp --incremental-basedir=/www/server/backUp/back_data /www/server/backUp/inc_back_data
  • 可以分别查看备份目录中的 "xtrabackup_checkpoints" 文件
    对于两个文件中各"from_lsn""to_lsn" 等参数的不同
    实际项目中,其实就是因为热备份情况下的数据一直在更新操作!
    得到的列表展示如下:
...
210127 19:15:30 [00]        ...done
xtrabackup: Transaction log of lsn (2796693) to (2796718) was copied.
210127 19:15:30 completed OK![root@localhost backUp]# ll
总用量 56
drwxr-x--- 6 root root   239 127 19:01 back_data # 全量备份的数据
drwxr-x--- 6 root root   265 127 19:15 inc_back_data # 增量备份的数据[root@localhost backUp]# cat back_data/xtrabackup_checkpoints
backup_type = full-backuped 	#备份类型为全量备份
from_lsn = 0 	#lsn 从 0 开始
to_lsn = 2788734 	#lsn 到 2788734 结束
last_lsn = 2788750
compact = 0
recover_binlog_info = 0
flushed_lsn = 2788743	#lsn 刷新的位置[root@localhost backUp]# cat inc_back_data/xtrabackup_checkpoints
backup_type = incremental #备份类型为增量备份
from_lsn = 2788734	#lsn 从 2788734 开始
to_lsn = 2796709	#lsn 到 2796709 结束
last_lsn = 2796718
compact = 0
recover_binlog_info = 0
flushed_lsn = 2796702	#lsn 刷新的位置

注意:

  • 在这种情况下,您可以看到 to_lsn (最后一个检查点 LSN)和 last_lsn(最后一个复制的LSN)之间存在差异,这意味着在备份过程中,服务器上有一些流量 …

【提示】:之后的增量备份操作,都是基于上一次的增量备份,以此类推 …

▷ 增量备份后数据恢复

关闭 mysql 服务: service mysql stop

为了模拟数据损坏,可以删掉原来的数据目录,或者拷贝一份

1). 合并全备数据目录

  • 首先,确保全备数据的一致性
innobackupex --apply-log --redo-only /www/server/backUp/back_data/
  • 将增量备份数据合并到全备数据目录当中
innobackupex --apply-log --redo-only /www/server/backUp/back_data/ --incremental-dir=/www/server/backUp/inc_back_data/
  • 此时可以查看到全量备份的数据的 "xtrabackup_checkpoints" 文件
    其参数"backup_type " 变为了:"log-applied"
    并且 "from_lsn""to_lsn""flushed_lsn " 都会成为最新数据
[root@localhost backUp]# cat back_data/xtrabackup_checkpoints
backup_type = log-applied  #查看到数据备份类型是增加
from_lsn = 0
to_lsn = 2796709
last_lsn = 2796718
compact = 0
recover_binlog_info = 0
flushed_lsn = 2796702

2). 恢复/还原数据

  • 执行 innobackupex --copy-back 指令
innobackupex --copy-back /www/server/backUp/back_data/
  • 修改数据目录的所有者
chown mysql:mysql -R /var/lib/mysql/data
  • 重启 mysql 服务
service mysql start

▷ 总结

增量备份与恢复,还原步骤

(1)增量备份需要使用参数 --incremental 指定需要备份到哪个目录,使用incremental-dir指定全备目录;

(2)进行数据备份时,需要使用参数 --apply-log redo-only 先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数 --incremental-dir 合并到全备数据当中;

(4)最后通过最新的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复


☞ 实际应用 —[定时任务]

一般来说,建议使用计划任务进行备份操作:每周全量备份一次,每天增量备份一次

▷ 全量备份脚本、计划任务

1). 编辑全量备份的脚本

  • 创建脚本
touch back_up.sh
  • 打开脚本并添加全量备份信息如下:
    (在此,我没有使用时间戳,避免太多备份文件,直接指定了一个文件目录)
# !/bin/bash
BACKUP_PATH='/www/server/backUp/back_data'
# 为了避免冲突,先删除文件夹
find ${BACKUP_PATH} -exec rm -rf {} \; > /dev/null 2>&1
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "执行全量热备份 ${time}"
innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 --no-timestamp ${BACKUP_PATH}

【注意】: 脚本文件不要在 windows 环境下编写,最好使用 Linux 下的 vim,以免回车键影响文件出现问号"?"

  • 给予权限
chmod -R 755 back_up.sh 

【提示】: 此时,为测试脚本是否正常执行,可使用指令:"./back_up.sh",试验一下!

2). 计划任务的配置

  • 编写计划任务
crontab -e
  • 此处,为了测试方便,
    我设定了每 3 分钟进行一次备份操作
    并将日志信息打印到 "/www/server/backUp/back_log.log"
*/3 * * * * /www/server/backUp/back_up.sh > /www/server/backUp/back_log.log 2>&1

【提示】:一般建议每周一,进行一次备份,参考:0 0 * * 1,—— 【crontab 将脚本错误写入指定日志文件】

  • crontab 计划任务在添加或修改后,需要保存并重启服务才能生效
systemctl restart crond

▷ 增量备份脚本、计划任务

可以对比上面的步骤,此处不会介绍的太详细 …

  • 创建脚本
touch inc_back_up.sh
  • 打开脚本并添加全量备份信息如下:
    (在此,指定了一个增量备份文件目录:"/www/server/backUp/inc_back_data"
# !/bin/bash
BACKUP_PATH='/www/server/backUp/back_data'
INC_BACKUP_PATH='/www/server/backUp/inc_back_data'
# 为了避免冲突,先删除文件夹
find ${INC_BACKUP_PATH} -exec rm -rf {} \; > /dev/null 2>&1
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "执行增量热备份 ${time}"
innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 --no-timestamp --incremental ${INC_BACKUP_PATH} --incremental-basedir=${BACKUP_PATH} 
innobackupex --apply-log --redo-only ${BACKUP_PATH}
innobackupex --apply-log --redo-only ${BACKUP_PATH} --incremental-dir=${INC_BACKUP_PATH}
  • 给予权限
chmod -R 755 inc_back_up.sh
  • 定时全量热备脚本
crontab -e
  • 为了测试方便,我设定了每 3 分钟进行一次增量备份操作
*/3 * * * * /www/server/backUp/inc_back_up.sh > /www/server/backUp/inc_back_log.log 2>&1

【提示】:一般建议每天,进行一次备份,参考:0 0 * * *

  • 保存并重启 crontab 服务
systemctl restart crond

▷ 总结

注意我对执行脚本中,指令的执行顺序

  • 上面的计划任务操作后,最终演示目录"/www/server/backUp" 下的文件情况:

后期若是选定一台 【从机】进行数据恢复,那么停机、合并全备份数据,还原操作即可 …

  • 毕竟鄙人也是初次接触
    实际生产环境中,可作具体的优化
    比如:在多台从机上配置备份任务,避免不确定哪台服务器宕机等 …

附录

♦ 参考文章

推荐文章 —— 【MySQL入门篇(七)之 Xtrabackup 备份与恢复】

  • 【Mysql 常见报错和疑问汇总】
  • 【xtrabackup 对 pxc 节点进行备份恢复】
  • 【通过innobackupex实现对MySQL的增量备份与还原】
  • 【MySQL 日常维护 - XtraBackup 全量备份】

innobackupex 操作参数解释

参数解释
–defaults-file=/etc/my.cnf指定 mysql 配置文件位置(如果是"/etc/my.cnf"可以不适用此参数,如果使用了必须放在第一个位置)
–datadir=/var/lib/mysql/data指定所要备份的数据目录,不使用,会默认指定 my.cnf 文件中的"datadir"参数配置
–user=bkpuser指定备份用户
–host指定主机
–port指定端口号,默认为 3306
/www/server/backUp自定义,指定备份目录
–no-timestamp不创建时间戳目录
–stream=xbstream开启流式备份,如果开启,则前面的指令写法为:innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 --no-timestamp --stream=xbstream -> /www/server/backup.xbstream
–incremental表示创建一个增量备份,需要指定–incremental-basedir
–incremental-basedir表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与–incremental同时使用
–incremental-dir该选项表示增量备份的目录
  • 其他参数解释,可参考 —— 【innobackupex参数说明】

♦ MySQL 用户操作指令

  • 查看 MySQL 数据库中所有用户
    SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

  • 查看数据库中具体某个用户的权限
    show grants for 'repl_moTzxx'@'192.168.80.224'

  • 删除一个用户 drop user 'repl_moTzxx'@'192.168.80.224'

这篇关于MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039778

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数