說明參考 分享一個 MySQL Shell 備份MySQL資料庫的腳本
#!/bin/bash
# =========================================================================
# (C) Copyright 2003-2033 hoplite
# =========================================================================
# Script Purpose : backup mysql database by mysqlbackup
# -------------------------------------------------------------------------
# instructions
# 1.setup login-path
# create a login-ptah: mysql_config_editor set --login-path=bak -h localhost -P 3306 -uroot -p
# list login-path: mysql_config_editor print --all
# login test: mysql --login-path=bak
# 2.setup cron job
# example: full backup on Sunday,incremental backup on Mon/Wed/Fri,differential backup on Tues/Thur/Sat
# 0 1 * * 0 /u01/scripts/mysql_backup.sh bak /u01/backup/ebackup full
# 0 1 * * 1,3,5 /u01/scripts/mysql_backup.sh bak /u01/backup/ebackup incremental
# 0 1 * * 2,4,6 /u01/scripts/mysql_backup.sh bak /u01/backup/ebackup differential
# -------------------------------------------------------------------------
# Version Date Description
# -------------------------------------------------------------------------
# V1.0 Initial version
# V1.1 2023-02-14 fix bug
# =========================================================================
[ -f ~/.bash_profile ] && . ~/.bash_profile
set -e -u -o pipefail
show_usage ()
{
echo "usage: `basename $0` login-path target-basedir backuplevel"
echo "eg. `basename $0` bak /u01/backup/ebackup full|incremental|differential"
}
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
show_usage
exit 0
else
start_time=`date +%F" "%T`
p_loginpath=$1
p_targetbasedir=$2
p_backuplevel=$3
v_id=`date +%Y%m%d%H%M%S`
v_hash=`echo -n ${p_loginpath}|md5sum|cut -f1 -d" "`
[ -d ${p_targetbasedir} ] || mkdir -p ${p_targetbasedir}
stusfile=${p_targetbasedir}/.status.${v_hash}
log_file=${p_targetbasedir}/backup.log
#check last backup result
if [ -f ${stusfile} ]; then
if [ `cat ${stusfile}` = "running" ]; then
loginfo="`date +%F" "%T` ...ERROR:last backup fail, check it,then drop status file and rerun." ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
exit 1
fi
else
echo "running" > ${stusfile}
fi
if [ "${p_backuplevel}" = "full" ]; then
v_backuplevel="full"
elif [ "${p_backuplevel}" = "incremental" ]; then
v_backuplevel="incr"
elif [ "${p_backuplevel}" = "differential" ]; then
v_backuplevel="diff"
else
show_usage
exit 1
fi
v_targetdir=${p_targetbasedir}/${v_backuplevel}.${v_id}
loginfo="`date +%F" "%T` ...start backup to ${v_targetdir}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
if [ "${p_backuplevel}" = "full" ]; then
mysqlbackup --login-path=${p_loginpath} --skip-binlog --compress --compress-level=1 --backup-dir=${v_targetdir} --backup-image=${v_targetdir}.mbi --force backup-to-image
elif [ "${p_backuplevel}" = "incremental" ]; then
mysqlbackup --login-path=${p_loginpath} --skip-binlog --compress --compress-level=1 --incremental=optimistic --incremental-base=history:last_backup --backup-dir=${v_targetdir} --backup-image=${v_targetdir}.mbi --force backup-to-image
elif [ "${p_backuplevel}" = "differential" ]; then
mysqlbackup --login-path=${p_loginpath} --skip-binlog --compress --compress-level=1 --incremental=optimistic --incremental-base=history:last_full_backup --backup-dir=${v_targetdir} --backup-image=${v_targetdir}.mbi --force backup-to-image
fi
echo "completed" > ${stusfile}
loginfo="`date +%F" "%T` ...end backup to ${v_targetdir}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
tmpfile=/tmp/.tmpfile.`basename $0`.${v_hash}.${v_id}
find ${p_targetbasedir} -mtime +15 \( -name "full.20????????????" -o -name "incr.20????????????" -o -name "diff.20????????????" \) -type d > ${tmpfile}
#eg. /u01/backup/ebackup/full.20230214180029
while read foldername
do
rm -rf "${foldername:-unset}"
echo "deleted backup folder : ${foldername}"
done < ${tmpfile}
find ${p_targetbasedir} -mtime +15 \( -name "full.20????????????.mbi" -o -name "incr.20????????????.mbi" -o -name "diff.20????????????.mbi" \) -type f > ${tmpfile}
#eg. /u01/backup/ebackup/full.20230214180029.mbi
while read filename
do
rm -f "${filename:-unset}"
echo "deleted backup file : ${filename}"
done < ${tmpfile}
end_time=`date +%F" "%T`
t_start_time=`date -d "${start_time}" +%s`
t_end_time=`date -d "${end_time}" +%s`
t_diff_secs=$((${t_end_time} - ${t_start_time}))
t_hours=$((${t_diff_secs}/3600))
t_mins=$(($((${t_diff_secs}-${t_hours}*3600))/60))
t_secs=$((${t_diff_secs}%60))
echo
echo ==================================================
echo "File Name:`basename $0` Start Time:${start_time} End Time:${end_time} Total Cost:${t_hours}:${t_mins}:${t_secs}"
echo ==================================================
echo
fi