mirror of
https://github.com/dunwu/linux-tutorial.git
synced 2024-04-15 19:55:24 +08:00
155 lines
5.2 KiB
Bash
155 lines
5.2 KiB
Bash
#!/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}
|
||
}
|