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}
|
|||
|
}
|