2020-05-18 12:55:58
在 Docker 中实现数据库备份与恢复自动化,需结合脚本编写、Docker 工具及编排能力,通过定时任务完成数据保护。以下是具体实现步骤及关键要点:
一、核心实现步骤编写备份脚本
根据数据库类型选择工具:
MySQL:使用 mysqldump 导出数据并压缩。#!/bin/bashDB_HOST=your_db_hostDB_USER=your_db_userDB_PASSWORD=your_db_passwordDB_NAME=your_db_nameBACKUP_DIR=/backupTIMESTAMP=$(date +%Y%m%d_%H%M%S)BACKUP_FILE=$BACKUP_DIR/backup_$TIMESTAMP.sql.gzmkdir -p $BACKUP_DIRmysqldump -h $DB_HOST -u $DB_USER -p$DB_PASSWORD $DB_NAME | gzip > $BACKUP_FILEecho "Backup created: $BACKUP_FILE"
PostgreSQL:使用 pg_dump 执行类似操作。#!/bin/bashDB_HOST=your_db_hostDB_USER=your_db_userDB_PASSWORD=your_db_passwordDB_NAME=your_db_nameBACKUP_DIR=/backupTIMESTAMP=$(date +%Y%m%d_%H%M%S)BACKUP_FILE=$BACKUP_DIR/backup_$TIMESTAMP.sql.gzmkdir -p $BACKUP_DIRPGPASSWORD=$DB_PASSWORD pg_dump -h $DB_HOST -U $DB_USER -d $DB_NAME | gzip > $BACKUP_FILEecho "Backup created: $BACKUP_FILE"
权限设置:执行 chmod +x backup.sh 赋予脚本可执行权限。
编写恢复脚本
从备份文件恢复数据,需解压并导入数据库。
MySQL 恢复示例:#!/bin/bashDB_HOST=your_db_hostDB_USER=your_db_userDB_PASSWORD=your_db_passwordDB_NAME=your_db_nameBACKUP_FILE=$1if [ ! -f "$BACKUP_FILE" ]; then echo "File not found: $BACKUP_FILE" exit 1figunzip < $BACKUP_FILE | mysql -h $DB_HOST -u $DB_USER -p$DB_PASSWORD $DB_NAMEecho "Restored from: $BACKUP_FILE"
PostgreSQL 恢复示例:#!/bin/bashDB_HOST=your_db_hostDB_USER=your_db_userDB_PASSWORD=your_db_passwordDB_NAME=your_db_nameBACKUP_FILE=$1if [ ! -f "$BACKUP_FILE" ]; then echo "File not found: $BACKUP_FILE" exit 1figunzip < $BACKUP_FILE | PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -U $DB_USER -d $DB_NAMEecho "Restored from: $BACKUP_FILE"
Docker 化脚本
创建包含数据库客户端和脚本的镜像:FROM alpine:latestRUN apk add --no-cache bash gzip mysql-client postgresql-clientCOPY backup.sh /usr/local/bin/backup.shCOPY restore.sh /usr/local/bin/restore.shRUN chmod +x /usr/local/bin/backup.sh /usr/local/bin/restore.shENTRYPOINT ["/bin/sh"]
构建镜像:docker build -t backup-restore-tools .
定时执行备份
使用 Docker Compose:version: "3.8"services: db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: your_password MYSQL_DATABASE: your_db volumes: - db_data:/var/lib/mysql backup: image: backup-restore-tools volumes: - backup_data:/backup environment: DB_HOST: db DB_USER: root DB_PASSWORD: your_password command: "bash -c 'while true; do /usr/local/bin/backup.sh; sleep 86400; done'" # 每天备份volumes: db_data: backup_data:
使用 Kubernetes CronJob:apiVersion: batch/v1kind: CronJobmetadata: name: db-backupspec: schedule: "0 0 * * *" # 每天 0 点执行 jobTemplate: spec: template: spec: containers: - name: db-backup image: backup-restore-tools env: - name: DB_HOST value: "your_db_host" - name: DB_USER value: "your_db_user" - name: DB_PASSWORD value: "your_db_password" volumeMounts: - name: backup-volume mountPath: /backup restartPolicy: OnFailure volumes: - name: backup-volume persistentVolumeClaim: claimName: backup-pvc
存储备份文件
持久化存储:使用 Docker Volume 或 Kubernetes PVC 保存备份文件。
云存储:将备份上传至 AWS S3、Google Cloud Storage 等,增强安全性。
监控与告警
通过 Prometheus + Grafana 监控备份任务执行状态。
失败时触发告警(如邮件、Slack 通知)。
测试恢复流程
定期从备份文件恢复数据,验证完整性。
记录恢复时间,确保符合业务 RTO(恢复时间目标)。
小型数据库:每日全量备份。
大型数据库:每周全量 + 每日增量/差异备份。
高频变更数据:结合物理备份(如文件复制)或快照技术。
通过以上步骤,可实现 Docker 环境下数据库备份与恢复的自动化,确保数据安全性和业务连续性。