MySQL 备份恢复(四)

Wesley13
• 阅读 703

MySQL 备份恢复(四)

MySQL 备份恢复(四)

前面三篇已经介绍了 MySQL 备份相关的原理与方法,要是还没有来得及看的可以戳此查看『MySQL 备份恢复(三)』,那么今天就接着继续谈谈备份恢复相关内容之 Xtrabackup 的原理、安装与使用,备份恢复最后一篇,文章不是有点长,而是很长,请耐心看完。

目    录

XtraBackup 简介

XtraBackup 原理

Xtrabackup 优点

XtraBackup 备份过程

XtraBackup 安装

XtraBackup 备份恢复操作


XtraBackup 简介

热备中主要有逻辑备份和裸文件备份,裸文件备份要比逻辑备份在速度上快一些,mysqldump 备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于 50G,mysqldump 备份就不太适合。而  XtraBackup 是一种物理备份工具,支持热备,在备份时复制所有 MySQL 的数据文件以及一些事务日志信息,在还原时将复制的数据文件放回至 MySQL 数据目录,并应用日志保证数据一致。

XtraBackup 是 percona 公司的开源项目,据官方介绍它是世界上唯一一款开源的能够对  InnoDB 和 XtraDB 数据库进行热备的工具。Xtrabackup 有两个主要的工具:xtrabackup、innobackupex。innobackupex 是 XtraBackup 的一个软连接,之前的版本 innobackupex 是一个 perl 脚本,它既可以备份 InnoDB 表,也可以备份 MyISAM  这类非事务表的需要,但会在备份过程中锁表。

XtraBackup 原理

对于 InnoDB 来说,XtraBackup 是基于 InnoDB 的 crash recovery 功能进行备份的。crash recovery 则是在 InnoDB 内部维护了一个 redo log,又叫事务日志 transaction log,它包含了 InnoDB 数据的所有更改信息;在 InnoDB 启动时,会先检查 datafiletransaction log ,然后前滚所有已提交的事务并回滚所有未提交的事务。

XtraBackup 在备份时并不会锁表,而是一页页地去复制 InnoDB 的数据,这样复制出来的数据是不一致的。要想保证数据的一致性,需要在恢复时使用 crash recovery 进行操作,XtraBackup 还有另外一个线程监视着 redo log ,当 redo log 写满之后发生变化,则会去复制变化过的 log pages。在复制全部数据文件完之后,停止复制 redo log

Xtrabackup 优点

1、备份速度快,物理备份可靠

2、备份过程不会打断正在执行的事务(无需锁表)

3、能够基于压缩等功能节约磁盘空间和流量

4、自动备份校验

5、还原速度快

6、可以流传将备份传输到另外一台机器上

7、在不增加服务器负载的情况备份数据

XtraBackup 备份过程

整个过程如下图所示:

MySQL 备份恢复(四)

MySQL 备份恢复(四)

来源:http://mysql.taobao.org/monthly/2016/03/07/

XtraBackup 安装

软件下载地址(注意此地址也会动态变化,如无法访问,请前去官方查看下载)

https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/

 

注意:下载时需要找到对应的安装包,否则若安装版本过高会报错,请按照正确的方式下载安装。

[root@JiekeXu bin]# ./innobackupex --version

此报错是没有动态库中要求的 GCC 版本 “GLIBCXX_3.4.15”,所以需要进行升级一下我们的 GCC 版本,但没有网络  yum 源,故无法安装。

MySQL 备份恢复(四)

下载完之后上传至服务器,然后可解压,注意的是需要下载对应系统的包,这里坑比较多,没有网络 yum 源要更加注意。

我这里的环境是 Red Hat Enterprise Linux Server release 6.7。执行以下命令安装:

[root@JiekeXu percona-xtrabackup]# cat /etc/issue

MySQL 备份恢复(四)

这样就算安装完成了,折腾这么久算完事了,可以好好的玩耍了,使用innobackupex --help 查看更多帮助命令。

XtraBackup 备份恢复操作

1****、创建备份账号

我们可以使用 MySQL 的 root 用户进行备份工作,也可以单独创建一个用于数据库备份的用户,过程如下。

CREATE USER 'backupdbuser'@'192.168.8.8' IDENTIFIED BY 'backupdbuser';

backupdbuser 用户授权,如下权限为正常备份的最小权限

GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,PROCESS ON *.* TO ' backupdbuser'@'192.168.8.8';

如果使用到某些高级备份功能,还需要其他权限的授权,例如 CREATE TABLESPACE、CREATE、INSERT、SELECT、SUPER 等,可根据实际情况添加,具体权限对应的高级功能可查看官方手册。

MySQL 备份恢复(四)

创建完账号,当然得建立一个备份的目录了,我们选择一个比较合适的目录存放备份数据,并在开始全备时不采用系统默认的备份集文件名称,使用 --no-timestamp 参数,自己重命名文件,。这里为 all_2019-05-04_bak

mkdir –p /opt/backup

2****、全备命令如下:

innobackupex --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser /opt/backup/all_2019-05-04_bak

MySQL 备份恢复(四)

