Loading... 前文已经总结Xtrabackup的相关概念与理论,直达链接如下: <a href="https://www.zsythink.net/archives/1455" target="_blank" rel="noopener">xtrabackup理论总结</a> 这篇文章总结了Xtrabackup的安装过程以及怎样使用Xtrabackup进行全量备份,在下一篇文章中,会总结如何使用Xtrabackup进行增量备份。 <img class=" ls-is-cached lazyloaded" title="1491530053599044.jpg" src="https://www.zsythink.net/wp-content/uploads/ueditor/php/upload/image/20170407/1491530053599044.jpg" alt="perconaXtrabackup.jpg" data-src="https://www.zsythink.net/wp-content/uploads/ueditor/php/upload/image/20170407/1491530053599044.jpg" style=""> 在本博客中,”mysql”是一个系列文章,这些文章主要对mysql/mariadb的常用知识点进行了总结,每一篇博客总结的知识点有所不同,具体内容可参考mysql文章列表。 mysql文章列表直达链接:<a href="https://www.zsythink.net/archives/tag/mysql/" target="_blank" rel="noopener">mysql知识点总结</a> <h2 id="wznav_0">安装Xtrabackup</h2> 官网提供了xtrabackup的源码下载,也提供了各个发行版的rpm包,此处我们使用rpm包进行安装,根据你的操作系统版本,选择对应版本的rpm包。 登录percona官网下载xtrabackup <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly93d3cucGVyY29uYS5jb20v" target="_blank"><i data-feather="external-link"></i>https://www.percona.com/</a></span> 下载选项直达链接如下: <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly93d3cucGVyY29uYS5jb20vZG93bmxvYWRzL1h0cmFCYWNrdXAvTEFURVNULw==" target="_blank"><i data-feather="external-link"></i>https://www.percona.com/downloads/XtraBackup/LATEST/</a></span> 因为在安装xtrabackup时,可能会依赖到很多包,所以,为了方便,需要提前配置好yum源,包括base源与epel源。 使用yum安装对应的rpm,让其自动解决依赖关系,此处使用了centos7中可以使用的2.4版本。 yum install percona-xtrabackup-24-2.4.6-2.el7.x86_64.rpm 因为咱们安装的xtrabackup版本是2.4,所以,得到的程序有可能会与2.3之前的版本的程序有所区别。 什么意思呢?为什么会这样呢?还是因为历史原因造成的,我们慢慢聊。 如果你安装了2.3之前版本的xtrabackup,那么在备份的过程中,你可能会用到两个常用的备份工具。 安装2.3版本之前的XtraBackup后,我们会得到两个主要的备份工具:xtrabackup与innobackupex xtrabackup是一个C程序。 innobackupex是一个perl脚本,它对xtrabackup这个C程序进行了封装,在备份innodb表时,此脚本会调用xtrabackup这个C程序。 如果使用xtrabackup这个C程序进行备份,则只能备份innodb和xtradb的表,不能备份myisam表。 如果使用innobackupex进行备份,则可以备份innodb或xtradb的表,同时也能够备份myisam表。 所以,一般在使用XtraBackup备份工具进行数据备份时,通常会选择使用innobackupex命令进行备份。 那么问题来了。 xtrabackup是一个C程序,innobackupex是一个perl脚本,当它们作为两个进程运行时,总是没有特别完美的方式让它们进行通讯,当它们作为一个整体进行工作时就不太尽如人意,如此情况,就导致了一些bug的出现,于是,官方决定使用C重写innobackupex,将它与xtrabackup这个C程序完美的整合在一起。这个想法在2.3版本的XtraBackup中实现。 而我们安装的就是2.4版本,此时,innobackupex的功能已经完全整合到了xtrabackup中,innobackupex不再是perl脚本了,但是,为了兼容之前用户的使用习惯,官方保留了innobackupex,它作为一个软连接,指向了xtrabackup,也就是说,在2.4版本中,不管我们使用innobackupex命令,还是xtrabackup命令,其实使用的都是C程序。虽然在实现上有所不同,但是在工作原理上,与之前的版本并没有什么不同,我们按照之前的方法使用即可。 在查看percona官方的xtrabackup2.4版本的在线用户手册时发现,官网声称在以后的版本中,将会删除innobackupex,只保留xtrabackup,官网在线手册地址如下 <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly93d3cucGVyY29uYS5jb20vZG9jL3BlcmNvbmEteHRyYWJhY2t1cC8yLjQvbWFudWFsLmh0bWw=" target="_blank"><i data-feather="external-link"></i>https://www.percona.com/doc/percona-xtrabackup/2.4/manual.html</a></span> 不过只要学会使用innobackupex,再使用xtrabackup时也不会有什么问题,所以此处仍然保留之前的操作习惯,使用innobackupex。 我们可以使用mysql的root用户进行备份工作,也可以单独创建一个用于数据库备份的用户,过程如下。 创建数据库用户bkupdbuser。 > CREATE USER ‘bkupdbuser’@’192.168.1.146’ IDENTIFIED BY ‘123123’; 为bkupdbuser用户授权,如下权限为正常备份的最小权限 > GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,PROCESS ON *.* TO ‘bkupdbuser’@’192.168.1.146’; 如果使用到某些高级备份功能,还需要其他权限的授权,例如CREATE TABLESPACE、CREATE、INSERT、SELECT、SUPER等,可根据实际情况添加,具体权限对应的高级功能可查看官方手册。 刷新授权。 > FLUSH PRIVILEGES; 本文为了方便示例,使用mysql的root用户进行备份。 <h2 id="wznav_1">xtrabackup全量备份及恢复</h2> 好了,上面的内容已经描述清楚了,我们开始动手实验一下。 那么,先来看一个最简单的备份示例, 下例语句表示备份当前数据库服务器上的所有数据库,对所有数据库进行全量备份,将备份的文件存放在/backup目录下 innobackupex –defaults-file=/etc/my.cnf –host=192.168.1.146 –user=root –password=123123 /backup 上例中, –defaults-file选项指定了备份数据库时,从哪个配置文件中获取配置信息,–host选项指定数据库服务的IP地址,–user选项指定使用那个用户连接到数据库进行备份,–password选项指定对应用户的密码。 如果使用root用户,备份本机上的数据库,那么–host选项与–user选项都可以省略,–password选项也可以替换为对应的短选项-p,同时,如果使用默认的配置文件,–defaults-file选项也可以省略,示例如下。 innobackupex -p123123 /backup/ 上述写法表示默认使用root用户备份本机的数据库,root用户密码为123123,配置文件默认使用/etc/my.cnf 上述备份命令执行后,可以看到,xtrabackup提示我们,”请确定备份完成后,打印了completed OK字样”,看到completed OK才算备份成功。 <img class="lazyload" src="https://www.zsythink.net/wp-content/themes/zibll/img/thumbnail-lg.svg" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_1.png" style=""> 然后可以看到屏幕上输出了xtrabackup备份的大致过程,可以看出,xtrabackup先备份了innodb数据文件,然后才开始备份非innodb数据,备份非innodb数据文件之前,施加了读锁。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_2.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_2.png" style=""> 备份完成后,可以看到备份时的LSN号,当下次进行增量备份时,xtrabackup就只备份大于此号的page即可,而且,信息中输出了备份的位置,可以看到,xtrabackup自动在指定的备份目录中创建了一个备份目录,目录名称为当前的日期与时间,同时,信息中还输出了备份时二进制日志处于哪个二进制日志文件中以及其对应的postion,在进行时间点还原时,我们可以通过这些信息确定二进制日志的重放起始位置。 <img class=" lazyloading" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_3.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_3.png" style=""> 那么我们进入备份目录,看看都备份了什么。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_4.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_4.png" style=""> 进入目录后,可以看到一些目录,这些目录与我们数据库的名称相同,没错,这些就是各个数据库的数据文件备份目录。 还有一个innodb的共享表空间文件,ibdata1,注意,如果想要使用xtrabackup备份众多数据库中的某一个,那么必须保证在创建这个数据库时,已经开启了innodb_file_per_table参数,否则将无法单独备份数据库服务器中的某一个数据库。 除了刚才描述的这些数据文件,xtrabackup还为我们生成了一些文件,我们来看看这些文件都有什么用(不同版本的xtrabackup生成的文件可能不同)。 backup-my.cnf 此文件中包含了my.cnf中的一些设置信息,但是,并不是my.cnf中的所有信息都会包含在此文件中,此文件中只包含了备份时需要的信息。 xtrabackup_binlog_info 此文件中记录了备份结束时二进制日志文件的”位置(position)” xtrabackup_checkpoints 此文件中记录此次备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。 xtrabackup_info 本次备份的概要信息,此文件中的信息还是比较全面的。 xtrabackup_logfile 记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。 好了,现在我们已经备份出了对应的数据,而且从文件中的信息可以看出,这是一次全量备份。 <img class="lazyload" src="https://www.zsythink.net/wp-content/themes/zibll/img/thumbnail-lg.svg" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_5.png" style=""> 那么,我们现在就可以通过这个全量备份进行数据库恢复,假设,我们在另一台服务器上也安装了相同版本mysql数据库,现在,我们要通过这个备份将数据还原到新安装的数据库上,我们一起来看看怎样进行数据还原。 首先,我们要在进行还原操作的服务器上安装xtrabackup,所以,前配置好base源与epel源,然后通过rpm包进行安装即可。 完成上述工作后,我们将原来的备份拷贝至进行还原操作的主机上 scp -r /backup/2017-04-06_21-53-13/ 192.168.1.120:/testdir/ 好了,我们已经在需要还原数据的主机上安装了相同版本的mysql,而且将刚才的备份拷贝了过来,并且在此主机上也安装了xtrabackup。 现在,我们即可进行数据还原操作了,只是,我们说过,备份出的数据并不能直接使用,因为备份出的数据是不一致的,我们需要将同时备份出的事务日志应用到备份中,才能得到一份完整、一致、可用的数据,xtrabackup称这一步操作为prepare,直译过来就是”准备”,那么,我们就把这一步称之为还原数据前的”准备”工作吧。 因为我们上次备份的数据是全量备份,所以准备工作相对简单,示例如下。 innobackupex –apply-log /testdir/2017-04-06_21-53-13/ 我们使用了–apply-log选项,表示将目录中的日志应用到备份数据中。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_6.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_6.png" style=""> 可以看到,它提示我们要确认看到completed OK字样,才算应用日志成功,那么我们查看输出信息的最下方,已经可以看到completed OK字样 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_7.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_7.png" style=""> 因为我们的演示数据在备份时并没有什么多少事务日志,所以很快应用成功了,如果你要备份的数据量巨大,那么备份时长会变长,期间备份的事务日志容量有可能会很大。那么,我们可以使用–use-memory选项,加速准备工作的完成,在不指定内存大小的情况下,准备工作默认会占用100MB的内存,如果服务器有一定的空闲内存,那么我们可以让xtrabackup使用指定大小的内存完成准备工作,以提升准备工作完成的速度,示例语句如下。 innobackupex –apply-log –use-memory=4G /testdir/2017-04-06_21-53-13/ 好了,完成上述工作以后,我们已经得到了一份可用的,数据一致的备份,那么此刻,我们即可完成真正的恢复数据操作了,真正的恢复数据操作也非常简单,我们只要把可用的备份”拷贝回”数据库的数据目录即可。但是,拷贝工作并不是手工的使用cp命令或者mv命令进行,而是使用innobackupex命令进行,示例语句如下 innobackupex –datadir=/var/lib/mysql –copy-back /testdir/2017-04-06_21-53-13/ 上述语句表示,将我们准备好的可用数据,”拷贝回”要恢复的数据目录中。 细心如你一定发现了,–datadir选项指定的目录就是数据目录,上例中,我们指定的数据目录为rpm安装的mysql的默认数据目录,如果数据库的my.cnf配置文件中已经设置了datadir对应的目录,那么则可以省略–datadir选项,innobackupex在执行copyback时会读取数据库的my.cnf中的配置,但是如果my.cnf中没有配置datadir,那么–datadir选项必须存在,而且,datadir目录必须为空目录,其中不能存在数据,否则在执行上述命令时会报错,–copy-back选项对应的目录就是我们准备好的可用数据的目录。 为了能够正常的恢复数据,我们先确定数据库服务已经停止了,而且对应的数据目录中不存在数据,然后进行数据还原工作,删除数据目录中的文件与日志。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_8.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_8.png" style=""> 如innobackupex的一贯作风,它提示我们要确定一下,是否备份成功。 好了,还原工作完成了,但是稍等,此时我们还不能启动mysql,因为我们是使用root用户拷贝的数据,所以数据目录中的数据文件的属主属组仍然为root,没错,我们需要将这些文件的属主属组设置为mysql。 chown -R mysql: /var/lib/mysql/ 此时,我们就可以启动了,当然,实际还原时最好将对应的配置文件(例如my.cnf)也都还原了,所有数据还原后,再启动mysql服务。 此处我们先尝试启动一下,如下图所示,启动成功,数据已经被还原,能够正常使用了,但是,如果你使用的是2.3版本,那么在启动时可能会出现一些小问题。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_9.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_9.png" style=""> 如果你使用了xtrabackup版本为2.3版本,那么可能会遇到无法启动的情况,此时,你可以确定一下数据目录中的事务日志文件的大小,是否与备份时数据库指定的事务日志大小相同,如果事务日志的大小自动变大了(比如从默认的5M变成了50M),可能会导致mysql启动不成功的现象发生,此时,可以尝试将如下事务日志文件删除或备份至其他目录后,再次启动mysql。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_10.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/04/040817_1342_10.png" style=""> 如果启动成功,则是因为上述小bug造成的,如果启动失败,则需要根据输出信息查找其他原因。 <h2 id="wznav_2">xtrabackup全量备份与恢复的命令总结</h2> 好了,我们已经掌握了如何通过xtrabackup进行全量备份,并且已经可以通过备份将数据还原(还原至备份的时刻,并没有进行时间点还原),那么,我们将整个过程中用到的命令总结一下,方便以后回顾。 <h3 id="wznav_3">备份命令总结</h3> 执行全量备份命令 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">innobackupex --defaults-file=/etc/my.</span><span class="enlighter-m3">cnf</span><span class="enlighter-text"> --host=</span><span class="enlighter-n0">192.168</span><span class="enlighter-text">.</span><span class="enlighter-m3">1</span><span class="enlighter-text">.</span><span class="enlighter-m3">146</span><span class="enlighter-text"> --user=root --password=</span><span class="enlighter-n1">123123</span><span class="enlighter-text"> /backup</span></div> </div> </div> </div> 简易的全量备份命令如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">innobackupex -p123123 /backup</span></div> </div> </div> </div> <h3 id="wznav_4">恢复命令总结</h3> 如果在另一台mysql服务器上恢复,则先确保已经安装了同样版本的mysql,并且安装了xtrabackup。 将全量备份拷贝至新的mysql服务器上 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">scp -r /backup/</span><span class="enlighter-n1">2017</span><span class="enlighter-text">-</span><span class="enlighter-n4">04</span><span class="enlighter-text">-06_21-</span><span class="enlighter-n1">53</span><span class="enlighter-text">-</span><span class="enlighter-n1">13</span><span class="enlighter-text">/ </span><span class="enlighter-n0">192.168</span><span class="enlighter-text">.</span><span class="enlighter-m3">1</span><span class="enlighter-text">.</span><span class="enlighter-m3">120</span><span class="enlighter-text">:/testdir/</span></div> </div> </div> </div> 对数据进行准备工作,合成可用的一致的数据,–use-memory选项不是必须的 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">innobackupex --apply-log --use-memory=4G /testdir/</span><span class="enlighter-n1">2017</span><span class="enlighter-text">-</span><span class="enlighter-n4">04</span><span class="enlighter-text">-06_21-</span><span class="enlighter-n1">53</span><span class="enlighter-text">-</span><span class="enlighter-n1">13</span><span class="enlighter-text">/</span></div> </div> </div> </div> 完成准备工作后,确定新的MySQL服务器上的mysql服务已经停止,确定对应的数据目录中没有任何文件,删除数据目录与对应日志 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">systemctl stop mariadb</span></div> </div> <div class=""> <div><span class="enlighter-text">rm -rf /var/lib/mysql/*</span></div> </div> </div> </div> 完成上述工作后,将准备好的数据还原回对应的数据目录中 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">innobackupex --datadir=/var/lib/mysql --copy-back /testdir/</span><span class="enlighter-n1">2017</span><span class="enlighter-text">-</span><span class="enlighter-n4">04</span><span class="enlighter-text">-06_21-</span><span class="enlighter-n1">53</span><span class="enlighter-text">-</span><span class="enlighter-n1">13</span><span class="enlighter-text">/</span></div> </div> </div> </div> 数据还原拷贝完成后,将对应数据目录中的文件的属主属组设置为mysql用户 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">chown -R mysql: /var/lib/mysql/</span></div> </div> </div> </div> 完成上述步骤后,启动mysql服务,当然,实际还原时最好将对应的配置文件(例如my.cnf)也都还原了,所有数据还原后,再启动mysql服务(未涉及时间点还原)。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">systemctl start mariadb</span></div> </div> </div> </div> 好了,xtrabackup的全量备份以及恢复就总结到这里,下一篇文章会总结xtrabackup的增量备份及恢复。 转载自朱双印日志https://www.zsythink.net/archives/1469 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