percona-xtrabackup备份mysql


title: 1.percona-xtrabackup备份mysql
date: 2016-04-10 23:19:12
tags: mysql
categories: mysql
---mysql

1、percona-xtrabackup

它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务建立Innodb热备份;
为mysql作增量备份;在mysql服务器之间作在线表迁移;使建立replication更加容易;备份mysql而不增长服务器的负载。
percona是一家老牌的mysql技术咨询公司。它不只提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本--percona Server。并围绕
percona Server还发布了一系统的mysql工具。
innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其余的一些功能,他不但能够全量备份/恢复,还能够基于时间的增量备份与恢复。
innobackupex备份原理
innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件 xtrabackup_suspended ;而后执行“FLUSH TABLES WITH READ LOCK”来备份其余的文件
innobackupex恢复原理
innobackupex首先读取my.cnf,查看变量sql

(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)
对应的目录是存在,肯定相关目录存在后,而后先copy myisam表和索引,而后在copy innodb的表、索引和日志。数据库

=================================================================================centos

环境:bash

centos6.6服务器

数据库:mysql5.5.16app

xtrabackup:v1.5.1socket

=================================================================================函数

1)完整备份工具

命令:innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE BACK_DIR_PATH


1. # PASSWORD 数据库密码
2. # DATE 数据库名
3. # --database=DATE 针对全部库作备份去掉该选项便可
4. # BACK_DIR_PATH 彻底备份目录位置
5. 注:该命令执行后会在备份目录位置以当前时间为命名生成一个目录,备份的文件会备份到该目录中。例如2014-12-06_16-00-15
6. #--port=端口号
7. #--no-timestamp 此参数能够取消自动时间戳

2)完整备份的恢复

  1. 首先须要备份数据库
  2. 中止数据库运行
  3. 删除数据库目录内全部文件
  4. 而后执行下列命令进行恢复
  5. 恢复第一步:应用日志。

    innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --apply-log BACK_DIR_PATH/你的全备数据库文件名
    参数:
    # PASSWORD 数据库密码
    # DATE 数据库名
    # BACK_DIR_PATH 彻底备份目录位置
    #恢复第二步:拷贝文件。

    innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --copy-back /BACK_DIR_PATH

注释一下,经常使用的参数。

--defaults-file=/etc/my.cnf     恢复会使用my.cnf文件把须要恢复的文件,恢复到my.cnf指定的位置。
--apply-log            这是备份时产生的日志,
--copy-back            这是备份源,解压后的备份文件。
--database=DATE        若是不加此参数,默认恢复所有数据库

提示:若是重启服务报错。文章结尾有解决办法。

3)增量备份

innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --incremental-basedir=BACK_DIR_PATH/全备数据库的文件名 --incremental BACK_DIR_ZENG_1

2. # PASSWORD 数据库密码
3. # DATE 数据库名
4. # BACK_DIR_PATH 彻底备份目录位置
5. # BACK_DIR_ZENG_1 第一次增量备份目录位置
6. # --incremental-basedir 该选项后面写的为第一次完整备份的路径
7. 注:这次增量备份是在第一次完整备份的基础之上进行的增量备份

4)第二次增量备份

innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWORD --database=DATE --incremental-basedir=BACK_DIR_ZENG_1 --incremental BACK_DIR_ZENG_2
2. # PASSWORD 数据库密码
3. # DATE 数据库名
4. # BACK_DIR_PATH 彻底备份目录位置
5. # BACK_DIR_ZENG_1 第一次增量备份目录位置
6. # BACK_DIR_ZENG_2 第二次增量备份目录位置
7. # --incremental-basedir 该选项后面写的为第一次增量备份的路径
8. 注:这次增量备份是在第一次增量备份的基础之上进行的第二次增量备份

5)屡次增量备份以后的恢复

一、首先须要备份现有数据库
二、中止数据库运行
三、删除数据库目录内全部文件
四、而后执行下列命令进行恢复
先恢复第一次全备的数据库的应用日志
命令:
innobackupex --defaults-file=/etc/my.cnf --user=root --password='密码' --apply-log --redo-only BACK_DIR_PATH

恢复第一次增量备份的数据库应用日志
innobackupex --defaults-file=/etc/my.cnf --user=root --password='密码' --apply-log --redo-only BACK_DIR_PATH --incremental-dir=BACK_DIR_ZENG_1 
恢复第二次增量备份的数据库应用日志
innobackupex --defaults-file=/etc/my.cnf --user=root --password='密码' --apply-log BACK_DIR_PATH --incremental-dir=BACK_DIR_ZENG_2

1. # BACK_DIR_PATH 彻底备份目录位置
2. # BACK_DIR_ZENG_1 第一次增量备份目录位置
3. # BACK_DIR_ZENG_2 第二次增量备份目录位置
4. 注: 若是只有2次增量备份则执行此条命令,若是有屡次增量命令,则参照上一条命令
5. 最后一次恢复的时候不须要加--redo-only这个参数。

=================================================================================

