您现在的位置是:首页 >技术杂谈 >三大主流数据库(MySQL、Oracle、PostgreSQL)自动化备份与恢复指南网站首页技术杂谈

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

代码小侦探 2025-02-23 00:01:03
简介智者奥尔姆 数据库

在生产环境中,数据库备份是保障数据安全的最后一道防线。本文将深入讲解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
    

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。