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