恢复第三步:
修改文件权限。
cd 到data目录
chown -R mysql.mysql data、
可能出现的报错:
一、出现下面错误,
# ./mysql.server start
Starting MySQL...The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED] 
初始化一下mysql
# ./mysql_install_db --basedir=/你的mysql 目录 --no-defaults --skip-name-resolve --user=mysql --datadir=/你的数据存放目录

二、权限:应该恢复使用的是root用户,可是MySQL须要MySQL用户去访问。
# ./mysql.server restart
MySQL server PID file could not be found![FAILED]
Starting MySQL.The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED]

三、链接MySQL的时候
#./mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
没有这个文件,touch  mysql.sock 并修改文件权限。

恢复备份文件要保证datadir文件为空,不然会报以下的错误
# innobackupex --user=root   /data/backup/
IMPORTANT: Please check that the copy-back run completes successfully.
       At the end of a successful copy-back run innobackupex
       prints "completed OK!".
Original data directory is not empty! at /usr/bin/innobackupex line 568.

=================================================================================

实例脚本:

脚本是每周天整备,周一到周六增倍

自动判断是否存在昨天和今天的数据来进行全备或者增倍

#!/bin/bash
export PATH=$PATH:/usr/local/xtrabackup/bin
HOST=127.0.0.1
DATE=`date  +"%Y-%m-%d-%A"`
LASTDATE=`date  +"%Y-%m-%d-%A" -d  "-1 days"`
DATEDAY=`date +%A`
WEEKDAY='Sunday'
BACKUP_DIR_PATH=/要备份的目录
FILE_CNF=/usr/local/mysql55/conf/配置文件
USER_NAME=用户名
PASSWORD="密码"
MYPORT=端口号
#全备备份函数
cd $BACKUP_DIR_PATH
all_bak () {
echo "start $DATE-all" >> $BACKUP_DIR_PATH/access.log
innobackupex --defaults-file=$FILE_CNF --user=$USER_NAME --password=$PASSWORD --port=MYPORT --host=$HOST --no-timestamp $BACKUP_DIR_PATH/$DATE-all
if [ $? -eq 0 ];then
   echo "$DATE-all is succeed" >> $BACKUP_DIR_PATH/access.log
   tar -zcvf $BACKUP_DIR_PATH/$DATE-all.tar.gz $DATE-all
   if [ $? -eq 0 ];then
       echo "$DATE-all is packaging succeed" >> $BACKUP_DIR_PATH/access.log
#       rm -rf $DATE-all
   else
   echo "$DATE-all is packaging failure" >> $BACKUP_DIR_PATH/access.log
   fi
else
   echo "$DATE-all is failure" >> $BACKUP_DIR_PATH/access.log
fi
echo "stop $DATE-all" >> $BACKUP_DIR_PATH/access.log
}
#增量备份函数
incremental(){
echo "start $DATE-incremental" $BACKUP_DIR_PATH/access.log  
innobackupex --defaults-file=$FILE_CNF --user=$USER_NAME --password=$PASSWORD --port=MYPORT  --host=$HOST --incremental-basedir=$BACKUP_DIR_PATH/$LASTDATE-$1 --no-timestamp --incremental $BACKUP_DIR_PATH/$DATE-incremental 
if [ $? -eq 0 ];then
   echo "$DATE-incremental is succeed" >> $BACKUP_DIR_PATH/access.log
   tar -zcvf $BACKUP_DIR_PATH/$DATE-incremental.tar.gz $DATE-incremental
   if [ $? -eq 0 ];then
       echo "$DATE-incremental is packaging succeed" >> $BACKUP_DIR_PATH/access.log
#      rm -rf $DATE-incremental
   else
       echo "$DATE-ncremental  is packaging failure" >> $BACKUP_DIR_PATH/access.log
   fi
else
   echo "$DATE-incremental is failure" >> $BACKUP_DIR_PATH/access.log
fi
echo "stop $DATE-incremental" >> $BACKUP_DIR_PATH/access.log
}
#判断数据库备份存放目录,不存在建立
if [ ! -d $BACKUP_DIR_PATH ];then
    mkdir $BACKUP_DIR_PATH
fi
#判断若是今天是周天,那么全备,不然增备
if [ $DATEDAY = $WEEKDAY ];then
    if [ ! -d "$BACKUP_DIR_PATH/$DATE-all" ];then
    all_bak
    fi
else
    #判断昨天的数据是否存在
    if [ ! -d "$BACKUP_DIR_PATH/$LASTDATE-all" ];then
    if [ ! -d "$BACKUP_DIR_PATH/$LASTDATE-incremental" ];then
        if [ ! -d "$BACKUP_DIR_PATH/$DATE-all" ];then
            if [ ! -d "$BACKUP_DIR_PATH/$DATE-incremental" ];then
            all_bak
        fi
        fi
    else
        if [ ! -d "$BACKUP_DIR_PATH/$DATE-incremental" ];then
            incremental incremental
        fi
    fi
    else
    #若是昨天是全备,今天增量不存在,那么进行增量备份
    if [ ! -d "$BACKUP_DIR_PATH/$DATE-incremental" ];then
        incremental all
    fi
fi
fi
相关文章
相关标签/搜索