前几天为了给公司的mysql数据库做了个从机,从机直接从主机复制数据过来进行同步。为了能对主数据库数据进行备份,我写了个脚本,想法如下:
即每天0点与12点各做一次全备,每隔两个小时做一次增量备份。
脚本调了好些回,其实原理很简单,最后对备份文件进行隔天压缩来节省空间。里面用的是Innobackupex进行备份。
#!/bin/bash
# file: mysql_back.sh
# Author: jacky lau 2012-5-21
tim=`date +%H%M | cut -c 1,2`
data_path=/home/data/$(date -d "today" +"%m")/$(date -d "today" +"%d")
can=`find $data_path/ -cmin -125 -type d | awk -F/ '{print $6}' | grep -v full | uniq | grep -v "^$"`
inc=`find $data_path/ -cmin -125 -type d -name "*inc" | wc -l`
# Create directory
if [ ! -d $data_path ]
then
mkdir -p $data_path
else
echo "目录已经存在,退出。"
fi
# Full backup
if [ $tim -eq "00" ]
then
echo -e " #################################################"
echo -e " # 00:00:00 full backup of all databases #"
echo -e " #################################################"
echo "00:00:00 开始全备份..."`date`
/usr/bin/innobackupex --user=bakuser --password=1 --defaults-file=/etc/my.cnf --no-timestamp --socket=/usr/local/mysql/tmp/mysql.sock $data_path/full_1
echo "00:00:00 全备完毕..."`date`
elif [ $tim -eq "12" ]
then
echo -e " #################################################"
echo -e " # 12:00:00 full backup of all databases #"
echo -e " #################################################"
echo "12:00:00 开始全备份..."`date`
/usr/bin/innobackupex --user=bakuser --password=1 --defaults-file=/etc/my.cnf --no-timestamp --socket=/usr/local/mysql/tmp/mysql.sock $data_path/full_2
echo "12:00:00 全备完毕..."`date`
fi
if [ $tim -ge "00" -a $tim -lt "12" -a $inc -lt "1" ]
then
echo "0点开始首次增量备份..."`date`
echo "创建增量备份目录"
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=1 --no-timestamp --socket=/usr/local/mysql/tmp/mysql.sock --incremental --incremental-basedir=$data_path/full_1 $data_path/$(date -d "today" +"%H")-inc
echo "0点首次增量备份结束..."`date`
elif [ $tim -ge "12" -a $tim -lt "23" -a $inc -lt "1" ]
then
echo "12点开始首次增量备份..."`date`
echo "创建增量备份目录"
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=1 --no-timestamp --socket=/usr/local/mysql/tmp/mysql.sock --incremental --incremental-basedir=$data_path/full_2 $data_path/$(date -d "today" +"%H")-inc
echo "12点首次增量备份结束..."`date`
elif [ $tim -ge "1" ]
then
echo -e "########################################"
echo -e "# incremental backup #"
echo -e "########################################"
echo -e "开始增量备份..."`date`
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=1 --no-timestamp --socket=/usr/local/mysql/tmp/mysql.sock --incremental --incremental-basedir=$data_path/${can} $data_path/$(date -d "today" +"%H")-inc
echo "增量备份结束..."`date`
else
echo "退出!"
fi
# compress the data file.
if [ $tim -eq "02" ]
then
echo "开始压缩一天的备份..."
cd $data_path/
cd ..
/bin/tar czvf $(date -d "yesterday" +"%Y")-$(date -d "yesterday" +"%m")-$(date -d "yesterday" +"%d")-$(date -d "yesterday" +"%M").tar.gz $(date -d "yesterday" +"%d")/
echo "压缩完毕!"
# Delete the file of one day
echo "删除源文件..."
/bin/rm $(date -d "yesterday" +"%d")/ -rf
echo "删除完毕!"
fi