使用此命令便开始备份了,看备份的日志,有开始备份时显示 MySQL 配置信息,提示信息、备份使用账号、版本号、备份工具依赖版本号等等信息。

MySQL 备份恢复(四)

备份结束时,最后会显示 completed OK!

3****、备份内容

MySQL 备份恢复(四)

现在来看看备份都备了些啥,从上图中可以看出,备份的有配置文件 my.cnf、buffer_pool、ibdata1 以及 testdb 等各个数据库,剩下就就是以 xtrabackup 开头的四个文件。

xtrabackup_binlog_info 文件记录二进制日志和偏移量,若开启了 gtid 功能,还记录了 gtid 位置信息,为在线搭建从库做准备。

xtrabackup_checkpoints 文件记录了备份类型,full-backuped 为全备,以及开始和结束的 lsn 号等信息。

xtrabackup_info 文件记录了备份的详细信息,如备份命令,备份工具版本号、MySQL 版本号、备份开始和结束时间,binlog 以及 gtid 信息。

xtrabackup_logfile 文件是二进制文件,不能通过普通的 cat、more 等命令打开,需要使用  strings xtrabackup_logfile 打开。

MySQL 备份恢复(四)

4****、利用全备恢复数据

假设有运维人员不小心将数据库  testdb  删除,那么数据库中的表也将不复存在。

MySQL 备份恢复(四)

报错了,首先想到的是查看日志,DBA 利用二进制日志能否查看到蛛丝马迹,又因为二进制日志无法打开,则通过系统自带的 mysqlbinlog 命令解析出可查看的日志来。通过分析数据库  testdb 被删除了,则只能利用备份恢复了。

[root@JiekeXu mysql]# /usr/local/mysql/bin/mysqlbinlog  --no-defaults -v -v--base64-output=decode-rows /opt/mysql/mysql-binlog.000009 > bin.log

MySQL 备份恢复(四)

恢复时需要加参数 --apply-log ,此参数作用主要是通过回滚未提交的事务及同步已经提交的事务至数据文件,使数据库的数据文件保持一致性。

innobackupex --defaults-file=/etc/my.cnf  --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser --apply-log  /opt/backup/all_2019-05-04_bak

MySQL 备份恢复(四)

当出现 “**completed OK!**” 则证明备份集校检成功,离最后的恢复只差一步了。

最后,先将 MySQL 实例停掉,重命名原来的数据目录,改备份 /opt/backup/all_2019-05-04_bak/opt/mysql,并赋予 mysql 权限,重启实例,具体命令如下所示。

mysqladmin -u root -p root shutdown

MySQL 备份恢复(四)

恢复完成了,但是数据文件中比原来备份多了xtrabackup_binlog_pos_innodb 文件,此文件中记录了 binlog 文件和 position 号,在搭建主从架构时,如果均是 InnoDB 引擎表,则 xtrabackup_binlog_pos_innodb 此文件记录的是标准的 binlogposition 号,如若有其他混合引擎,则以 xtrabackup_binlog_info 文件记录的为准。

MySQL 备份恢复(四)

5****、Xtrabackup 增量备份

增量备份,顾名思义是在全量基础上的备份,第一次的增量备份必须要基于上一次的全备,之后的每次增备都是基于上一次的增备,最终达到一致性的增备。

先做一次全备,然后查看表 t ,然后在插入数据,做一次增备,查看备份的相关信息,然后在做一次增备,检查备份相关信息后模拟故障删除表 t ,实现一个增量备份恢复的过程。

innobackupex --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser/opt/backup/all_2019-05-09_bak

MySQL 备份恢复(四)

以上查看了表中的数据,在看一眼 xtrabackup_checkpoints 文件中 full-backuped 全备,from_lsn  初始值为  0,结束时的 to_lsn  值为 2567739。接着在表 t 里插入数据。

insert into t (id,name,sex) values(4,'xh','man');

插入完数据后,就已经到 5 月 10 日了,今天有一个增量备份,增备需要添加一个参数 --incremental ,增备的文件为 /opt/backup/all_2019-05-10_incr 。而且要使用 --incremental_basedir 参数代表在全备的基础上做增备。

增备命令如下:

innobackupex --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser --incremental  /opt/backup/all_2019-05-10_incr --incremental_basedir=/opt/backup/all_2019-05-09_bak

MySQL 备份恢复(四)

增备完成后,来瞅一眼 xtrabackup_checkpoints 文件,备份类型是增备,备份开始的 lsn 是上个全备结束的 lsn2567739,之后的备份以此类推。那么,我么在往表 t 插入一条数据:

root@db 23:56:  [testdb] insert into t (id,name,sex) values(7,'mjz','f');

假设已经过了一天了,然后我们来进行第二次增量备份操作,这个备份是基于上个备份做的。命令如下:

innobackupex --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser--host 192.168.8.8  --password backupdbuser --incremental /opt/backup/all_2019-05-11_incr --incremental_basedir=/opt/backup/all_2019-05-10_incr

备份成功后在来看一下 lsn 和 备份类型,这个的备份类型还是增备,起始的 lsn 是上一个增备结束的 lsn .

