背景

最近一直涉猎 MySQL 数据库的操作、集群部署

注意到,为保证数据安全,掌握数据备份是极为重要的

相比小型服务的冷备份而言

在此推荐并整理更受推崇的 XtraBackup 下的热备份技巧

☞ 概念了解 [XtraBackup]

XtraBackup 是一种物理备份工具

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

优势

XtraBackup 备份过程中加读锁,数据可读,但是不可写(分以下情况)

Innodb 引擎的备份是无阻塞的备份,不会影响表的读写操作

MyISAML 引擎是要加读锁的,只能读不能写

XtraBackup 备份过程不会打断正在执行的事务

XtraBackup 能够基于压缩等功能节约硬盘空间和流量

XtraBackup 还可以将数据加密,让他更加安全

环境

CentOS7.9Percona XtraBackup 2.4MySQL5.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 服务

innobackupex 备份指令如下:

innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 /www/server/backUp

参数

解释

–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

正常运行会有如下的打印信息:

最终会在目录 "/www/server/backUp" 中,查看到生成的备份数据

▷ 使用全备恢复还原

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

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/2021-01-26_19-37-59

最终会出现类似 "210126 20:10:45 completed OK!" 的打印信息,说明执行正确

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

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

恢复数据,将备份数据文件拷贝到数据目录

innobackupex --defaults-file=/etc/my.cnf --copy-back /www/server/backUp/2021-01-26_19-37-59

此时,可以注意到,数据已恢复

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

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

这一步很重要:否则,在启动 mysql 之前还需要事先修改数据文件的属主和属组

chown mysql:mysql -R /var/lib/mysql/data

5). 重启 mysql 服务

service mysql start

因为当前,鄙人使用的是 PXC 集群环境,所以状态信息如下:

▷ 总结

■ 全库备份与恢复三步曲

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

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

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

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

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

【推荐阅读】:

使用 innobackupex 进行增量备份,

每个 InnoDB 的页面都会包含一个 LSN 信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。

这正是 InnoDB 表可以进行增量备份的基础,

即 innobackupex 通过备份上次完全备份之后发生改变的页面来实现。

在进行增量备份时,首先要进行一次全量备份,

第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推 ...

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

前提是,当下存在前面全量备份的文件哦,以我前面得到的 "2021-01-27_19-01-45" 为例

执行命令如下:

innobackupex --defaults-file=/etc/my.cnf --user=bkpuser --password=bk_mT007 --incremental /www/server/backUp/ --incremental-basedir=/www/server/backUp/2021-01-27_19-01-45/

可以分别查看备份目录中的 "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 1月 27 19:01 2021-01-27_19-01-45 # 全量备份的数据

drwxr-x--- 6 root root 265 1月 27 19:15 2021-01-27_19-15-26 # 增量备份的数据

[root@localhost backUp]# cat 2021-01-27_19-01-45/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 2021-01-27_19-15-26/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 刷新的位置

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

▷ 增量备份后数据恢复

关闭 mysql 服务: service mysql stop

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

1). 合并全备数据目录

首先,确保全备数据的一致性

innobackupex --apply-log --redo-only /www/server/backUp/2021-01-27_19-01-45/

将增量备份数据合并到全备数据目录当中

innobackupex --apply-log --redo-only /www/server/backUp/2021-01-27_19-01-45/ --incremental-dir=/www/server/backUp/2021-01-27_19-15-26/

此时可以查看到全量备份的数据的 "xtrabackup_checkpoints" 文件

其参数"backup_type " 变为了:"log-applied"

并且 "from_lsn"、"to_lsn"、"flushed_lsn " 都会成为最新数据

[root@localhost backUp]# cat 2021-01-27_19-01-45/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 /www/server/backUp/2021-01-27_19-01-45/

修改数据目录的所有者

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

打开脚本并添加全量备份信息如下:

(在此,我没有使用时间戳,避免太多备份文件,直接指定了一个文件目录"/www/server/backUp/back_data")

# !/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,以免回车键影响文件出现问号"?"

2). 给予脚本权限

给予权限

chmod -R 755 back_up.sh

3). 计划任务的配置

定时全量热备脚本

crontab -e

此处,为了测试方便,我设定了每 3 分钟进行一次备份操作

*/3 * * * * /www/server/backUp/back_up.sh > /www/server/backUp/back_log.log 2>&1

一般建议每周一,进行一次备份即可,参考如下:

0 0 * * 1 /www/server/backUp/back_up.sh > /www/server/backUp/back_log.log 2>&1

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

