Files
moonwell-core/scripts/db-export.sh
T
2026-04-02 22:28:07 +04:00

111 lines
3.2 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
OUTPUT_FILE=""
COMPRESS=1
if [[ -f "$ENV_FILE" ]]; then
set -a
# shellcheck disable=SC1090
source "$ENV_FILE"
set +a
fi
usage() {
cat <<EOF
Usage: $(basename "$0") [--output FILE] [--no-compress]
Exports all AzerothCore databases from the running ac-database container
into a single dump file suitable for migration to another server.
Options:
--output FILE Output file path
(default: ./backups/YYYY-MM-DD_HH-MM-SS.sql.gz)
--no-compress Write plain .sql instead of .sql.gz
-h, --help Show this help
Examples:
$(basename "$0")
$(basename "$0") --output /mnt/backup/moonwell.sql.gz
$(basename "$0") --no-compress --output /tmp/dump.sql
EOF
}
log() { printf '[db-export] %s\n' "$*"; }
die() { printf 'ERROR: %s\n' "$*" >&2; exit 1; }
require_running_db() {
if ! docker compose ps --status running --services 2>/dev/null | grep -qx 'ac-database'; then
die "ac-database is not running. Start it with: docker compose up -d ac-database"
fi
}
# ── argument parsing ──────────────────────────────────────────────────────────
while (($#)); do
case "$1" in
--output) OUTPUT_FILE="$2"; shift ;;
--no-compress) COMPRESS=0 ;;
-h|--help) usage; exit 0 ;;
*) printf 'Unknown option: %s\n\n' "$1" >&2; usage >&2; exit 1 ;;
esac
shift
done
# ── main ──────────────────────────────────────────────────────────────────────
cd "$ROOT_DIR"
require_running_db
if [[ -z "$OUTPUT_FILE" ]]; then
mkdir -p "$ROOT_DIR/backups"
timestamp="$(date '+%Y-%m-%d_%H-%M-%S')"
if [[ "$COMPRESS" -eq 1 ]]; then
OUTPUT_FILE="$ROOT_DIR/backups/${timestamp}.sql.gz"
else
OUTPUT_FILE="$ROOT_DIR/backups/${timestamp}.sql"
fi
fi
mkdir -p "$(dirname "$OUTPUT_FILE")"
log "exporting all databases → $OUTPUT_FILE"
log "this may take a few minutes for large worlds..."
if [[ "$COMPRESS" -eq 1 ]]; then
docker compose exec -T ac-database bash -lc \
"mysqldump -uroot -p\"\$MYSQL_ROOT_PASSWORD\" \
--all-databases \
--add-drop-database \
--single-transaction \
--quick \
--routines \
--triggers \
--events" \
| gzip -6 > "$OUTPUT_FILE"
else
docker compose exec -T ac-database bash -lc \
"mysqldump -uroot -p\"\$MYSQL_ROOT_PASSWORD\" \
--all-databases \
--add-drop-database \
--single-transaction \
--quick \
--routines \
--triggers \
--events" \
> "$OUTPUT_FILE"
fi
log "done: $OUTPUT_FILE ($(du -sh "$OUTPUT_FILE" | cut -f1))"
log ""
log "to restore on the new server:"
if [[ "$OUTPUT_FILE" == *.gz ]]; then
log " bash scripts/db-import.sh --from $OUTPUT_FILE"
else
log " bash scripts/db-import.sh --from $OUTPUT_FILE"
fi