From ca4372271aa29250f392c36d677523b6f89024d8 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 16 Aug 2026 23:37:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=87=E4=BB=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=B1=9E=E4=B8=BB=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/backup-online.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/scripts/backup-online.sh b/scripts/backup-online.sh index 0925664..e295514 100755 --- a/scripts/backup-online.sh +++ b/scripts/backup-online.sh @@ -13,7 +13,14 @@ source "${SCRIPT_DIR}/backup-common.sh" cleanup_dir='' cleanup() { if [[ -n "${cleanup_dir}" && -d "${cleanup_dir}" ]]; then - rm -rf -- "${cleanup_dir}" + # XtraBackup 会保留源文件属主;失败时先在容器内归还临时目录属主, + # 再由运行备份的业务用户删除,避免残留无法清理的大文件。 + docker run --rm --user 0:0 \ + -v "${cleanup_dir}:/cleanup" \ + --entrypoint chown \ + "${BACKUP_XTRABACKUP_IMAGE}" \ + -R "$(id -u):$(id -g)" /cleanup >/dev/null 2>&1 || true + rm -rf -- "${cleanup_dir}" || true fi } trap cleanup EXIT @@ -74,9 +81,8 @@ EOF chmod 600 "${tmp_dir}/xtrabackup-client.cnf" backup_log "开始全量热备,实例 ${server_uuid}" - # MySQL 数据卷中的 redo 文件仅 MySQL 用户和 root 可读。以 root 运行备份 - # 容器读取数据,同时保留宿主机业务用户的组,保证后续本地打包可读取备份文件。 - docker run --rm --user "0:$(id -g)" \ + # MySQL 数据卷中的 redo 文件仅 MySQL 用户和 root 可读,因此备份容器需以 root 读取。 + docker run --rm --user 0:0 \ --network "${network}" \ --volumes-from "${mysql_cid}:ro" \ -v "${tmp_dir}/xtrabackup:/backup" \ @@ -86,6 +92,12 @@ EOF --defaults-extra-file=/etc/xtrabackup-client.cnf \ --backup \ --target-dir=/backup/data + # XtraBackup 会保留源文件属主;在隔离容器内转回业务用户,供后续打包和加密使用。 + docker run --rm --user 0:0 \ + -v "${tmp_dir}/xtrabackup:/backup" \ + --entrypoint chown \ + "${BACKUP_XTRABACKUP_IMAGE}" \ + -R "$(id -u):$(id -g)" /backup/data rm -f "${tmp_dir}/xtrabackup-client.cnf" unset backup_password