您现在的位置是:首页 >技术杂谈 >三大主流数据库(MySQL、Oracle、PostgreSQL)自动化备份与恢复指南网站首页技术杂谈
三大主流数据库(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') 备份完成 ======"
✨ 关键改进说明:
- 权限最小化:建议创建专用备份用户并授予
SELECT, SHOW VIEW, TRIGGER, LOCK TABLES
权限 - 事务一致性:使用
--single-transaction
保证InnoDB表备份一致性 - 日志审计:所有操作记录到日志文件便于审计
- 备份验证:文件数量校验确保完整性
- 安全传输:禁用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 {} ;
✨ 关键改进说明:
- 采用数据泵技术:expdp比传统exp性能更好,支持并行和压缩
- 字符集明确:通过NLS_LANG环境变量确保字符一致性
- PDB支持:适配Oracle 12c+的多租户架构
- 邮件通知增强:可添加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
✨ 关键改进说明:
- 二进制备份:使用
-Fc
自定义格式,支持并行恢复 - WAL归档:实现PITR(时间点恢复)能力
- 分库备份:避免pg_dumpall的全局锁问题
- 压缩优化:采用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
✨ 最佳实践补充
-
备份验证策略
- 每月执行恢复演练
- 使用pg_checksums(PostgreSQL 12+)校验数据完整性
- 对备份文件进行md5校验
-
安全建议
- 备份文件加密(使用openssl或gpg)
# 加密示例 gzip -c backup.sql | openssl enc -aes-256-cbc -salt -out backup.sql.gz.enc
-
监控体系
- 备份文件大小监控
- 备份耗时趋势分析
- 定时任务状态监控(推荐使用Prometheus+Alertmanager)
-
多云策略
# 同时备份到多个云存储 rclone copy /backups remote:aws_s3 rclone copy /backups remote:azure_blob
通过以上优化后的方案,您可以构建起企业级的数据库备份体系。实际部署时请根据业务需求调整保留策略和传输方式,并务必进行恢复测试。欢迎在评论区交流备份方案设计经验!
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。