Use root account for database

This commit is contained in:
kbe
2026-07-25 21:26:10 +02:00
parent 88696d6e30
commit b8564703bc
+26 -18
View File
@@ -18,7 +18,7 @@ umask 077
CONTAINER="${DOCKER_CONTAINER_NAME:-mariadb}" CONTAINER="${DOCKER_CONTAINER_NAME:-mariadb}"
PASSWORD_FILE="${PASSWORD_FILE:-/root/.mariadb-backup.pw}" PASSWORD_FILE="${PASSWORD_FILE:-/root/.mariadb-backup.pw}"
DB_USER="${DB_USER:-backup}" DB_USER="${DB_USER:-root}"
SCRIPT_DIR="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)"
DUMP_DIR="${DUMP_DIR:-dump}" DUMP_DIR="${DUMP_DIR:-dump}"
@@ -31,7 +31,10 @@ EXCLUDED_SCHEMAS="'information_schema','mysql','performance_schema','sys'"
# ================================================================= # =================================================================
die() { echo "ERROR: $*" >&2; exit 1; } die() {
echo "ERROR: $*" >&2
exit 1
}
warn() { echo "WARNING: $*" >&2; } warn() { echo "WARNING: $*" >&2; }
cleanup() { rm -rf "$STAGING"; } cleanup() { rm -rf "$STAGING"; }
@@ -41,23 +44,25 @@ trap cleanup EXIT
command -v docker >/dev/null 2>&1 || die "docker not found in PATH" command -v docker >/dev/null 2>&1 || die "docker not found in PATH"
[[ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER" 2>/dev/null || echo false)" == "true" ]] \ [[ "$(docker inspect -f '{{.State.Running}}' "$CONTAINER" 2>/dev/null || echo false)" == "true" ]] ||
|| die "container '$CONTAINER' is not running" die "container '$CONTAINER' is not running"
if [[ -n "${MYSQL_ROOT_PASSWORD:-}" ]]; then if [[ -n "${MYSQL_ROOT_PASSWORD:-}" ]]; then
DB_PASS="$MYSQL_ROOT_PASSWORD" DB_PASS="$MYSQL_ROOT_PASSWORD"
elif [[ -r "$PASSWORD_FILE" ]]; then elif [[ -r "$PASSWORD_FILE" ]]; then
DB_PASS="$(< "$PASSWORD_FILE")" DB_PASS="$(<"$PASSWORD_FILE")"
else else
die "no password: set MYSQL_ROOT_PASSWORD or create $PASSWORD_FILE (chmod 600)" die "no password: set MYSQL_ROOT_PASSWORD or create $PASSWORD_FILE (chmod 600)"
fi fi
# Detect client binaries (MariaDB 11+ renamed them; MySQL keeps mysql/*). # Detect client binaries (MariaDB 11+ renamed them; MySQL keeps mysql/*).
if docker exec "$CONTAINER" sh -c 'command -v mariadb-dump' >/dev/null 2>&1; then if docker exec "$CONTAINER" sh -c 'command -v mariadb-dump' >/dev/null 2>&1; then
CLIENT=mariadb; DUMPER=mariadb-dump CLIENT=mariadb
DUMPER=mariadb-dump
CLIENT_BIN="mariadb" CLIENT_BIN="mariadb"
else else
CLIENT=mysql; DUMPER=mysqldump CLIENT=mysql
DUMPER=mysqldump
CLIENT_BIN="mysql" CLIENT_BIN="mysql"
fi fi
@@ -99,15 +104,15 @@ mapfile -t DATABASES < <(sql "
WHERE schema_name NOT IN ($EXCLUDED_SCHEMAS) WHERE schema_name NOT IN ($EXCLUDED_SCHEMAS)
ORDER BY schema_name;" | tr -d '\r') ORDER BY schema_name;" | tr -d '\r')
(( ${#DATABASES[@]} > 0 )) || die "no databases returned - check credentials" ((${#DATABASES[@]} > 0)) || die "no databases returned - check credentials"
echo "Found ${#DATABASES[@]} database(s) to dump" echo "Found ${#DATABASES[@]} database(s) to dump"
# --- Free space sanity check -------------------------------------------- # --- Free space sanity check --------------------------------------------
if [[ -d "$DUMP_DIR" ]]; then if [[ -d "$DUMP_DIR" ]]; then
need_kb=$(( $(du -sk "$DUMP_DIR" | cut -f1) * 3 / 2 )) need_kb=$(($(du -sk "$DUMP_DIR" | cut -f1) * 3 / 2))
free_kb=$(df -Pk "$(dirname "$DUMP_DIR")" | awk 'NR==2{print $4}') free_kb=$(df -Pk "$(dirname "$DUMP_DIR")" | awk 'NR==2{print $4}')
(( free_kb > need_kb )) || die "not enough free space (~${need_kb}K needed, ${free_kb}K free)" ((free_kb > need_kb)) || die "not enough free space (~${need_kb}K needed, ${free_kb}K free)"
fi fi
# --- Detect user-dump method -------------------------------------------- # --- Detect user-dump method --------------------------------------------
@@ -122,18 +127,18 @@ dump_users_and_grants() {
# (when no --databases / --all-databases is given) # (when no --databases / --all-databases is given)
log "[dump] using mysqldump --users (MySQL 8.0.31+ style)" log "[dump] using mysqldump --users (MySQL 8.0.31+ style)"
db_exec "$DUMPER" -u "$DB_USER" --users \ db_exec "$DUMPER" -u "$DB_USER" --users \
> "$out" 2>/dev/null >"$out" 2>/dev/null
elif docker exec "$CONTAINER" sh -c "command -v mariadb-dump" >/dev/null 2>&1 \ elif docker exec "$CONTAINER" sh -c "command -v mariadb-dump" >/dev/null 2>&1 &&
&& docker exec "$CONTAINER" mariadb-dump --help 2>&1 | grep -q -- ' --system '; then docker exec "$CONTAINER" mariadb-dump --help 2>&1 | grep -q -- ' --system '; then
# MariaDB: --system=users # MariaDB: --system=users
log "[dump] using mariadb-dump --system=users" log "[dump] using mariadb-dump --system=users"
db_exec "$DUMPER" -u "$DB_USER" --system=users \ db_exec "$DUMPER" -u "$DB_USER" --system=users \
> "$out" 2>/dev/null >"$out" 2>/dev/null
else else
# Fallback: full mysql schema dump # Fallback: full mysql schema dump
log "[dump] falling back to full mysql schema dump (older server)" log "[dump] falling back to full mysql schema dump (older server)"
db_exec "$DUMPER" "${DUMP_OPTS[@]}" --databases mysql \ db_exec "$DUMPER" "${DUMP_OPTS[@]}" --databases mysql \
> "$out" 2>/dev/null >"$out" 2>/dev/null
fi fi
} }
@@ -146,7 +151,10 @@ failed=()
verify_dump() { verify_dump() {
local f="$1" local f="$1"
[[ -s "$f" ]] || { warn "$(basename "$f"): empty"; return 1; } [[ -s "$f" ]] || {
warn "$(basename "$f"): empty"
return 1
}
# mysqldump ends with "-- Dump completed on ..."; mysqlpump ends similarly. # mysqldump ends with "-- Dump completed on ..."; mysqlpump ends similarly.
# For the mysql-schema fallback, just check non-empty (it has no marker). # For the mysql-schema fallback, just check non-empty (it has no marker).
if grep -q '^-- Dump completed' "$f" 2>/dev/null; then if grep -q '^-- Dump completed' "$f" 2>/dev/null; then
@@ -174,7 +182,7 @@ fi
for db in "${DATABASES[@]}"; do for db in "${DATABASES[@]}"; do
out="$STAGING/${db}.sql" out="$STAGING/${db}.sql"
printf 'Dumping %-32s ' "$db" printf 'Dumping %-32s ' "$db"
if db_exec "$DUMPER" "${DUMP_OPTS[@]}" -- "$db" > "$out" && verify_dump "$out"; then if db_exec "$DUMPER" "${DUMP_OPTS[@]}" -- "$db" >"$out" && verify_dump "$out"; then
printf 'ok (%s)\n' "$(du -h "$out" | cut -f1)" printf 'ok (%s)\n' "$(du -h "$out" | cut -f1)"
else else
printf 'FAILED\n' printf 'FAILED\n'
@@ -185,7 +193,7 @@ done
# --- Abort before touching the good copy -------------------------------- # --- Abort before touching the good copy --------------------------------
if (( ${#failed[@]} > 0 )); then if ((${#failed[@]} > 0)); then
die "${#failed[@]} dump(s) failed: ${failed[*]} - previous dumps left intact" die "${#failed[@]} dump(s) failed: ${failed[*]} - previous dumps left intact"
fi fi