由于数据每次全备份需要耗费很大资源,所以增量备份成了必要的方案,增量备份根据mysql-log对最新的mysql-log进行备份,然后又生成新的mysql-log继续记录,如此往复,从而达到备份完整数据的效果。 

mysql-inc-backup-1.png

1、在 /etc/my.cnf 下面设置开启bin-log

 1)编辑vim /etc/my.cnf 

[mysqld] 

binlog_format = MIXED //binlog日志格式 

log_bin =目录/mysql-bin.log //binlog日志名 

expire_logs_days = 7 //binlog过期清理时间 

#max_binlog_size 100m //binlog每个日志文件大小 最大值和默认 //是1个G 

binlog-do-db=game #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可 

binlog-do-db=platform # #binlog-ignore-db=不需要备份的数据库,如果备份多个数据库,重复设置这个选项即可

 2)重启mysql service mysqld restart 

2、 第一次全备份数据库 

# mysqdump -uroot -proot --master-data=2 --lock-all-tables --flush-log -A > /bak/bak.sql 

3、执行增量备份 

当第一次备份完成之后,往后的增量备份只需重复下面操作即可 

# cd /usr/local/mysql/var/ 

# tail -n1 mysql-bin.index //获取当前最新的mysql-log.记录文件,假设这里为mysql-bin.01 

# mysql -uroot -proot -e “flush logs;” //这里mysql-bin.index会更新为mysql-bin.02 

# cp mysql-bin.01 /bak/ mysql-bin.01.bak  

4、执行增量备份脚本, 在crontab设置定时开启 

#!/usr/bin/ 

# $USERNAME: 数据库用户名 

# $PASSWORD: 数据库密码 

# $MYSQL: 数据库客户端执行路径 

# $MYSQLLOGDIR: 存放mysql-log的目录 

# $BACKUPDIR: 存放备份文件的地方 

USERNAME='root' 

PASSWORD='root' 

MYSQL='/usr/local/mysql/bin/mysql' 

MYSQLLOGDIR='/usr/local/mysql/var/' 

BACKUPDIR='/data/backup/' 

 if [ ! -d "$BACKUPDIR" ]; 

then 

 mkdir -p "$BACKUPDIR" 

fi 

 if [ ! -d "MYSQLLOGDIR" ]; 

then 

    echo "MySQL Log Dir doesn't exists" 

    exit 

fi 

 cd $MYSQLLOGDIR 

if [ ! -e "mysql-bin.index" ];

 then 

   echo "Can't not found the mysql-bin.index" 

   exit 

fi 

 LASTLOGFILE=`tail -n1 'mysql-bin.index'` 

$MYSQL -u$USERNAME -p$PASSWORD -e "flush logs;" 

cp $LASTLOGFILE "${BACKUPDIR}/${LASTLOGFILE}.bak" 

版权声明:未经博主允许不得转载。http://www.smister.com/post-39/mysql-incremental-backup.html