MySQL
MySQL备份
#!/bin/bash
set -e
USER="backup"
PASSWORD="backup"
# 数据库数据目录 #
DATA_DIR="/data/mysql"
BIN_INDEX=$DATA_DIR"/mysql-bin.index"
# 备份目录 #
BACKUP_DIR="/data/backup/mysql"
BACKUP_LOG="/var/log/mysql/backup.log"
DATE=`date +"%Y%m%d"`
TIME=`date +"%Y%m%d%H"`
LOG_TIME=`date +"%Y-%m-%d %H:%M:%S"`
DELETE_BINLOG_TIME="7 day"
INCREMENT_INTERVAL="3 hour"
note() {
printf "[$LOG_TIME] note: $*\n" >> $BACKUP_LOG;
}
warning() {
printf "[$LOG_TIME] warning: $*\n" >> $BACKUP_LOG;
}
error() {
printf "[$LOG_TIME] error: $*\n" >> $BACKUP_LOG;
exit 1;
}
full_backup() {
local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'`
for db in $dbs
do
local backup_dir=$BACKUP_DIR"/full/"$db
local filename=$db"."$DATE
local backup_file=$backup_dir"/"$filename".sql"
if [ ! -d $backup_dir ]
then
mkdir -p $backup_dir || { error "创建数据库 $db 全量备份目录 $backup_dir 失败"; continue; }
note "数据库 $db 全量备份目录 $backup_dir 不存在,创建完成";
fi
note "full backup $db start ..."
mysqldump --user=${USER} --password=${PASSWORD} --flush-logs --skip-lock-tables --quick $db > $backup_file || { warning "数据库 $db 备份失败"; continue; }
cd $backup_dir
tar -cPzf $filename".tar.gz" $filename".sql"
rm -f $backup_file
chown -fR mysql:mysql $backup_dir
note "数据库 $db 备份成功";
note "full backup $db end."
done
}
increment_backup() {
local StartTime=`date "-d $INCREMENT_INTERVAL ago" +"%Y-%m-%d %H:%M:%S"`
local DELETE_BINLOG_END_TIME=`date "-d $DELETE_BINLOG_TIME ago" +"%Y-%m-%d %H:%M:%S"`
local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'`
mysql -u$USER -p$PASSWORD -e "purge master logs before '$DELETE_BINLOG_END_TIME'" && note "delete $DELETE_BINLOG_TIME days before log";
filename=`cat $BIN_INDEX | awk -F "/" '{print $2}'`
for i in $filename
do
for db in $dbs
do
local backup_dir=$BACKUP_DIR"/increment/"$db
local filename=$db"."$TIME
local backup_file=$backup_dir"/"$filename".sql"
if [ ! -d $backup_dir ]
then
mkdir -p $backup_dir || { error "创建数据库 $db 增量备份目录 $backup_dir 失败"; continue; }
note "数据库 $db 增量备份目录 $backup_dir 不存在,创建完成";
fi
note "increment backup $db form time $StartTime start ..."
mysqlbinlog -d $db --start-datetime="$StartTime" $DATA_DIR/$i >> $backup_file || { warning "数据库 $db 备份失败"; continue; }
note "increment backup $db end."
done
done
for db in $dbs
do
local backup_dir=$BACKUP_DIR"/increment/"$db
local filename=$db"."$TIME
local backup_file=$backup_dir"/"$filename".sql"
cd $backup_dir
tar -cPzf $filename".tar.gz" $filename".sql"
rm -f $backup_file
note "数据库 $db 备份成功";
done
}
case "$1" in
full)
full_backup
;;
increment)
increment_backup
;;
*)
exit 2
;;
esac
exit 1