mysql数据库热备份

使用Percona XtraBackup

先安装依赖包

yum install -y perl-DBD-MySQL perl-DBI  perl-Time-HiRes libaio*

到Percona官网下载Percona XtraBackup,安装

然后执行热备份,官网有详细教程:http://www.percona.com/doc/percona-xtrabackup/2.1/howtos/setting_up_replication.html

最后面的参数是备份的目录;

#使用默认的 /etc/my.cnf 配置文件

innobackupex --user=xxx --password=xxx  /home/data/bak_mysql/  

由于我们使用的是单机多实例,所以配置文件里面修改了[mysqld]项,xtrabackup无法正确识别datadir,所以复制了一份,使用原来单数据库的格式,将默认的数据库datadir改为我们的主数据库datadir

#自定义配置文件

innobackupex --user=xxx --password=xxx --defaults-file=/home/data/xtrabackup.my.cnf /home/data/bak_mysql/  

innobackupex备份速度非常快,完成后会显示:innobackupex: completed OK!

--apply-log操作

innobackupex --user=yourDBuser --password=xxx --apply-log /path/to/backupdir/$TIMESTAMP/

这一步会将ibdata1与ib_logfile0,ib_logfile1的log sequence number对应起来,否则可能会出现表空间和事务日志不一致的情况,

InnoDB: Error: page xxx log sequence number xxx InnoDB: is in the future! Current system log sequence number xxx.

虽然数据库有重建innodb日志的功能,但是,还是避免的好...

 

下面可以直接用这个备份来做一个Mysql_multi的单机多实例,并且,不需要关闭原来的mysql;

将备份的目录$DATETIME目录改名为mysql2,

mv /home/data/bak_mysql/xxx /home/data/mysql2

chown -R mysql.mysql /home/data/mysql2

cp /etc/my.cnf /home/data/my.cnf

vim /home/data/my.cnf

#修改my.cnf,改为 多实例,参考mysqld_multi --example输出的例子; 

启动新增的实例; 

mysqld_multi --defaults-file=/home/data/my.cnf start 2

 

附上一些代码:

#!/bin/bash

DB_CONFIG=/data2/data/xtrabackup.my.cnf
DB_USER=xxx
DB_PASS_FILE='/etc/db/'$DB_USER
BACKUP_HOME=/data2/data

# get database password
function getDbPass()
{
    RET=`cat $DB_PASS_FILE`
    echo $RET
}
DB_PASS=$(getDbPass)

cd $BACKUP_HOME
# partial backup 
function partial_backup(){
    innobackupex --defaults-file=$DB_CONFIG \
                                 --user=$DB_USER --password=$DB_PASS \
                                 --databases=/xxx/dump.tables \
                                 $BACKUP_HOME
    YEAR=`date +"%Y"`
    timestamp=`ls |grep 2014 |head -n 1`  #得到时间戳名字
    
    innobackupex --user=$DB_USER -password=$DB_PASS --apply-log --export $BACKUP_HOME/$timestamp/
    chown -R mysql.mysql $BACKUP_HOME/$timestamp/
}

#full backup , can be used as a slave , or base backup
function full_backup(){
    innobackupex --defaults-file=$DB_CONFIG \
                                 --user=$DB_USER --password=$DB_PASS \
                                 $BACKUP_HOME
    timestamp=`ls |grep 2014 |head -n 1`  #得到时间戳名字
    innobackupex --defaults-file=$DB_CONFIG --user=$DB_USER --password=$DB_PASS --apply-log $BACKUP_HOME/$timestamp/
    chown -R mysql.mysql $BACKUP_HOME/$timestamp/
}

#incremental backup , can be used as a slave , or base backup
function incremental_backup(){
    timestamp=`ls |grep 2014 |head -n 1`  #得到时间戳名字
    INCREMENTAL_BASE_DIR=/data2/data/mysql3/
    BACKUP_DIR=/data2/data/backups/
    innobackupex --user=$DB_USER --password=$DB_PASS \
                        --incremental $BACKUP_DIR \
                        --incremental-basedir=$INCREMENTAL_BASE_DIR
    #同样可以使用LSN来进行增量备份
    #innobackupex --incremental $BACKUP_DIR --incremental-lsn=XXX
}

full_backup

 

 

 

 

 

 

posted @ 2013-11-23 15:52  ifeixiang  阅读(4593)  评论(0编辑  收藏  举报