小易说IT 小易说IT

MySQL/PostgreSQL 数据库备份shell脚本

数据库备份脚本 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}

安全提醒:密码明文风险

脚本里写密码不安全!推荐两种方案

  1. MySQL:使用 ~/.my.cnf 免密配置(推荐)

[mysqldump]
user=root
password=你的密码
host=127.0.0.1
port=3306
chmod 600 ~/.my.cnf
# mysqldump 去掉 -u -p 参数,直接 mysqldump 库名
  1. 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,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/mysql-postgresql-database-backup-shell-script

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/