数据库备份脚本 db_backup.sh
支持 MySQL / PostgreSQL 二选一;自动压缩、保留 N 天备份、记录日志、备份失败标记,适合定时全量备份 👉 如果你是 openGauss,我后面单独给适配版本,当前版本:MySQL 为主,PG 注释打开即可
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export LANG=en_US.UTF-8
# ===================== 配置区【重点修改】 =====================
DB_TYPE="mysql" # mysql / postgres
DB_HOST="127.0.0.1"
DB_PORT="3306"
DB_USER="root"
DB_PASS="你的数据库密码"
DB_NAME="testdb" # 要备份的库名,多个库空格分隔
BACKUP_BASE="/opt/backup/db"
RETENTION_DAY=7 # 备份文件保留天数
TIME=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_BASE}/db_backup_${DB_NAME}_${TIME}.sql.gz"
LOG_FILE="/opt/scripts/log/db_backup.log"
# ==============================================================
# 创建备份目录
mkdir -p ${BACKUP_BASE}
echo "=============================================" >> ${LOG_FILE}
echo "开始备份 ${DB_NAME} ${TIME}" >> ${LOG_FILE}
BACKUP_RET=0
if [ "${DB_TYPE}" = "mysql" ];then
# MySQL备份
/usr/bin/mysqldump -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_FILE}
BACKUP_RET=$?
elif [ "${DB_TYPE}" = "postgres" ];then
# PostgreSQL备份,pg_dump一般需要切换用户,按需调整
# su - postgres -c "/usr/bin/pg_dump -h${DB_HOST} -p${DB_PORT} -U ${DB_USER} ${DB_NAME} | gzip > ${BACKUP_FILE}"
/usr/bin/pg_dump -h${DB_HOST} -p${DB_PORT} -U ${DB_USER} ${DB_NAME} | gzip > ${BACKUP_FILE}
BACKUP_RET=$?
fi
# 判断备份结果
if [ ${BACKUP_RET} -eq 0 ];then
echo "[SUCCESS] ${DB_NAME}备份成功,文件:${BACKUP_FILE}" >> ${LOG_FILE}
# 删除过期备份
find ${BACKUP_BASE} -name "db_backup_*.sql.gz" -mtime +${RETENTION_DAY} -delete
else
echo "[ERROR] ${DB_NAME}备份失败! 返回码:${BACKUP_RET}" >> ${LOG_FILE}
fi
# 可选:备份文件上传到远端(rsync/oss,后面可扩展)
# rsync ${BACKUP_FILE} user@remote:/remote_backup/
echo "备份任务结束 $(date +%Y%m%d_%H%M%S)" >> ${LOG_FILE}
echo "" >> ${LOG_FILE}
安全提醒:密码明文风险
脚本里写密码不安全!推荐两种方案
MySQL:使用
~/.my.cnf免密配置(推荐)
[mysqldump]
user=root
password=你的密码
host=127.0.0.1
port=3306
chmod 600 ~/.my.cnf
# mysqldump 去掉 -u -p 参数,直接 mysqldump 库名
PG:使用
.pgpass文件
赋权 & 测试
chmod +x /opt/scripts/db_backup.sh
/opt/scripts/db_backup.sh
# 查看日志
tail -f /opt/scripts/log/db_backup.log
crontab 配置:每天凌晨 2 点备份数据库
crontab -e
#添加
0 2 * * * /opt/scripts/db_backup.sh >> /opt/scripts/log/db_cron.log 2>&1本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问