文档目录

备份与恢复

宿主机持久化备份

cd <delivery-dir>
bash backup.sh

backup.sh 会受控停止容器,只打包 ${DCMP_DATA_ROOT}/dbdata${DCMP_DATA_ROOT}/dbfiles,然后重新启动容器。输出目录:

backups/YYYYMMDD-HHMMSS/dcmp-persistent-data.tar.gz

检查:

BACKUP_DIR=$(find backups -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -nr | sed -n '1p' | cut -d' ' -f2-)
gzip -t "$BACKUP_DIR/dcmp-persistent-data.tar.gz"
tar -tzf "$BACKUP_DIR/dcmp-persistent-data.tar.gz" | \
  grep -E '^(dbdata|dbfiles)(/|$)' | sed -n '1,20p'

backup.sh 返回码为 0 且 gzip -t 通过,才能判定归档生成成功。该备份不包含 ES、上传文件、日志、Agent 配置、容器内 /usr/dcmp/dbbackup、缓存或 volume_data。

容器内 XtraBackup

docker exec dcmp xtrabackup --version
docker exec dcmp /usr/dcmp/bin/dbbackup.sh full
docker exec dcmp /usr/dcmp/bin/dbbackup.sh inc

输出位于容器内 /usr/dcmp/dbbackup,当前不持久化。若要在重建容器后保留,必须在重建前导出:

docker cp dcmp:/usr/dcmp/dbbackup ./backups/dbbackup-export-$(date +%Y%m%d-%H%M%S)

恢复(高风险)

restore.sh 会停止并删除当前容器,删除宿主机现有 dbdata 和 dbfiles,从归档恢复后重新执行 deploy.sh

执行前必须确认:

  • 已完成当前数据的第二份备份
  • 归档来自相同产品变体、相同架构和兼容版本
  • 已安排停机窗口
  • 归档通过 gzip -t
  • 已另行保护需要保留的非持久化内容
cd <delivery-dir>
gzip -t backups/YYYYMMDD-HHMMSS/dcmp-persistent-data.tar.gz
bash restore.sh backups/YYYYMMDD-HHMMSS
bash status.sh

真实备份恢复闭环验证

仅在专用测试环境或已批准维护窗口执行。数据库标记和 dbfiles 文件都成功恢复,才能证明备份恢复真实有效。

cd <delivery-dir>
MARKER=dcmp_br_verify_$(date +%Y%m%d_%H%M%S)_$$
docker exec dcmp /usr/dcmp/dbfiles/bin/mysql --login-path=backup_user -e \
  "CREATE TABLE IF NOT EXISTS dcmm.dcmp_backup_restore_verify (marker varchar(128) NOT NULL PRIMARY KEY, created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB; INSERT INTO dcmm.dcmp_backup_restore_verify(marker) VALUES ('$MARKER');"
printf '%s\n' "$MARKER" > "/usr/dcmp/dbfiles/.${MARKER}.txt"
bash backup.sh
BACKUP_DIR=$(find backups -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -nr | sed -n '1p' | cut -d' ' -f2-)
gzip -t "$BACKUP_DIR/dcmp-persistent-data.tar.gz"
tar -tzf "$BACKUP_DIR/dcmp-persistent-data.tar.gz" | grep -F "dbfiles/.${MARKER}.txt"
docker exec dcmp /usr/dcmp/dbfiles/bin/mysql --login-path=backup_user -e \
  "DELETE FROM dcmm.dcmp_backup_restore_verify WHERE marker='$MARKER';"
rm -f "/usr/dcmp/dbfiles/.${MARKER}.txt"
bash restore.sh "$BACKUP_DIR"
bash status.sh
docker exec dcmp /usr/dcmp/dbfiles/bin/mysql --login-path=backup_user -Nse \
  "SELECT marker FROM dcmm.dcmp_backup_restore_verify WHERE marker='$MARKER';"
test "$(cat "/usr/dcmp/dbfiles/.${MARKER}.txt")" = "$MARKER"

验证结束后只删除本次测试标记:

docker exec dcmp /usr/dcmp/dbfiles/bin/mysql --login-path=backup_user -e \
  "DELETE FROM dcmm.dcmp_backup_restore_verify WHERE marker='$MARKER';"
rm -f "/usr/dcmp/dbfiles/.${MARKER}.txt"