linux-tutorial/codes/linux/lib/mysql.sh
Zhang Peng 18d2a58725 update
2020-03-10 22:54:15 +08:00

155 lines
5.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# -----------------------------------------------------------------------------------------------------
# 数据库操作脚本
# @author Zhang Peng
# -----------------------------------------------------------------------------------------------------
# ------------------------------------------------------------------------------ 1. env
## 数据库IP
#ENV_MYSQL_HOST="127.0.0.1"
## 数据库用户名
#ENV_MYSQL_USERNAME="root"
## 数据密码
#ENV_MYSQL_PASSWORD="Tw#123456"
if [[ ! ${ENV_MYSQL_HOST} ]] || [[ ! ${ENV_MYSQL_USERNAME} ]] || [[ ! ${ENV_MYSQL_PASSWORD} ]]; then
logError "执行本脚本前必须先 export 环境变量: ENV_MYSQL_HOST, ENV_MYSQL_USERNAME, ENV_MYSQL_PASSWORD."
exit ${ENV_FAILED}
fi
# 备份模式:备份所有数据库(--all-databases|备份指定数据库列表
MYSQL_DATABASES="${ENV_MYSQL_DATABASES:---all-databases}"
#备份路径
MYSQL_BACKUP_DIR="${ENV_MYSQL_BACKUP_DIR:-/var/lib/mysql/backup}"
#备份日志路径
export ENV_LOG_PATH="${MYSQL_BACKUP_DIR}/mysql-backup.log"
# ------------------------------------------------------------------------------ 2. libs
# 装载其它库
LINUX_SCRIPTS_LIB_DIR=`dirname ${BASH_SOURCE[0]}`
if [[ ! -x ${LINUX_SCRIPTS_LIB_DIR}/utils.sh ]]; then
logError "${LINUX_SCRIPTS_LIB_DIR}/utils.sh not exists!"
exit 1
fi
source ${LINUX_SCRIPTS_LIB_DIR}/utils.sh
# ------------------------------------------------------------------------------ 3. global var
# 备份文件最大数量
BACKUP_ARTIFACTS_MAX_NUM=7
# ------------------------------------------------------------------------------ 4. functions
backupAllDatabase() {
#时间戳
local timestamp=$(date +"%Y%m%d")
#备份所有数据库
logInfo "正在备份所有数据库"
mysqldump -h ${ENV_MYSQL_HOST} -P${ENV_MYSQL_PORT} -u${ENV_MYSQL_USERNAME} -p${ENV_MYSQL_PASSWORD} --all-databases > "${MYSQL_BACKUP_DIR}/all-${timestamp}.sql" 2>> ${ENV_LOG_PATH};
#检查备份结果是否成功
if [[ "$?" != 0 ]]; then
logError "<<<< 备份所有数据库失败"
return ${ENV_FAILED}
fi
# 压缩备份sql文件删除旧的备份文件
cd "${MYSQL_BACKUP_DIR}"
if [[ ! -f "${MYSQL_BACKUP_DIR}/all-${timestamp}.sql" ]]; then
logError "备份文件 ${MYSQL_BACKUP_DIR}/all-${timestamp}.sql 不存在"
return ${ENV_FAILED}
fi
#为节约硬盘空间,将数据库压缩
sudo tar zcf "all-${timestamp}.tar.gz" "all-${timestamp}.sql" > /dev/null
#删除原始文件,只留压缩后文件
sudo rm -f "all-${timestamp}.sql"
#删除七天前备份也就是只保存7天内的备份
find "${MYSQL_BACKUP_DIR} -name all-*.tar.gz -type f -mtime +${BACKUP_ARTIFACTS_MAX_NUM} -exec rm -rf {} \;" > /dev/null 2>&1
logInfo "<<<< 备份所有数据库成功"
return ${ENV_SUCCEED}
}
backupSelectedDatabase() {
#时间戳
local timestamp=$(date +"%Y%m%d")
#数据库,如有多个库用空格分开
databaseList="${MYSQL_DATABASES}"
#备份指定数据库列表
for database in ${databaseList}; do
logInfo "正在备份数据库:${database}"
mysqldump -h ${ENV_MYSQL_HOST} -P${ENV_MYSQL_PORT} -u${ENV_MYSQL_USERNAME} -p${ENV_MYSQL_PASSWORD} "${database}" > "${MYSQL_BACKUP_DIR}/${database}-${timestamp}.sql" 2>> ${ENV_LOG_PATH};
if [[ "$?" != 0 ]]; then
logError "<<<< 备份 ${database} 失败"
return ${ENV_FAILED}
fi
# 压缩备份sql文件删除旧的备份文件
cd "${MYSQL_BACKUP_DIR}"
if [[ ! -f "${MYSQL_BACKUP_DIR}/${database}-${timestamp}.sql" ]]; then
logError "备份文件 ${MYSQL_BACKUP_DIR}/${database}-${timestamp}.sql 不存在"
return ${ENV_FAILED}
fi
#为节约硬盘空间,将数据库压缩
sudo tar zcf "${database}-${timestamp}.tar.gz" "${database}-${timestamp}.sql" > /dev/null
#删除原始文件,只留压缩后文件
sudo rm -f "${database}-${timestamp}.sql"
#删除七天前备份也就是只保存7天内的备份
find "${MYSQL_BACKUP_DIR} -name ${database}-*.tar.gz -type f -mtime +${BACKUP_ARTIFACTS_MAX_NUM} -exec rm -rf {} \;" > /dev/null 2>&1
done
logInfo "<<<< 备份数据库 ${MYSQL_DATABASES} 成功"
return ${ENV_SUCCEED}
}
backupMysql() {
#日志记录头部
sudo mkdir -p ${MYSQL_BACKUP_DIR}
touch ${ENV_LOG_PATH}
logInfo "------------------------------------------------------------------"
logInfo ">>>> 备份数据库开始"
#正式备份数据库
if [[ ${MYSQL_DATABASES} == "--all-databases" ]]; then
backupAllDatabase
else
backupSelectedDatabase
fi
}
recoveryMysql() {
logInfo "------------------------------------------------------------------"
logInfo ">>>> 恢复数据库开始"
if [[ ! -f ${ENV_SQL_FILE_PATH} ]]; then
logError "sql 文件 ${ENV_SQL_FILE_PATH} 不存在"
return ${ENV_FAILED}
fi
mysql -h ${ENV_MYSQL_HOST} -P${ENV_MYSQL_PORT} -u${ENV_MYSQL_USERNAME} -p${ENV_MYSQL_PASSWORD} < ${ENV_SQL_FILE_PATH}
if [[ "$?" != 0 ]]; then
logError "<<<< 恢复数据库失败"
return ${ENV_FAILED}
fi
logInfo "<<<< 恢复数据库成功"
return ${ENV_SUCCEED}
}