您现在的位置是:网站首页> 编程资料编程资料
MySQL系列连载之XtraBackup 备份原理解析_Mysql_
2023-05-26
474人已围观
简介 MySQL系列连载之XtraBackup 备份原理解析_Mysql_
MySQL 系列连载之 XtraBackup 备份原理(1)
导读
在日常的linux运维工作中,大数据量备份与还原,始终是个难点。关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天本文推荐另一个备份工具innobackupex。
Xtrabackup简介
innobackupex和mysqldump都可以对mysql进行热备份的,mysqldump对mysql的innodb的备份可以使用single-transaction参数来开启一个事务,利用innodb的mvcc来不进行锁表进行热备份,mysqldump备份是逻辑备份,备份出来的文件是sql语句,所以备份和恢复的时候很慢,但是备份和恢复时候很清楚。当MYSQL数据超过10G时,用mysqldump来导出备份就比较慢了,此种情况下用innobackupex这个工具就比mysqldump要快很多。利用它对mysql做全量和增量备份.
Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写)
此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。
XtraBackup是目前首选的备份方案之一
原理

1、MySQL主从同步原理
MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的
通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,然后传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。
2、XtraBackup备份原理
innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用InnoDB崩溃恢复代码执行事务日志(redo log),以达到数据的一致性。
3、备份的两个过程
backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。
preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。
4、XtraBackup的优点
1、可以快速可靠的完成数据备份(复制数据文件和追踪事务日志)
2、数据备份过程中不会中断事务的处理(热备份)
3、节约磁盘空间和网络带宽
4、自动完成备份鉴定
5、因更快的恢复时间而提高在线时间
5、Xtrabackup的两个工具
1)xtrabackup :只能用于热备份innodb,xtradb两种数据引擎表的工具,不能备份其他表。
2)innobackupex:是一个对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。主要是为了方便同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。 innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。innobackupex同时支持innodb,myisam。
6、Xtrabackup可以做什么
1)在线(热)备份整个库的InnoDB, XtraDB表
2)在xtrabackup的上一次整库备份基础上做增量备份(innodb only)
3)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。
7、Xtrabackup工具工作原理
支持对InnoDB存储引擎的增量备份
1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
2)在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。
8、innobackupex备份mysql数据的流程
innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件。
9、innobackupex恢复mysql数据的流程
innobackupex首先读取my.cnf,查看变量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。
10、innobackupex备份和恢复的工作原理
(1)备份的工作原理
MySQL 系列连载之 XtraBackup 备份原理(1)插图(2)
1、备份开始时首先会开启一个后台检测进程,实时检测mysql
redo的变化,一旦发现redo中有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中。2、之后复制innodb的数据文件和系统表空间文件ibdata1,待复制结束后。
3、执行flush tables with read lock操作。
4、复制.frm,MYI,MYD,等文件(执行flush tableswith read
lock的目的是为了防止数据表发生DDL操作,并且在这一时刻获得binlog的位置)。5、最后会发出unlock tables,把表设置为可读可写状态。
6、最终停止xtrabackup_log。
(2)恢复的工作原理
1、为了恢复一个备份,innobackupex需要以–copy-back选项启动。
2、innobackupex将会首先通过my.cnf文件读取如下变量:datadir,innodb_data_home_dir,innodb_data_file_path,
innodb_log_group_home_dir,并确定这些目录存在。3、接下来,此脚本将会首先拷贝MyISAM表、索引文件、其他类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG,
.TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files)4、接下来拷贝InnoDB表数据文件,最后拷贝日志文件。
5、拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能需要更改文件的owener(如从拷贝文件的user更改到mysql用户)。
MySQL 系列连载之 XtraBackup 全量热备 or 恢复实践(2)
1、准备工作
#系统环境
[root@master tools]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@master tools]# uname -r 2.6.32-642.el6.x86_64
#主数据库版本
[root@master ~]# mysql -V mysql Ver 14.14 Distrib 5.5.32, for Linux (x86_64) using readline 5.1
#检查数据库引擎
mysql> show engines;
#主从数据库同步注意点 [mysqld]
#主从之间的id不能相同 server-id
#启用二进制日志 log-bin
#一般在从库开启(可选) read_only #推荐使用InnoDB并做好相关配置
#检查主从数据库状态
[root@master ~]# mysql -e "show global variables like 'server_id';" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 241 | +---------------+-------+ [root@slave01 ~]# mysql -e "show global variables like 'server_id';" +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 242 | +---------------+-------+
2、安装percona-xtrabackup
官网安装包地址 - https://www.percona.com/downloads/XtraBackup/LATEST/
1)源码安装Xtrabackup
将源码包下载到/usr/local/src下
源码包下载
cd /usr/local/src #安装依赖 yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool zlib-devel libgcrypt-devel libcurl-devel crypt* libgcrypt* python-sphinx openssl imake libxml2-devel expat-devel ncurses5-devel ncurses-devle vim-common libgpg-error-devel libidn-devel perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL #下载源码包 wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/source/percona-xtrabackup-2.1.9.tar.gz #解压源码包 tar -zvxf percona-xtrabackup-2.1.9.tar.gz cd percona-xtrabackup-2.1.9 [root@master percona-xtrabackup-2.1.9]# ./utils/build.sh //执行该安装脚本,会出现下面信息 Build an xtrabackup binary against the specified InnoDB flavor. Usage: build.sh CODEBASE where CODEBASE can be one of the following values or aliases: innodb51 | plugin build against InnoDB plugin in MySQL 5.1 innodb55 | 5.5 build against InnoDB in MySQL 5.5 innodb56 | 5.6,xtradb56, build against InnoDB in MySQL 5.6 | mariadb100,galera56 xtradb51 | xtradb,mariadb51 build against Percona Server with XtraDB 5.1 | mariadb52,mariadb53 xtradb55 | galera55,mariadb55 build against Percona Server with XtraDB 5.5
根据上面提示和你使用的存储引擎及版本,选择相应的参数即可。因为我用的是MySQL 5.5版本,所以执行如下语句安装:
[root@master percona-xtrabackup-2.1.9]# ./utils/build.sh innodb55
以上语句执行成功后,表示安装完成。
最后,把生成的二进制文件拷贝到一个自定义目录下(本例中为/home/mysql/admin/bin/percona-xtrabackup-2.1.9),并把该目录放到环境变量PATH中。
mkdir -p /home/mysql/admin/bin/percona-xtrabackup-2.1.9/ cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.9/ mv /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_innodb55 xtrabackup_55 cp /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_55 /usr/local/src/percona-xtrabackup-2.1.9/src/xbstream /home/mysql/admin/bin/percona-xtrabackup-2.1.9/ vim /etc/profile export PATH=$PATH:/home/mysql/admin/bin/percona-xtrabackup-2.1.9/
刷新profile并测试下innobackupex是否正常使用
source /etc/profile
测试下innobackupex是否正常使用
innobackupex --help
3、全量备份和恢复
1)全量备份操作
执行下面语句进行全备: mysql的安装目录是/application/mysql/ mysql的配置文件路径/etc/my.cnf 全量备份后的数据存放目录是/backup/mysql/data
mkdir -p /backup/mysql/data/ innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/ 170404 12:46:29 innobackupex: Waiting for log copying
相关内容
点击排行
本栏推荐
