124 lines
3.8 KiB
Bash
124 lines
3.8 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
|
|
}
|
|
|
|
# Returns space-separated list of user databases (excludes MySQL system schemas)
|
|
get_user_databases() {
|
|
docker compose exec -T ac-database bash -lc \
|
|
"mysql -h 127.0.0.1 -uroot -p\"\$MYSQL_ROOT_PASSWORD\" -N -s information_schema" \
|
|
<<<"SELECT schema_name FROM schemata
|
|
WHERE schema_name NOT IN ('mysql','information_schema','performance_schema','sys')
|
|
ORDER BY schema_name;"
|
|
}
|
|
|
|
# ── 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 "discovering user databases..."
|
|
databases="$(get_user_databases | tr '\n' ' ' | xargs)"
|
|
[[ -z "$databases" ]] && die "no user databases found"
|
|
log "databases: $databases"
|
|
log "exporting → $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 -h 127.0.0.1 -uroot -p\"\$MYSQL_ROOT_PASSWORD\" \
|
|
--databases $databases \
|
|
--add-drop-database \
|
|
--single-transaction \
|
|
--quick \
|
|
--routines \
|
|
--triggers \
|
|
--events" \
|
|
| gzip -6 > "$OUTPUT_FILE"
|
|
else
|
|
docker compose exec -T ac-database bash -lc \
|
|
"mysqldump -h 127.0.0.1 -uroot -p\"\$MYSQL_ROOT_PASSWORD\" \
|
|
--databases $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
|