XtraBackup物理备份
XtrqBackup虽然不是官方开发的工具,但是使用的频率却远高于mysqldump,物理备份相对比mysql的逻辑备份来说更加可靠,同时对于系统的影响也要更小。
为什么需要物理备份通常具备下面的理由:
- 逻辑备份针对大数据量备份速度十分缓慢。
- 导出速度快不需要二次转化。
- 对于数据库的压力较小。
- 增量备份更加容易。
直接拷贝裸文件可行么?
我们直接CV数据库的文件可以么?理论上是可行的但是实际操作会发现有很多问题,以Innodb的存储引擎的数据为例,它不仅涉及Binlog文件,idb文件(数据库原始数据)以及frm文件,还包括独有的redo log和 undo log这些文件等,此时会发现如果要拷贝这些文件只能冷备,但是仅仅冷备还是不行的,因为这里还牵扯操作系统和数据库版本兼容等等问题,有十分明显的跨平台的问题。
从结论来看,直接拷贝裸文件理论上是可行的,但是实际上备份出来的数据可能完全不可用,甚至可能无法兼容。
如何实现物理+全量+热备?
实现思路如下:核心的思想是监听redo log
文件变化的同时,备份Idb
文件和备份过程中进行了改动的redo log
文件。
- 启动监听线程,收集redo log
- 备份idb文件,记录监听过程中新产生的redo log日志
- 备份idb完成,停止收集redo log日志
- 增加FTWRL锁拷贝元数据frm
FTWRL锁是啥?
FLUSH TABLES WITH READ LOCK
简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与Binlog位点匹配)。需要注意的是这个锁的粒度非常大,基本是锁住整个库的等级,如果是备份主库会导致整个主库“卡”住,从库则会导致线程等待。所需权限:
FLUSH_TABLES
和RELOAD
权限。由于这里讲的主要是备份的内容,想进一步了解FTWRL锁实现细节和使用教程可以参考下面的博客:
注意在第四步给整个库加全局锁会有一段时间数据库是处于温备的情况的(不能进行读写)。
这里还存在一个问题,如何知道哪些数据是增量数据?Xtrabackup的思路是在Mysql中每一个数据页存在一个LSN号码,在备份的时候可以通过这个LSN号确定哪个页存在变化,当进行过一次全量备份之后记录变化过数据的LSN号,在下一次备份可以直接找比上一次LSN号更大的值进行备份。
LSN(log sequence number):日志序列号,是一个一直递增的整形数字,在MySQL5.6.3版本后占8个字节。它表示事务写入到日志的字节总量。LSN主要用于发生crash时对数据进行recovery!每个数据页、重做日志、checkpoint都有LSN。
Xtrabackup介绍
在介绍Xtrabackup之前需要了解Mysql的ibbackup
,它是由Innodb官方开发,后续被改名为Mysql Enterprise Backup
,由于这个软件为收费软件用户并不多,所以后续出现了完全替代品Xtrabackup
并且被广泛使用。
Xtrabackup是由percona开源的免费数据库备份软件,不同于Mysqldump这是一个第三方公司开发的软件,在前面提到的Mysqldump命令是逻辑备份,逻辑备份最大的问题是在数据量特大的情况下导出会十分缓慢并且十分影响数据库的读写性能,并且导出的时候需要对于数据库进行“RR级别”的锁定或者使用表锁(MyISAM),所以对于大数据量还是建议使用物理备份的方式备份。
Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup。下面是xtrabackup其他工具的大致介绍:
1)xtrabackup 是专门用来备份InnoDB表的,和mysql server没有交互;
2)innobackupex 是一个封装xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
3)xbcrypt 加密解密备份工具
4)xbstream 流传打包传输工具,类似tar
XtraBackup特点
- 备份速度快,几乎不影响服务器的正常业务处理
- 压缩存储,节省磁盘容量,同时可以存储到另一个服务器
- 还原速度很快,对于服务器的负载较小。
XtraBackup安装过程
Xtrabackup是没有windows和mac版本的,只有linux版本,所以需要做实验也只能使用linux系统,所以这里简单记录一下如何安装:
下载地址:Percona Software downloads for databases
注意里面包含很多软件,这里找到如上截图所示的界面,根据自己的Mysql 版本下载:
- 8.0:对应Mysql8.0以上版本。
- 2.4:对应Mysql5.0 - Mysql5.7版本。
下面是xtrabackup的大致安装操作流程:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar [root@centos ~]# ll total 703528 -rw-r--r-- 1 root root 654007697 Sep 27 09:18 mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz -rw-r--r-- 1 root root 65689600 Nov 30 00:11 Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar [root@centos ~]# tar xf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar [root@centos ~]# yum install percona-xtrabackup-24-2.4.9-1.el6.x86\_64.rpm -y [root@centos ~]# which xtrabackup /usr/bin/xtrabackup [root@centos ~]# innobackupex -v innobackupex version 2.4.9 Linux (x86\_64) (revision id: a467167cdd4) #已经安装完成
XtraBackup全量备份与恢复
Xtrabackup安装完成之后,我们可以使用下面的命令进行备份操作:
[root@centos ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123456" --backup /root
执行完成之后,会在对应的目录里面新增一个日期文件目录,接着我们需要同步log日志:
#使用此参数使用相关数据性文件保持一致性状态 [root@centos ~]#innobackupex --apply-log /root/(日期)/
最后我们通过下面的命令对于备份文件进行恢复:
[root@centos ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /root/(日期)/
Xtrabackup增量备份与恢复
需要注意的是增量备份仅能应用于InooDB或XtraDB表,下面的命令用于创建增量备份的数据。
[root@Vcentos ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /backup/ --incremental-basedir=/root/(日期) #--incremental /backup/ 指定增量备份文件备份的目录 #--incremental-basedir 指定上一次全备或增量备份的目录
增量备份的恢复命令:
[root@centos ~]# innobackupex --apply-log --redo-only /root/(日期)/ [root@centos ~]# innobackupex --apply-log --redo-only /root/(日期)/ --incremental-dir=/backup/(日期)/
如果需要恢复全部的数据,可以使用下面的命令处理:
[root@centos ~]#innobackupex --defaults-file=/etc/my.cnf --copy-back /root/(日期)/
增量备份合并至全量备份,可以使用下面的命令:
innobackupex --apply-log bakdir/xxx-xx-xx/ --incremental-dir=basedir/YYYY-YY-YY/
小结
- 物理备份是一种高效备份方式。
- XtraBackup 采用备份idb + 备份期间监听改动redo log的方式实现全量热备+增量备份。
- XtraBackup 是常用的Mysql物理备份工具。
- 物理备份最大缺点是备份之后的文件无法直接阅读。
Mysql备份产生的创新
从Mysqldump对于备份的改进过程中我们可以从下面的方式进行思考:
- 直接复制磁盘:比复制数据文件更为直接,直接复制物理磁盘设备镜像备份。
- 多线程备份:通过多线程的方式加快备份的速度。
- 备份工具管理:我们可以发现传统备份都是小黑框,对于备份工具本身进行管理的软件是许需要的。
由此扩展出下面几个比较特殊的备份方式扩展:
- Mylvmbackup:LVM备份磁盘。备份磁盘是一种物理温备的备份方式,备份磁盘本身是一种很好的思路扩展,但是备份磁盘同样有一个严重的问题,那就是兼容性的问题,所以这个备份工具使用了LVM逻辑卷进行磁盘管理。
- Mydumper:多线程备份。这个工具的使用频率甚至比Mysqldump还要高一些。Mydumper主要有下面的特点
1. 和Mysqldump类似的工具,2. 实现了多线程兵法备份还原,3. 速度更快。
- Zmanda Recovery Manager(ZRM):备份工具管理。提供了可视化的方式管理备份文件,类似于数据库管理工具中的navicat,这个工具的特点是集成Binlog和多种备份工具。
如何养成良好数据管理习惯
最后无论多少的备份软件其实最好的情况是备份的数据我们永远也用不上,除开备份以外我们还有其他的方式来防止数据丢失,比如遵循下面的规范:
- 权限隔离
- 业务只有DML权限,删除尽量使用假删除
- 开发人员只拥有只读账号,当然很多情况下稍微大一些的公司都有明确的权限管理。
- DBA日常只使用只读账户,特殊操作再切换账号
- 永远不要使用root直接连客户端,禁用root连接mysql
- SQL 审计
- DBA环境上线之前审计SQL语句
- 开发修改数据需要DBA执行
- Inception 自动审核工具
- 伪删表
- 删表之前先改个名字,观察业务影响
- 删除过程使用脚本给特殊标记表名称删除,而不是手动操作
- 对于本地开发需要备份的表可以使用加入
_bak
进行标记。
- 完备过程
- 上线之前必须备份
总结
本节从Outfile这个古老的命令入手,介绍了mysqldump的命令前身以及对于outfile命令的改进优化,讲述如何通过mysqldump实现增量和全量备份,同时介绍了内部的细节。但是逻辑备份通常只适用于数据量不是很大并且系统运行接受一定延迟响应对情况下可以这么做,一旦数据量过大并且要求快速响应,如果想要热备不影响系统,更加推荐Xtrabackup备份,这个工具可以说是运维备份Mysql DB的一大杀器,十分强大并且十分好用,这里简单介绍了实现的细节,对于XtraBack的细节探索这里就不做过多演示了,更建议参考官方资料熟悉工具的使用。
写在最后
本篇同样侧重理论为主,下一篇内容围绕整个课程的核心如何搭建“三高”架构进行讲解。