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实例的全库备份与按需单库恢复

xtrabackup备份工具两种命令单库增量备份还原

如何用Percona XtraBackup进行MySQL从库的单表备份和恢复

Mysql 备份恢复与 xtrabackup备份

Mysqldump 备份恢复与xtrabackup备份

mysqls