需求描述
实现如下MySQL备份功能:
1、对MySQL库表schema 及 数据 进行定时备份 2、滚动删除指定日期(如30天)前的所有备份数据
测试脚本
vim /data/backup/scripts/MySQL_Backup.sh
#!/bin/bash
set -x
USERNAME="DB_Backuper"
PASSWORD="DB_Backuper"
DBHOST="localhost"
PORT=3306
MySQL_BACKUP_DBLIST="db_1|db_2|db_3|db_4|db_5"
MySQL_STORAGE_BACKUP_PATH="/data/backup/data"
MySQL_BIN_PATH="/usr/bin"
Y_DIR=`(date "-d 0 day ago" +%Y)`
M_DIR=`(date "-d 0 day ago" +%Y%m)`
D_DIR=`(date "-d 0 day ago" +%Y%m%d%H%M)`
Y_LAST_DIR=$(date +%Y "-d -1 year")
TWO_YEARS="$Y_LAST_DIR|$Y_DIR"
N=30
echo -e "*****************************************"
echo ">>>>>>>>>>>>>>>>>>>>>>> backup started on" `date +%Y/%m/%d--%k:%M:%S`;
for DB in `echo ${MySQL_BACKUP_DBLIST//|/ }`;
do
mkdir -p $MySQL_STORAGE_BACKUP_PATH/$DB/$Y_DIR/$M_DIR/$D_DIR
DB_BACKUP_PATH=$MySQL_STORAGE_BACKUP_PATH/$DB/$Y_DIR/$M_DIR/$D_DIR
$MySQL_BIN_PATH/mysqldump --host=$DBHOST --user=$USERNAME --password=$PASSWORD --port=$PORT --opt --triggers --routines --single-transaction --set-gtid-purged=OFF $DB | sed 's/DEFINER=`[^`]+`@`[^`]+`/DEFINER=CURRENT_USER/g' > $DB_BACKUP_PATH/$DB.sql
for YEAR in `echo ${TWO_YEARS//|/ }`;do
PATH_TOBE_CHECK=$MySQL_STORAGE_BACKUP_PATH/$DB/$YEAR
if [ -d $PATH_TOBE_CHECK ];then
find $PATH_TOBE_CHECK -type d -mtime +$N | xargs rm -rf
fi
done
done;
echo ">>>>>>>>>>>>>>>>>>>>>>> backup ended on" `date +%Y/%m/%d--%k:%M:%S`
echo -e "*****************************************"
说明:
- 文本替换
for … in 语法中要求数据需要以空格分割, 这里需要对数据库列表进行文本替换 ${MySQL_BACKUP_DBLIST//|/ } 注意}前有一个空格 当然也可以使用sed来做文本替换.
- 判断文件夹(或文件)非空
如果文件夹或文件为空,则在删除时会报错,这里只需要对已存在的文件(夹)做删除操作即可. ① 判断文件夹是否存在: if [ -d $PATH_TOBE_CHECK ] ② 判断文件夹不存在: if [ ! -d $PATH_TOBE_CHECK ] ③ 如果判断是文件类型, 只需要把"-d"参数替换为"-f"参数.
- 跨年时前一年数据无法删除的问题(思路可以再优化)
指定近2年的年份进行删除
|