Xtrabackup 能不能做单库的备份恢复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xtrabackup 能不能做单库的备份恢复相关的知识,希望对你有一定的参考价值。
大数据量备份与还原,始终是个难点。当mysql超10G,用mysqldump来导出就比较慢了。在这里推荐xtrabackup,这个工具比mysqldump要快很多。 一、Xtrabackup介绍 1、Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。 Xtrabackup有两个主要的工具:xtrabackup、innobackupex 1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表 2、 innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。 2、Xtrabackup可以做什么 : 在线(热)备份整个库的InnoDB、 XtraDB表 在xtrabackup的上一次整库备份基础上做增量备份(innodb only) 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用) MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。 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保持数据的一致。 因为innobackupex支持innodb,myisam,所以本文说一下,怎么使用innobackupex。 二,安装xtrabackup 1、下载地址 /downloads/XtraBackup/ 2、安装 根据需求,选择不同的版本,我选择的是rpm安装包,如果报以下错误 复制代码 代码如下: [root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY error: Failed dependencies: perl(Time::HiRes) is needed by percona-xtrabackup-2.2.4-5004.el6.x86_64 解决办法: 复制代码 代码如下: [root@localhost xtrabackup]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安装依赖包 [root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm //重新安装 warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY Preparing... ########################################### [100%] 1:percona-xtrabackup ########################################### [100%] 参考技术A有时候我们需要获取文件的创建时间。
例如:我在研究 《xtrabackup 原理图》的时候,想通过观察确认 xtrabackup_log 是最早创建 并且是 最晚保存的文件。我们就需要知道 xtrabackup_logfile 这个文件的创建时间戳和修改时间戳。
复习:Linux关于文件的三个时间戳
Linux 的文件系统保存有三个时间戳,利用 stat 指令查看文件信息可以获取。他们分别是 ATime、MTime 和 CTime
[root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt’ Size: 16 Blocks: 8 IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:12:14.276981038 +0800Modify: 2019-07-23 12:12:41.415980158 +0800Change: 2019-07-23 12:12:41.415980158 +0800 Birth: -
ATime ——文件的最近访问时间
只要读取文件,ATime 就会更新,对应的是 stat 命令获取的 Access 的值。
[root@192-168-199-198 backups]# cat 2.txt #<-- 读取文件121231233123123[root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt’ Size: 16 Blocks: 8 IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:22:09.644961733 +0800 #<-- 时间变化了Modify: 2019-07-23 12:12:41.415980158 +0800Change: 2019-07-23 12:12:41.415980158 +0800 Birth: -MTime ——文件的内容最近修改的时间
当文件进行被写的时候,MTime 就会更新,对应的是 stat 命令获取的 Modify 的值。[root@192-168-199-198 backups]# echo hello_world > 2.txt #<-- 修改文件内容[root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt’ Size: 12 Blocks: 8 IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:22:09.644961733 +0800Modify: 2019-07-23 12:26:23.466953503 +0800 #<-- 时间变化了Change: 2019-07-23 12:26:23.466953503 +0800 Birth: -这里不要用vi修改文件内容,因为用vi修改文件内容有可能会引起Inode变更,也就是你观察的文件并不是之前的文件了!这个和vi的原理有关。
CTime ——文件属性最近修改的时间
当文件的目录被修改,或者文件的所有者,权限等被修改时,CTime 也就会更新,对应的是 stat 命令获取的 Change 的值。[root@192-168-199-198 backups]# chmod 777 2.txt #<-- 修改文件属性[root@192-168-199-198 backups]# stat 2.txt File: ‘2.txt’ Size: 12 Blocks: 8 IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15 Links: 1Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:22:09.644961733 +0800Modify: 2019-07-23 12:26:23.466953503 +0800Change: 2019-07-23 12:30:35.830945320 +0800 #<-- 时间变化了 Birth: -Linux 无法获取文件创建时间?现在我们知道了Linux有三种时间,ATime、MTime 和 CTime,那么很好奇为什么没有 CRTime (创建时间) 呢? 对比 Windows 系统 (上图),Windows 的 NTFS 文件系统里存在三个时间戳,其中就包含了“创建时间”,但在 Linux 的设计哲学上没有文件“创建时间”这么一说,所以早期版本的ext文件系统不支持文件“创建时间”。但从 ext4 版本开始,文件创建时间存储在ext4文件系统的inode中,所以 ext4 文件系统使用特殊方法也是可以获取文件的创建时间的。
也说明了,是否能获取文件的创建时间,和文件系统是否支持有关。
Linux 上获取文件创建时间的步骤
CentOS7 Linux系统自带一个工具,叫做 debugfs,他可以查出 ext4 文件系统上的文件的创建时间。man debugfs 发现工具的描述是 “ext2/ext3/ext4 file system debugger”,所以他是不支持 xfs 文件系统的。常用的 xfs 文件系统是否支持获取文件创建时间,还有如何获取,这个暂时不清楚,需读者查阅官方文档
xtrabackup 备份还原单库/表
使用 mysqldump 逻辑备份还原单个数据库/表非常方便。但是,当数据量比较大的时候,对逻辑备份进行恢复的时间太长了。这个时候选择物理备份的方式能大大缩短其中时间。使用 xtrabackup 进行全库物理备份还原非常简单,无须对其表空间(tablespace)进行重新导入。
xtrabackup 全库备份还原步骤:
创建备份
$ xtrabackup --backup --target-dir=/data/backups/
准备备份
$ xtrabackup --prepare --target-dir=/data/backups/
还原备份
$ xtrabackup --copy-back --target-dir=/data/backups/
$ chown -R mysql:mysql /var/lib/mysql
单库/表备份还原步骤:
创建备份
xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.]. * "
准备备份
$ xtrabackup --prepare --target-dir=/data/backups/
导出表结构
$ mysqldump -d ^test > test.sql
导入表结构
$ mysql test < test.sql
释放表空间
# mysql -e "set foreign_key_checks=0;alter table test.* discard tablespace;"
复制文件到数据目录
# cp -f /data/backups/*.cfg /data/backups/*.ibd /data/backups/*.frm /var/lib/mysql/test
修改属主
# chown -R mysql:mysql /var/lib/mysql/test
导入表空间
# mysql -e "set foreign_key_checks=0;alter table test.* import tablespace;analyze table test.*;"
如果两个实例都具有 GA(通用可用性)状态并且它们的版本在同一个系列中,则从另一个 MySQL 服务器实例导入表空间文件将起作用。 否则,该文件必须已在与其导入的服务器实例相同的服务器实例上创建。
以下是一个通过 xtrabackup 对单库进行备份还原的脚本
#!/bin/bash # by geamover on 2017-12-26 # last updated on 2018-05-08 # This is for backup one DB to the orther DB on the same server by xtrabackup. BK_DIR=/data/backup/`date +%F`/$1 # 备份路径 MT=$BK_DIR/$1.sql # 元数据 DT=/data/mysql/data/ # 数据目录 SK=/tmp/mysql.sock # mysql.sock PW=123456 # mysql 密码 if [ $# -ne 2 ]; then echo -e "\e[1;31mUsage:\e[0m $0 source_DB destination_DB" exit 1 fi mysql -u root -p"$PW" -e "use $1;" &> /dev/null if [ $? != 0 ]; then echo "There is no database $1, please check!" exit 1 fi echo "It will drop databae $2, are you sure continue?" echo -e "\e[1;31my\e[0m for continue, any orther for exit: " read input if [ $input == "y" ]; then echo "Go on!" else echo "Cancled!" exit fi if [ -d $BK_DIR ];then rm -rf $BK_DIR/* else mkdir -p $BK_DIR fi echo "From $1 to $2" | tee -a xtra.log echo `date "+%F %T"`" Backing up databae $1 to $BK_DIR" | tee -a xtra.log xtrabackup --backup -u root -p"$PW" --socket=$SK --databases="$1" --parallel=8 --target-dir=$BK_DIR &>> xtra.log JD=`tail -n 1 xtra.log | awk '{print $3$4}'` if [ $JD == "completedOK!" ]; then echo `date "+%F %T"`" Back up databae $1 to $BK_DIR completed OK!" else echo `date "+%F %T"`" Back up databae $1 to $BK_DIR failed!" exit 1 fi echo `date "+%F %T"`" Prepare the backup."| tee -a xtra.log xtrabackup --prepare --export --parallel=8 --target-dir=$BK_DIR &>> xtra.log JD=`tail -n 1 xtra.log | awk '{print $3$4}'` if [ $JD == "completedOK!" ]; then echo `date "+%F %T"`" Prepare up databae $1 to $BK_DIR completed OK!" else echo `date "+%F %T"`" Prepare up databae $1 to $BK_DIR failed!" exit 1 fi echo `date "+%F %T"`" Dump the metadata of $1 to $MT." # --set-gtid-purged=OFF 如果开启 GTID 请指定该选项导出元数据 mysqldump -u root -p"$PW" -d $1 > $MT echo "Drop database $2 if exists.Then create it and import metadata." mysql -u root -p"$PW" -e "Drop database if exists $2;create database $2;use $2;source $MT;" &> /dev/null for i in $(grep "CREATE TABLE" $MT | awk '{print $3}' | sed "s#\`##g") do mysql -u root -p"$PW" -e "set foreign_key_checks=0;alter table $2.$i discard tablespace;" &> /dev/null cp -f $BK_DIR/$1/$i.cfg $BK_DIR/$1/$i.ibd $BK_DIR/$1/$i.frm $DT$2/ chown -R mysql:mysql $DT$2/ mysql -u root -p"$PW" -e "set foreign_key_checks=0;alter table $2.$i import tablespace;analyze table $2.$i;" &> /dev/null done echo `date "+%F %T"`" From $1 to $2 done." | tee -a xtra.log # delete the backup rm -rf $BK_DIR
以上是关于Xtrabackup 能不能做单库的备份恢复的主要内容,如果未能解决你的问题,请参考以下文章
通过Xtrabackup实现MySQL实例的全库备份与按需单库恢复