编写脚本令Xtrabackup对MySQL数据进行备份的教程_Mysql

Xtrabackup备份恢复原理
备份innodb表时,xtrabackup若干个线程拷贝独立表空间的.ibd文件,并不停监视此过程中redo log的变化,添加到自己的事务日志文件(xtrabackup_logfile)中。在此过程中,发生的物理写操作越多,xtrabackup_logfile越大。在拷贝完成后的第一个prepare阶段,xtrabackup采用类似于innodb崩溃恢复的方法,把数据文件恢复到与日志文件一致的状态,并把未提交的事务回滚。如果同时需要备份myisam表以及innodb表结构等文件,那么就需要用flush tables with lock来获得全局锁,开始拷贝这些不再变化的文件,同时获得binlog位置,拷贝结束后释放锁,也停止对redo log的监视。
 
很多同学对上面的理解有混淆,以为拷贝.ibd文件就跟操作系统拷贝文件一样。其实这里涉及到fractured page的问题,他应该会重新读取(应该也有重试次数,超过后备份不成功)。
 
其实这个原理很简单,了解下doublewrite就可以理解了“本段摘录自《MySQL技术内幕:InnoDB存储引擎》”:
如果说插入缓冲带给InnoDB存储引擎的是性能,那么两次写带给InnoDB存储引擎的是数据的可靠性。当数据库宕机时,可能发生数据库正在写一个页面,而这个页只写了一部分(比如16K的页,只写前4K的页)的情况,我们称之为部分写失效(partial page write)。在InnoDB存储引擎未使用double write技术前,曾出现过因为部分写失效而导致数据丢失的情况。
 
有人也许会想,如果发生写失效,可以通过重做日志进行恢复。这是一个办法。但是必须清楚的是,重做日志中记录的是对页的物理操作,如偏移量800,写“aaaa”记录。如果这个页本身已经损坏,再对其进行重做是没有意义的。这就是说,在应用(apply)重做日志前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewrite。

一、下载和安装
XtraBackup现在最新版本为2.1.5,官方也提供了2.0的版本可供下载,官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装。由于没有需要特殊定制的,因此建议直接使用RPM安装即可。

安装方法一:
下载RPM安装包:

wget http://www.percona.com/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm

安装依赖:

[root@localhost ~]# yum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio*

安装:

[root@localhost ~]# rpm -ivh percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm
Preparing...           ########################################### [100%]
1:percona-xtrabackup   ########################################### [100%]

安装方法二:
安装percona源:

[root@localhost ~]# rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm

使用yum安装percona-xtrabackup:

[root@localhost ~]# yum -y install percona-xtrabackup

查看安装结果:

[root@localhost ~]# rpm -qa |grep xtrabackup
percona-xtrabackup-2.1.5-680.rhel6.x86_64
[root@localhost ~]# rpm -ql percona-xtrabackup-2.1.5-680.rhel6.x86_64
/usr/bin/innobackupex
/usr/bin/innobackupex-1.5.1
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/bin/xtrabackup_55
/usr/bin/xtrabackup_56
/usr/share/doc/percona-xtrabackup-2.1.5
/usr/share/doc/percona-xtrabackup-2.1.5/COPYING

Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备份innodb, xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;

innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

二、备份脚本

#!/bin/sh
#===================================================================================================
## 备份工具:
##  percona-xtrabackup-2.2.6
##
## 备份策略:
##  (1)、每天凌晨04:20点进行全量备份一次;
##  (2)、每隔1小时增量备份一次;
##
#===================================================================================================
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

## DB备份基路径
BACKUP_BASE_DIR="/data/mysql_backup"

## 增量备份时,用到的基准目录列表文件
## 内容格式:基准目录|本次备份目录|备份类型【full|inc】
INC_BASE_LIST="${BACKUP_BASE_DIR}/incremental_basedir_list.txt"

## 备份工具路径
XTRABACKUP_PATH="/usr/local/xtrabackup/bin/innobackupex"

## MySQL配置路径
MYSQL_CNF_PATH="/etc/my.cnf"

## 线程数
THREAD_CNT=6

#===================================================================================================
function print_help_info()
{
  echo "--------------------------------------------------------------"
  echo "Usage: $0 full | inc | help"
  echo "--------------------------------------------------------------"
  echo ""
  exit 1
}

