三大主流数据库(MySQL、Oracle、PostgreSQL)自动化备份与恢复指南

在生产环境中,数据库备份是保障数据安全的最后一道防线。本文将深入讲解MySQL、Oracle和PostgreSQL三大数据库的自动化备份方案与恢复实践,并提供可直接部署的Shell脚本。


一、MySQL数据库异地容灾方案

📝 优化版备份脚本要点解析

#!/bin/bash
# Author: DBA_Expert
# Description: MySQL数据库全量备份脚本(带异地容灾)
# Version: 2.1
# ✨ 添加错误处理机制和日志审计功能

# 配置区(根据实际情况修改)
MYSQL_USER="backup_user"
MYSQL_PASSWORD="S3cureP@ssw0rd"
MYSQL_HOST="192.168.1.100"
BACKUP_DIR="/data/mysql_backups"
REMOTE_HOST="backup-server"
REMOTE_DIR="/mnt/backup_nas/mysql"
RETENTION_DAYS=7
LOG_FILE="/var/log/mysql_backup.log"

# ✨ 初始化日志记录
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>>$LOG_FILE 2>&1

echo "====== $(date +'%F %T') 备份开始 ======"

# 创建当日备份目录
BACKUP_DATE=$(date +%Y%m%d)
mkdir -p ${BACKUP_DIR}/${BACKUP_DATE} || exit 1

# ✨ 获取数据库列表(排除系统库)
DATABASES=$(mysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)")

# 全库备份
for DB in $DATABASES; do
    echo "备份数据库: $DB"
    mysqldump -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
        --single-transaction --routines --triggers --hex-blob $DB \
        | gzip > ${BACKUP_DIR}/${BACKUP_DATE}/${DB}_${BACKUP_DATE}.sql.gz
    [ $? -ne 0 ] && echo "【严重错误】数据库 $DB 备份失败!"
done

