#!/bin/bash
# 数据库备份脚本(宝塔计划任务版)
# 安全提示:本脚本不包含禁用命令,可放心使用
# ------ 配置参数(按需修改)------
MYSQL_USER="root" # 数据库用户名
MYSQL_PASSWORD="your_db_password" # 数据库密码
DATABASE_NAME="your_database" # 要备份的数据库名
BACKUP_DIR="/www/backup/database" # 备份存储目录
MAX_BACKUPS=7 # 保留的备份份数(按天数建议改为30)
# ------ 以下内容无需修改 ------
# 创建日期标记
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/${DATABASE_NAME}_${TIMESTAMP}.sql.gz"
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# 执行数据库备份(压缩格式)
mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${DATABASE_NAME} | gzip > ${BACKUP_FILE}
# 清理旧备份(保留MAX_BACKUPS份)
ls -t ${BACKUP_DIR}/${DATABASE_NAME}_*.sql.gz | tail -n +$(($MAX_BACKUPS +1)) | xargs -I {} rm -- {}
# 记录日志(可选)
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 成功创建备份:${BACKUP_FILE}" >> ${BACKUP_DIR}/backup.log
报错:mysqldump: [Warning] Using a password on the command line interface can be insecure.
https://www.codingwithjesse.com/blog/mysql-using-a-password-on-the-command-line-interface-can-be-insecure/ 这是一个警告,mysql:[警告]在命令行界面使用密码可能是不安全的
解决:Coding with Jesse
nano /root/.my.cnf
添加以下内容:
[client] user = root password = your_mysql_password
按 Ctrl+X
→ Y
→ Enter
保存
chmod 600 /root/.my.cnf
# 原命令: # mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD}... # 修改为: mysqldump ${DATABASE_NAME} | gzip > ${BACKUP_FILE}
报错参考
Mysq在使用mysqldump命令备份数据库报错:mysqldump: [Warning] Using a password on the command line interface can be-CSDN博客
# 创建安全配置文件(已存在可跳过) vi /root/.my.cnf
输入内容:
[client] user = root password = 你的数据库密码
设置权限:
chmod 600 /root/.my.cnf
# CentOS yum install -y pv # Ubuntu/Debian apt-get install -y pv
修改 DATABASE_NAME
为实际数据库名
调整 BACKUP_DIR
为合适的备份路径
设置 MAX_BACKUPS
控制保留份数
chmod +x backup.sh ./backup.sh
#!/bin/bash
# =============================================
# 宝塔面板 MySQL 数据库备份脚本(增强版)
# 功能:压缩备份 + 进度显示 + 自动清理 + 日志记录
# =============================================
# ---------------------------
# 用户配置区域(按需修改)
# ---------------------------
DATABASE_NAME="your_database_name" # 要备份的数据库名
BACKUP_DIR="/www/backup/database" # 备份存储目录(建议放在数据盘)
MAX_BACKUPS=7 # 保留的备份份数(按天数换算:7=保留一周)
# ---------------------------
# 高级配置(非必要不修改)
# ---------------------------
MYSQL_CNF="/root/.my.cnf" # MySQL安全配置文件路径
LOG_FILE="${BACKUP_DIR}/backup.log" # 日志文件路径
# ---------------------------
# 功能函数
# ---------------------------
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}
check_pv() {
if ! command -v pv &> /dev/null; then
echo -e "\n\033[31m错误:未安装 pv 工具,请先执行以下命令安装:\033[0m"
echo "-----------------------------------------"
echo "CentOS: yum install -y pv"
echo "Ubuntu: apt-get install -y pv"
echo "-----------------------------------------"
exit 1
fi
}
# ---------------------------
# 初始化检查
# ---------------------------
mkdir -p ${BACKUP_DIR}
touch ${LOG_FILE}
log "=== 开始数据库备份任务 ==="
# 检查配置文件是否存在
if [ ! -f "${MYSQL_CNF}" ]; then
log "错误:MySQL配置文件 ${MYSQL_CNF} 不存在"
echo -e "\033[31m错误:请先创建MySQL配置文件!\033[0m"
echo "创建方法:"
echo "1. 执行 nano ${MYSQL_CNF}"
echo "2. 添加以下内容:"
echo " [client]"
echo " user = root"
echo " password = 你的数据库密码"
echo "3. 设置权限:chmod 600 ${MYSQL_CNF}"
exit 1
fi
# 检查pv工具
check_pv
# ---------------------------
# 获取数据库大小(MB)
# ---------------------------
DB_SIZE=$(mysql --defaults-extra-file=${MYSQL_CNF} -N -e \
"SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 0) \
FROM information_schema.TABLES \
WHERE table_schema = '${DATABASE_NAME}';")
if [ -z "${DB_SIZE}" ] || [ "${DB_SIZE}" -eq 0 ]; then
log "错误:无法获取数据库大小,可能数据库不存在"
echo -e "\033[31m错误:请检查数据库名称是否正确\033[0m"
exit 1
fi
# ---------------------------
# 执行备份(带进度条)
# ---------------------------
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/${DATABASE_NAME}_${TIMESTAMP}.sql.gz"
echo -e "\n\033[34m正在备份数据库:${DATABASE_NAME} (约 ${DB_SIZE}MB)...\033[0m"
mysqldump --defaults-extra-file=${MYSQL_CNF} ${DATABASE_NAME} \
| pv -s ${DB_SIZE}m -p -t -e -r -b \
| gzip > ${BACKUP_FILE}
# 检查备份结果
if [ $? -ne 0 ] || [ ! -f "${BACKUP_FILE}" ]; then
log "错误:备份失败!"
echo -e "\033[31m错误:备份过程出现异常\033[0m"
exit 1
fi
# ---------------------------
# 清理旧备份
# ---------------------------
OLD_FILES=$(ls -t ${BACKUP_DIR}/${DATABASE_NAME}_*.sql.gz 2>/dev/null | tail -n +$((${MAX_BACKUPS} +1)))
if [ -n "${OLD_FILES}" ]; then
echo -e "\n\033[33m正在清理旧备份...\033[0m"
echo "${OLD_FILES}" | xargs -I {} sh -c "echo '删除:{}'; rm -- {}"
log "已清理旧备份:$(echo ${OLD_FILES} | tr '\n' ' ')"
fi
# ---------------------------
# 完成输出
# ---------------------------
BACKUP_SIZE=$(du -h ${BACKUP_FILE} | cut -f1)
echo -e "\n\033[32m✔ 备份成功!\033[0m"
echo -e "备份文件:${BACKUP_FILE}"
echo -e "文件大小:${BACKUP_SIZE}"
echo -e "磁盘剩余:$(df -h ${BACKUP_DIR} | awk 'NR==2 {print $4}')"
log "备份完成 → 文件: ${BACKUP_FILE} 大小: ${BACKUP_SIZE}"
log "=== 本次任务成功完成 ===\n"
exit 0