[[ $# -lt 1 ]] && print_help_info
[[ -d ${BACKUP_BASE_DIR} ]] || mkdir -p ${BACKUP_BASE_DIR}

## xtrabackup基础套件不存在时,进行自动下载安装
if [[ ! -e ${XTRABACKUP_PATH} ]]; then
  cd /usr/local
  wget -q -O xtrabackup-2.2.6.tgz http://www.percona.com/redir/downloads/XtraBackup/LATEST/binary/tarball/percona-xtrabackup-2.2.6-5042-Linux-x86_64.tar.gz
  tar xvzf xtrabackup-2.2.6.tgz >/dev/null 2>&1 && rm -f xtrabackup-2.2.6.tgz
  mv percona-xtrabackup-2.2.6-Linux-x86_64 xtrabackup-2.2.6
  rm -rf xtrabackup && ln -s xtrabackup-2.2.6 xtrabackup

  for FNAME in `ls -1t /usr/local/xtrabackup/bin`
  do
    rm -f /usr/bin/${FNAME} && ln -s /usr/local/xtrabackup/bin/${FNAME} /usr/bin/${FNAME}
  done
fi

## 只允许一个副本运行,以避免全量备份与增量备份出现交叉,发生数据错乱的可能性
##[[ -n `ps uax | grep innobackupex | grep -v grep` ]] && exit 1

## 目录名默认精确到分钟,为避免意外情况,导致备份任务失败,可以精确到秒
CURRENT_BAK_PATH="${BACKUP_BASE_DIR}/"`date +%F_%H-%M`
[[ -d ${CURRENT_BAK_PATH} ]] && CURRENT_BAK_PATH="${BACKUP_BASE_DIR}/"`date +%F_%H-%M-%S`

#===================================================================================================
## 全量备份
if [[ "$1" == "full" ]]; then
  ${XTRABACKUP_PATH} --user=root --defaults-file=${MYSQL_CNF_PATH} --parallel=${THREAD_CNT} --no-timestamp ${CURRENT_BAK_PATH}
  echo "NULL|${CURRENT_BAK_PATH}|full" >> ${INC_BASE_LIST}

## 增量备份
elif [[ "$1" == "inc" ]]; then
  ## 基准目录列表文件不存在或者为空的情况,需要做一次全量备份
  if [[ ! -f ${INC_BASE_LIST} || `sed '/^$/d' ${INC_BASE_LIST} | wc -l` -eq 0 ]]; then
    ${XTRABACKUP_PATH} --user=root --defaults-file=${MYSQL_CNF_PATH} --parallel=${THREAD_CNT} --no-timestamp ${CURRENT_BAK_PATH}
    echo "NULL|${CURRENT_BAK_PATH}|full" >> ${INC_BASE_LIST}

  ## 不存在任何目录的情况,需要做一次全量备份,以避免增量备份失败
  elif [[ `find ${BACKUP_BASE_DIR} -maxdepth 1 -type d | wc -l` -eq 1 ]]; then
    ${XTRABACKUP_PATH} --user=root --defaults-file=${MYSQL_CNF_PATH} --parallel=${THREAD_CNT} --no-timestamp ${CURRENT_BAK_PATH}
    echo "NULL|${CURRENT_BAK_PATH}|full" >> ${INC_BASE_LIST}

  ## 在上一次备份的基础上,进行增量备份
  else
    PREV_BACKUP_DIR=`sed '/^$/d' ${INC_BASE_LIST} | tail -1 | awk -F '|' '{print $2}'`
    ## 上次的备份目录不存在或者目录为空的情况,以避免人为删除的可能性【针对部分恶意删除的情况,目前还没有较好的检查方法】
    if [[ ! -d ${PREV_BACKUP_DIR} || -z `ls ${PREV_BACKUP_DIR}` ]]; then
      ${XTRABACKUP_PATH} --user=root --defaults-file=${MYSQL_CNF_PATH} --parallel=${THREAD_CNT} --no-timestamp ${CURRENT_BAK_PATH}
      echo "NULL|${CURRENT_BAK_PATH}|full" >> ${INC_BASE_LIST}
    else
      ${XTRABACKUP_PATH} --user=root --defaults-file=${MYSQL_CNF_PATH} --parallel=${THREAD_CNT} --no-timestamp --incremental ${CURRENT_BAK_PATH} --incremental-basedir=${PREV_BACKUP_DIR}
      echo "${PREV_BACKUP_DIR}|${CURRENT_BAK_PATH}|inc" >> ${INC_BASE_LIST}
    fi
  fi

elif [[ "$1" == "help" ]]; then
  print_help_info

else
  print_help_info
fi

## 删除2周前的数据备份
rm -rf ${BACKUP_BASE_DIR}/`date -d '14 days ago' +'%F'`_*
sed -i "/`date -d '14 days ago' +'%F'`/d" ${INC_BASE_LIST}

#===================================================================================================
##The End

####################################################################################################
## 需要添加的crontab信息:
##   (1)、全量备份
##   20 04 * * * /data/scripts/mysql_backup.sh full >/dev/null 2>&1
##
##   (2)、增量备份
##   00 * * * * /data/scripts/mysql_backup.sh inc >/dev/null 2>&1
##
####################################################################################################

####################################################################################################
## DB数据恢复步骤:
##  (1)、应用基准
##  innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log --redo-only /data/mysql_backup/full
##
##  (2)、应用第一个增量备份
##  innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log --redo-only /data/mysql_backup/full --incremental-dir=/data/mysql_backup/inc_one
##
##  (3)、应用第二个增量备份
##  innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log /data/mysql_backup/full --incremental-dir=/data/mysql_backup/inc_two
##
##  (4)、再次应用基准
##  innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log /data/mysql_backup/full
##
##  (5)、恢复
##  innobackupex --user=root --defaults-file=/etc/my.cnf --copy-back /data/mysql_backup/full
####################################################################################################

三、效果展示

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 备份
, 教程
, MySQL教程
xtrabackup
mysql脚本编写、mysql数据库脚本编写、mysql启动脚本编写、mysql脚本编写语法、mysql脚本编写工具,以便于您获取更多的相关知识。

时间: 2024-12-24 08:06:12

编写脚本令Xtrabackup对MySQL数据进行备份的教程_Mysql的相关文章

MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原教程_Mysql

大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推荐xtrabackup,这个工具比mysqldump要快很多. 一.Xtrabackup介绍 1.Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品. Xtrabackup有两个主要的工具:xtrabackup.innobackupex 1.xtraback

shell脚本+crontab实现MySQL数据自动备份压缩

当数据库中数据越来越多的时候,数据的备份是何等的重要,下面我们就来用 shell脚本 + crontab定时任务来实现MySQL的数据备份(支持多数据库),关于shell和crontab的用法这里不再做过多的解释,还不太会使用的同学可以查阅相关资料进行学习. #!/bin/bash        # 要备份的数据库名,多个数据库用空格分开 例如 (database1 database2 database2) databases=(mydatebase)        # 备份文件要保存的目录 b

将数据插入到MySQL表中的详细教程_Mysql

将数据插入到MySQL表,需要使用SQL INSERT INTO命令.可以将数据插入到MySQL表使用mysql>提示符下或使用任何脚本,如PHP.语法: 下面是通用的SQL语法INSERT INTO命令来插入数据到MySQL表: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 要插入的字符串数据类型,所有的值需要双或单引号,例如: - "value"

MYSQL数据同步备份复制

mysql|备份|数据|数据同步 设置 MySql 数据同步 mysql从3.23.15版本以后提供数据库复制功能.利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能 数据库同步复制功能的设置都在mysql的设置文件中体现.mysql的配置文件(一般是my.cnf),在unix环境下在/etc/mysql/my.cnf 或者在mysql用户的home目录下的my.cnf. window环境中,如果c:根目录下有my.cnf文件则取该配置文件.当运行mysql的winmysqladmi

MySQL主从复制配置 MySQL数据自动备份配置

使用MySQL主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务: 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率: 3.将主服务器上的数据复制到从服务器上,保护数据免受意外的损失: mysql服务器的主从配置,本来是一件很简单的事情,无奈不是从零开始,总是在别人已经安装好的mysql服务器之上 ,这就会牵扯到,mysql的版本,启动文件,等一些问题. 不过没关系,先问清楚两点 1.mysql配置文件my.cnf的位置

Mysql主从同步备份策略分享_Mysql

环境:主从服务器上的MySQL数据库版本同为5.1.34主机IP:192.168.0.1从机IP:192.168.0.2一. MySQL主服务器配置1.编辑配置文件/etc/my.cnf# 确保有如下行server-id = 1log-bin=mysql-binbinlog-do-db=mysql  #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可binlog-ignore-db=mysql  #不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可log-slave-up

深入解析Linux下MySQL数据库的备份与还原_Mysql

深入解析Linux下MySQL数据库的备份与还原 1. 备份 [root@localhost ~]# cd /var/lib/mysql (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录) [root@localhost mysql]# mysqldump -u root -p voice>voice.sql,输入密码即可. 2. 还原法一:[root@localhost ~]# mysql -u root -p 回车,输入密码,进入MySQL的控制台"mysql>&

MySQL HandlerSocket插件安装配置教程_Mysql

一.HandlerSocket是什么?HandlerSocket是akira higuchi写的一个MySQL的插件.以MySQL Daemon Plugin的形式提供类似NoSQL的网络服务,通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释.打开关闭表.创建查询计划等CPU开销. 目前使用MySQL的网站,多半同时使用Memcache作为键值缓存.虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Mem

Centos6.4编译安装mysql 8.0.0 详细教程_Mysql

本文实例为大家分享了Centos6.4编译mysql  8.0.0 安装配置方法,供大家参考,具体内容如下 操作系统说明:CentOS 6.4数据库版本:MySQL 8.0.0 一.环境准备 yum install ncurses-devel -y yum install libaio -y yum install glibc-devel.i686 glibc-devel -y yum install gcc gcc-c++ -y 另外,MySQL8.0需要用gcc的版本为 4.8以上,而cen