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