保存并重启 crontab 服务

systemctl restart crond

▷ 总结

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

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

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

附录

参考文章

本文同步分享在 博客“moTzxx”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

mysql 热备份 数据一致性_MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]相关推荐

  1. solr mysql增量导入_10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

    1.创建MySQL数据 create databasesolr;usesolr;DROP TABLE IF EXISTSstudent;CREATE TABLEstudent ( idchar(10) ...

  2. MySQL数据库之全量+增量+二进制日志的备份与恢复

    一.简介数据的备份与恢复 1.为什么备份? 灾难恢复:人为错误.硬件故障(冗余).软件故障(bug).自然灾害.黑客攻击.误操作.-: 测试: 2.备份时应该注意些什么? 能容忍最多丢失多少数据: 恢 ...

  3. mysqldump全量恢复_【MySQL】全量+增量的备份/恢复

    生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...

  4. 331全量增量数据、同步ld

    -- 数据同步 1 全量数据同步 1.1 不带参数的实现方式 每次更新目标表的时候,先把目标表中的数据清空,然后用源表的数据插入目标表中 . 1.2 通过参数 ,会计期(一个会计期 = 1个月 ,格式 ...

  5. mysql存中文_mysql数据库存储中文数据的解决办法

    我在学习django中admin模块的时候,登录进入后台操作页面,输入中文数据,但保存之后全是乱码(全是"????????????"),然后就开始了解决问题之路. 1.首先百度搜索 ...

  6. Elasticsearch和MySQL数据同步(logstash-input-jdbc)全量增量方式同步近千万数据

    同步方案: 同步读写:最为简单的方式在将数据写到mysql时,同时将数据写到ES,实现数据的双写. 异步双写(MQ方式):MQ的性能基本比mysql高出一个数量级,所以性能可以得到显著的提高. 定时器 ...

  7. xtrabackup全量+增量备份

    xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构: innobackupex:是将xtrabackup进行封装的perl脚本,可 ...

  8. 十年难得一遇!从数据误删到全量恢复的惊险记录

    来自:DBAplus社群 作者介绍 贝壳找房DBA团队,负责支撑起贝壳找房平台的数据库运维及数据库产品的开发工作,努力提供高效.稳定.安全的数据库服务. 引言 线上的数据库服务我们有完善的备份策略和恢 ...

  9. 全量增量数据同步方法(Hive date_add date_sub)

    全量数据与增量数据同步 1.不关心主键: a.第一次直接全量同步: insert overwrite table target select * from source b.第二次以后采用增量同步:表 ...

最新文章

  1. AI解决方案:边缘计算和GPU加速平台
  2. 求e的近似值java_7-78 求e的近似值 (15 分)
  3. 存储过程里面的CASE,WHEN,THEN的用法
  4. JavaScript——易班优课YOOC课群在线测试答案隐藏解决方案
  5. 下一代智能数据工厂,阿里云发布全新DataWorks
  6. C# 向Com口发送数据
  7. .net中模拟键盘和鼠标操作
  8. 在 IE 中使用 Windows 窗体控件
  9. CISCO交换机上实现MAC和端口、IP和端口、IP和MAC的绑定
  10. java简单计算器课程设计_简单计算器JAVA课程设计
  11. Java:项目整体结构分析
  12. Selenium电脑上怎么下载-Selenium下载和安装图文教程[超详细]
  13. XElement.Load 需要释放吗_蚕茧能清洁毛孔吗 蚕茧护肤的正确方法速Get√|蚕茧|清洁-爱美·BEAUTY...
  14. Thinkpad E450c 系统起不来解决方案
  15. 连接Ubuntu 出现 Algorithm Negotiation failed 错误
  16. MySQL连接查询——外连接
  17. Long Short-Term Memory(长短期记忆网络)
  18. 推荐几款不错的 Mac 文字处理器
  19. window 中 PowerShell激活python环境
  20. python实现闰年判断

热门文章

  1. 百万调音师—Audition 压缩效果器
  2. 时间序列分析-2 forecast 、predict
  3. 刘强东:大学打过好几份工 最赚钱的是编程
  4. 缺省值和null值的区别和作用
  5. cimiss java,灾害性天气个例库智能分析系统的设计与实现-气象.PDF
  6. 计算机故障代码ff,电脑DEBUG长代码显示FF故障检修
  7. eclipse介绍与使用
  8. 校园无线网登陆成功,但打开浏览器不能上网怎么办?标签上显示注销页怎么办?
  9. 2.1.4 超声波雷达
  10. 物联网在车联网中的应用