修复备份文件属主处理

This commit is contained in:
yml2213
2026-08-16 23:37:15 +08:00
parent 7d7141c055
commit ca4372271a
+16 -4
View File
@@ -13,7 +13,14 @@ source "${SCRIPT_DIR}/backup-common.sh"
cleanup_dir='' cleanup_dir=''
cleanup() { cleanup() {
if [[ -n "${cleanup_dir}" && -d "${cleanup_dir}" ]]; then 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 fi
} }
trap cleanup EXIT trap cleanup EXIT
@@ -74,9 +81,8 @@ EOF
chmod 600 "${tmp_dir}/xtrabackup-client.cnf" chmod 600 "${tmp_dir}/xtrabackup-client.cnf"
backup_log "开始全量热备,实例 ${server_uuid}" backup_log "开始全量热备,实例 ${server_uuid}"
# MySQL 数据卷中的 redo 文件仅 MySQL 用户和 root 可读以 root 运行备份 # MySQL 数据卷中的 redo 文件仅 MySQL 用户和 root 可读,因此备份容器需以 root 读取。
# 容器读取数据,同时保留宿主机业务用户的组,保证后续本地打包可读取备份文件。 docker run --rm --user 0:0 \
docker run --rm --user "0:$(id -g)" \
--network "${network}" \ --network "${network}" \
--volumes-from "${mysql_cid}:ro" \ --volumes-from "${mysql_cid}:ro" \
-v "${tmp_dir}/xtrabackup:/backup" \ -v "${tmp_dir}/xtrabackup:/backup" \
@@ -86,6 +92,12 @@ EOF
--defaults-extra-file=/etc/xtrabackup-client.cnf \ --defaults-extra-file=/etc/xtrabackup-client.cnf \
--backup \ --backup \
--target-dir=/backup/data --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" rm -f "${tmp_dir}/xtrabackup-client.cnf"
unset backup_password unset backup_password