# ✨ 添加备份完整性检查
CHECK_COUNT=$(ls ${BACKUP_DIR}/${BACKUP_DATE}/*.gz | wc -l)
if [ $CHECK_COUNT -eq $(echo "$DATABASES" | wc -w) ]; then
    echo "备份完整性验证通过"
else
    echo "【告警】备份文件数量与数据库数量不匹配!"
    exit 2
fi

# 传输到远程服务器
scp -o StrictHostKeyChecking=no -r ${BACKUP_DIR}/${BACKUP_DATE} ${REMOTE_HOST}:${REMOTE_DIR}

# ✨ 清理历史备份(本地+远程)
find ${BACKUP_DIR} -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;
ssh ${REMOTE_HOST} "find ${REMOTE_DIR} -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;"

echo "====== $(date +'%F %T') 备份完成 ======"

✨ 关键改进说明:

  1. 权限最小化:建议创建专用备份用户并授予SELECT, SHOW VIEW, TRIGGER, LOCK TABLES权限
  2. 事务一致性:使用--single-transaction保证InnoDB表备份一致性
  3. 日志审计:所有操作记录到日志文件便于审计
  4. 备份验证:文件数量校验确保完整性
  5. 安全传输:禁用SSH严格主机检查(首次需手动确认)

📘 恢复操作示例

# 单库恢复示例
gunzip < /backup/mysql/20231101/mydb_20231101.sql.gz | mysql -u root -p mydb

# 全库恢复建议
systemctl stop mysqld
rm -rf /var/lib/mysql/*
mysql_install_db --user=mysql
systemctl start mysqld
cat /backup/full_backup.sql | mysql -u root -p

二、Oracle数据库备份与恢复方案

📝 生产级备份脚本优化

#!/bin/bash
# ✨ 使用数据泵(expdp)替代传统exp工具
# 需要先创建DIRECTORY对象

ORACLE_SID=ORCLCDB
ORACLE_PDB=ORCLPDB1
ORACLE_USER=system
ORACLE_PASSWORD=Oracle123
BACKUP_DIR=/oracle/backups
REMOTE_HOST=backup-server
REMOTE_DIR=/mnt/backup_nas/oracle
RETENTION_DAYS=14

export ORACLE_SID
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

# 创建当日备份目录
BACKUP_DATE=$(date +%Y%m%d)
mkdir -p ${BACKUP_DIR}/${BACKUP_DATE}

# 数据泵备份
expdp ${ORACLE_USER}/${ORACLE_PASSWORD}@${ORACLE_PDB} \
  DIRECTORY=DATA_PUMP_DIR \
  DUMPFILE=expdp_${ORACLE_PDB}_${BACKUP_DATE}.dmp \
  LOGFILE=expdp_${ORACLE_PDB}_${BACKUP_DATE}.log \
  SCHEMAS=hr,oe \
  COMPRESSION=ALL \
  PARALLEL=2

# 传输与清理
scp ${BACKUP_DIR}/${BACKUP_DATE}/* ${REMOTE_HOST}:${REMOTE_DIR}
find ${BACKUP_DIR} -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;

✨ 关键改进说明:

  1. 采用数据泵技术:expdp比传统exp性能更好,支持并行和压缩
  2. 字符集明确:通过NLS_LANG环境变量确保字符一致性
  3. PDB支持:适配Oracle 12c+的多租户架构
  4. 邮件通知增强:可添加sendmail或curl调用邮件API

📘 数据泵恢复示例

-- 创建用户
CREATE USER restore_user IDENTIFIED BY "Restore123";
GRANT DBA TO restore_user;

-- 执行恢复
impdp system/Oracle123@ORCLPDB1 \
  DIRECTORY=DATA_PUMP_DIR \
  DUMPFILE=expdp_ORCLPDB1_20231101.dmp \
  REMAP_SCHEMA=hr:restore_user \
  TABLE_EXISTS_ACTION=REPLACE

三、PostgreSQL数据库全量保护方案

📝 专业备份脚本优化

#!/bin/bash
# ✨ 支持自定义保留策略和分库备份

PG_HOST=127.0.0.1
PG_PORT=5432
PG_USER=postgres
PG_PASSWORD="P@ssw0rd!123"
BACKUP_DIR=/postgres/backups
REMOTE_HOST=backup-server
REMOTE_DIR=/mnt/backup_nas/postgres
RETENTION_DAYS=7

export PGPASSWORD=$PG_PASSWORD

# 获取数据库列表
DATABASES=$(psql -h $PG_HOST -U $PG_USER -l -t | cut -d'|' -f1 | sed 's/ //g' | grep -vE '(template0|template1|postgres)')

# 全库备份
for DB in $DATABASES; do
    pg_dump -h $PG_HOST -U $PG_USER -Fc $DB > ${BACKUP_DIR}/${DB}_$(date +%Y%m%d).dump
    gzip ${BACKUP_DIR}/${DB}_$(date +%Y%m%d).dump
done

# ✨ 添加WAL归档(需配置archive_mode=on)
pg_archivecleanup $BACKUP_DIR/wal $(pg_controldata | grep "Latest checkpoint's REDO WAL file" | awk '{print $6}')

# 传输与清理
rsync -avz ${BACKUP_DIR}/*.dump.gz ${REMOTE_HOST}:${REMOTE_DIR}
find $BACKUP_DIR -name "*.dump.gz" -mtime +$RETENTION_DAYS -delete

✨ 关键改进说明:

  1. 二进制备份:使用-Fc自定义格式,支持并行恢复
  2. WAL归档:实现PITR(时间点恢复)能力
  3. 分库备份:避免pg_dumpall的全局锁问题
  4. 压缩优化:采用gzip并行压缩(可安装pigz提升速度)

📘 高级恢复技巧

# 创建新集群
initdb -D /new/data

# 还原基础备份
pg_basebackup -D /new/data -h backup-server -U replica

# 配置恢复参数
cat >> /new/data/postgresql.conf << EOF
restore_command = 'cp /postgres/wal/%f "%p"'
recovery_target_time = '2023-11-01 12:00:00'
EOF

# 启动恢复
touch /new/data/recovery.signal
pg_ctl -D /new/data start

✨ 最佳实践补充

  1. 备份验证策略

    • 每月执行恢复演练
    • 使用pg_checksums(PostgreSQL 12+)校验数据完整性
    • 对备份文件进行md5校验
  2. 安全建议

    • 备份文件加密(使用openssl或gpg)
    # 加密示例
    gzip -c backup.sql | openssl enc -aes-256-cbc -salt -out backup.sql.gz.enc
    
  3. 监控体系

    • 备份文件大小监控
    • 备份耗时趋势分析
    • 定时任务状态监控(推荐使用Prometheus+Alertmanager)
  4. 多云策略

    # 同时备份到多个云存储
    rclone copy /backups remote:aws_s3
    rclone copy /backups remote:azure_blob
    

通过以上优化后的方案,您可以构建起企业级的数据库备份体系。实际部署时请根据业务需求调整保留策略和传输方式,并务必进行恢复测试。欢迎在评论区交流备份方案设计经验!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值