cat /opt/backup/all_2019-05-11_incr/xtrabackup_checkpoints

MySQL 备份恢复(四)

6****、Xtrabackup 增量备份的恢复

首先模拟故障将表 t 删除:

use testdb;

首先在恢复的过程中将全备恢复,然后将两个增量备份恢复到全备中,在停掉实例,替换原来的数据文件目录,更改权限重启即可。值得注意的是前两个过程需要添加参数 --redo-only,它意味着只前滚  Xtrabackup 备份中已经提交的事务,并不回滚那些还没有提交的事务信息。最后一个过程就是对整体全备进行恢复,这时可以去掉 --redo-only 参数了,意味着需要回滚那些还没有提交的事务。

恢复过程如下:

全备恢复:

innobackupex --defaults-file=/etc/my.cnf  --user backupdbuser --host 192.168.8.8 --password backupdbuser --apply-log --redo-only /opt/backup/all_2019-05-09_bak

第一个增量备份恢复到全备中:

innobackupex --defaults-file=/etc/my.cnf  --user backupdbuser --host 192.168.8.8 --password backupdbuser --apply-log --redo-only /opt/backup/all_2019-05-09_bak  --incremental-dir=/opt/backup/all_2019-05-10_incr

第二个增量备份恢复到全备中:

innobackupex --defaults-file=/etc/my.cnf  --user backupdbuser --host 192.168.8.8 --password backupdbuser --apply-log --redo-only /opt/backup/all_2019-05-09_bak  --incremental-dir=/opt/backup/all_2019-05-11_incr

第三次恢复,将前面新恢复的备份进行一次完全恢复,回滚那些还未提交的数据。注意:这一次不需要添加--redo-only 参数了。

innobackupex --defaults-file=/etc/my.cnf  --user backupdbuser --host 192.168.8.8 --password backupdbuser --apply-log  /opt/backup/all_2019-05-09_bak

这时,文件中已经恢复了所有的数据,剩下的就是关库,替换数据目录,赋权,重启,相关命令如下:

mysqladmin –uroot –proot shutdown 

MySQL 备份恢复(四)

7****、Xtrabackup 流式化备份

流式化备份可以理解为不占用本地磁盘空间,节省本地服务器磁盘空间,流式化备份有两个输出格式,一种是基于 tar 格式的,一种是基于 xbstream 的,这里主要看一下 tar 格式的备份。

流式化备份重要的一个参数就是 --stream,有压缩格式和非压缩格式。

innobackupex  --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser --stream=tar /tmp  |gzip - >/opt/backup/all_20190512.tar.gz



innobackupex  --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser --stream=tar /tmp > /opt/backup/all.tar

MySQL 备份恢复(四)

远程备份

远程备份就是考虑到数据库的数据量巨大,几个 T 的数据存放到本地磁盘太占空间,则考虑到远程服务器。首先配置好两台服务器的互信,建立远程服务器上的备份目录,利用 SSH 远程登录。

innobackupex  --defaults-file=/etc/my.cnf --no-timestamp --user backupdbuser --host 192.168.8.8  --password backupdbuser --stream=tar /tmp  |gzip |ssh root@192.168.8.9 "cat - > /data2/backup/all_2019-05-12.tar.gz"

看到这里就结束了,感谢您的阅读,佩服您的耐心,能够看完全文,非常感谢。MySQL 备份相关的知识点应该是全部结束了,其他几篇可以查看历史记录。备份恢复的时候翻出来瞅瞅,大概率是有帮助的,有帮助我也很欣慰,好久没开过赞赏了,要是下面能出现你的头像,那我会更加欣慰的!

在这母亲节之际,拿起手机打个电话发个视频,多点陪伴多点关怀,唠唠家常,比铺天盖地的朋友圈的祝福好上千倍万倍!另外,今天是“5·12****全国防灾减害日”,还记得 5·12 汶川地震么?还记得那些可爱的人儿吗?十一年,美好的人生,美好的时光,一生能有多少个十一年,且行且珍惜!


参考资料:

http://www.voidcn.com/article/p-ppzhkaus-bev.html

http://mysql.taobao.org/monthly/2016/03/07/

https://www.zsythink.net/archives/1469

张甦  著 《MySQL王者晋级之路》

MySQL 备份恢复(四)

- End -

推荐阅读:

模拟真实环境下超简单超详细的MySQL 5.7安装

关系型数据库MySQL之InnoDB体系结构

关系型数据库MySQL体系结构详解

MySQL 备份恢复(一)

MySQL 备份恢复(二)

MySQL 备份恢复(三)

资源分享:

5T技术资源大放送!包括但不限于:Linux,Python,Oracle,MySQL,Java,前端,大数据,人工智能等,具体获取方式可关注本公众号或者添加我微信获取~~~

MySQL 备份恢复(四)

MySQL 备份恢复(四)

长按添加微信,可加入****资源技术交流群

获取更多付费资源

MySQL 备份恢复(四)

长按识别二维码即可关注!

本文分享自微信公众号 - JiekeXu之路(JiekeXu_IT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这