自动化运维,是数据库管理员的不懈追求。目前出现了一些数据库自动管理平台,但出现时间较短,不够稳定。最常用的工具依然是shell脚本。
现在需要管理的某mysql数据库,数据量在800G,使用dump备份时间过长,从而使用了网上推荐的innobackupex方式。影响备份速率的因素很多,这里就不一一讨论,也可以添加
--parallel 参数,开启多并行度备份,但会增加服务器负荷。
以下是我写的备份脚本,要求备份目录的磁盘容量至少是数据文件的3倍以上。
#每天备份一次。一次全量,与两次增量,循环备份。备份保留三天。 #!/bin/bash # 定义变量 user_name=root password="123456" socket="/mysqldb/home/mysql.sock" file_cnf=/mysqldb/config/my.cnf BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"` format_time=`date +"%Y-%m-%d_%H:%M:%S"` #week=`date +%Y-%m-%d -d "-24hour"` time=`date +"%Y-%m-%d"` time_old=$( date +"%Y-%m-%d" -d "-24hour" ) backupbin=/usr/bin backdir=/mysql_backup/$time #备份目录,数据文件形式,保留一天,第二天压缩 old_dir=/mysql_backup/$time_old redo=/mysql_backup/redofile #留存目录,tar.gz格式 out_log=/mysql_backup/info/xtrabackup_log_$format_time #innobackupex输出信息日志 time_cost=/mysql_backup/info/xtrabackup_time.txt #innobackupex记录 #创建目录 if [ ! -d "/mysql_backup/redofile" ]; then mkdir -p /mysql_backup/redofile fi if [ ! -f "/mysql_backup/info/xtrabackup_time.txt" ]; then mkdir -p /mysql_backup/info/ touch /mysql_backup/info/xtrabackup_time.txt fi #全量、增量备份 #如果今天有full,则创建incr1 if [ -d "$backdir"_full ];then (echo "#####开始今日一次增量备份 at $BEGINTIME " ) && >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$backdir"_full "$backdir"_incr1 1> $out_log 2>&1 tar -czvf ${redo}/redofile_"$time"_full.tar.gz "$backdir"_full >/dev/null 2>&1; rm -rf "$backdir"_full; break; #如果今天有incr1,则创建incr2 elif [ -d "$backdir"_incr1 ];then (echo "#####开始今日第2次增量备份 at $BEGINTIME " ) && >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$backdir"_incr1 "$backdir"_incr2 1> $out_log 2>&1 tar -czvf ${redo}/redofile_"$time"_incr1.tar.gz "$backdir"_incr1 >/dev/null 2>&1 rm -rf "$backdir"_incr1; break; #如果昨天没有文件,则创建全量 elif [ ! -d "$old_dir"_* ];then (echo "#####创建[新]全量备份 at $BEGINTIME " ) && >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket "$backdir"_full 1> $out_log 2>&1 break; #如果昨天有incr2,则创建full elif [ -d "$old_dir"_incr2 ];then (echo "#####覆盖[旧]备份,创建[新]全量备份 at $BEGINTIME " ) && >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket $backdir 1> $out_log 2>&1 mv "$backdir" "$backdir"_full break; #如果昨天有full,则创建incr1 elif [ -d "$old_dir"_full ];then (echo "#####开始第1次增量备份 at $BEGINTIME ") && >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_full "$backdir"_incr1 1> $out_log 2>&1 break; #如果昨天有incr1,则创建incr2 elif [ -d "$old_dir"_incr1 ];then (echo "#####开始第2次增量备份 at $BEGINTIME " ) && >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_incr1 "$backdir"_incr2 1> $out_log 2>&1 break; fi #对昨天的文件压缩归档,删除三天前的文件 a=`ls /mysql_backup|grep "$time_old"_*`; if [ -d "$old_dir"_* ];then tar -czvf ${redo}/redofile_${a}.tar.gz "$old_dir"_* >/dev/null 2>&1 #删除已归档文件夹 rm -rf "$old_dir"_* && echo "#####删除已归档的数据文件"$old_dir"" 1>>$time_cost break; fi #删除3天前的归档文件 find /mysql_backup/redofile/ -mtime +3 -name "redofile_*" && echo "#####删除3天前的归档文件">>$time_cost; find /mysql_backup/redofile/ -mtime +3 -name "redofile_*" -exec rm -rf {} ; #输出时间变量 b=`(ls /mysql_backup/${*} |grep ''-'')` ENDTIME=`date +"%Y-%m-%d %H:%M:%S"` begin_data=`date -d "$BEGINTIME" +%s` end_data=`date -d "$ENDTIME" +%s` spendtime=`expr $end_data - $begin_data` (echo "耗时 $spendtime sec 用于创建备份文件 $b") && >>$time_cost
脚本写完后,加入crontab中,我设置的是每天23点30份执行
30 23 * * * /root/innobackupex.sh
注意脚本的执行权限
恢复的脚本预计下周写完。