MySQL
Im Folgenden finden sich Befehle, um eine Datenbank als komprimierte Textdatei zu sichern, zu leeren und wiederherzustellen.
Die Befehle sind darauf ausgelegt kopiert, eingefügt und ausgeführt zu werden. Um das zu erreichen werden Variablen verwendet. Diese müssen vor dem Ausführen der Befehle jeweils einmalig pro Shell wie folgt gesetzt werden:
VARIABLE=wert
Interaktive Kommandozeile
Als interaktive Kommandozeile kommt mysql zum Einsatz.
Generell
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; optional
mysql ${DATABASE:+--database="${DATABASE}"}
Docker
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; optionalCONTAINER
: Name des Docker-Containers; notwendig, wenn nicht eindeutig identifizierbar
docker container exec --interactive --tty -- "${CONTAINER:-$(
docker container ls --all --format='{{.Names}}' --no-trunc | awk '
/^(wcp-)?(mariadb|mysql)[-.0-9]*$/ { database = $0; databases++; }
END { if (databases == 1) print database; }
'
)}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql ${DATABASE:+--database="${DATABASE}"}
Project Task Runner
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; optionalSERVICE
: Name der Docker Compose Services; optional; default:mysql
docker-compose exec "${SERVICE:-mysql}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql ${DATABASE:+--database="${DATABASE}"}
Sichern
Beim Abspeichern kommt mysqldump zum Einsatz.
Generell
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DB_USERNAME
: Username; mandatoryDB_DATABASE
: Name of the database; mandatoryDB_HOST
: Hostname / ip address of the database server; mandatoryDB_FILE
: Path of the resulting database dump; optional; default:${DATABASE}.sql.zst
mysqldump --user="${DB_USERNAME}" --host="${DB_HOST}" -p \
--complete-insert --events --extended-insert --routines \
--single-transaction --triggers --tz-utc -- "${DB_DATABASE}" \
| zstd --adapt --compress \
> "${DB_FILE:-${DB_DATABASE}.sql.zst}"
Often the version of mysqldump on your local computer is not compatible with the MySQL-Version on the server. You can use the following command which uses mysqldump with a docker image:
docker run --rm -it -e DB_HOST="${DB_HOST}" -e DB_USERNAME="${DB_USERNAME}" \
-e DB_DATABASE="${DB_DATABASE}" mysql:8.0 sh -c 'exec mysqldump \
-h "${DB_HOST}" -P 3306 -u "${DB_USERNAME}" -p \
--complete-insert --events --extended-insert --routines \
--single-transaction --set-gtid-purged=OFF \
--triggers --tz-utc -- "${DB_DATABASE}"' \
| zstd --adapt --compress > "${DB_FILE:-${DB_DATABASE}.sql.zst}"
After you entered the docker command you need to provide the password. But you wont see a prompt for the password. Just paste it and press enter.
Docker
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendigCONTAINER
: Name des Docker-Containers; notwendig, wenn nicht eindeutig identifizierbarFILE
: Pfad des Datenbank-Dumps; optional; default:${DATABASE}.sql.zst
docker container exec --interactive -- "${CONTAINER:-$(
docker container ls --all --format='{{.Names}}' --no-trunc | awk '
/^(wcp-)?(mariadb|mysql)[-.0-9]*$/ { database = $0; databases++; }
END { if (databases == 1) print database; }
'
)}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysqldump --complete-insert --events --extended-insert --routines --single-transaction --triggers --tz-utc -- "${DATABASE}" |
zstd --adapt --compress \
> "${FILE:-${DATABASE}.sql.zst}"
Project Task Runner
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendigFILE
: Pfad des Datenbank-Dumps; optional; default:${DATABASE}.sql.zst
SERVICE
: Name der Docker Compose Services; optional; default:mysql
docker-compose exec -T "${SERVICE:-mysql}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysqldump --complete-insert --events --extended-insert --routines --single-transaction --triggers --tz-utc -- "${DATABASE}" |
zstd --adapt --compress \
> "${FILE:-${DATABASE}.sql.zst}"
Leeren
Beim Leeren kommt mysql zum Einsatz.
Generell
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendig
mysql --batch --database=mysql --execute="
SELECT concat('KILL ', id, ';')
FROM information_schema.processlist
WHERE db = '${DATABASE}' AND id <> connection_id()
UNION ALL
SELECT 'DROP DATABASE IF EXISTS \`${DATABASE}\`;'
UNION ALL
SELECT 'CREATE DATABASE \`${DATABASE}\`;'
" --skip-column-names --raw |
mysql --database=mysql
Docker
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendigCONTAINER
: Name des Docker-Containers; notwendig, wenn nicht eindeutig identifizierbar
docker container exec --interactive -- "${CONTAINER:-$(
docker container ls --all --format='{{.Names}}' --no-trunc | awk '
/^(wcp-)?(mariadb|mysql)[-.0-9]*$/ { database = $0; databases++; }
END { if (databases == 1) print database; }
'
)}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql --batch --database=mysql --execute="
SELECT concat('KILL ', id, ';')
FROM information_schema.processlist
WHERE db = '${DATABASE}' AND id <> connection_id()
UNION ALL
SELECT 'DROP DATABASE IF EXISTS \`${DATABASE}\`;'
UNION ALL
SELECT 'CREATE DATABASE \`${DATABASE}\`;'
" --skip-column-names --raw |
docker container exec --interactive -- "${CONTAINER:-$(
docker container ls --all --format='{{.Names}}' --no-trunc | awk '
/^(wcp-)?(mariadb|mysql)[-.0-9]*$/ { database = $0; databases++; }
END { if (databases == 1) print database; }
'
)}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql --database=mysql
Project Task Runner
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendigSERVICE
: Name der Docker Compose Services; optional; default:mysql
docker-compose exec -T "${SERVICE:-mysql}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql --batch --database=mysql --execute="
SELECT concat('KILL ', id, ';')
FROM information_schema.processlist
WHERE db = '${DATABASE}' AND id <> connection_id()
UNION ALL
SELECT 'DROP DATABASE IF EXISTS \`${DATABASE}\`;'
UNION ALL
SELECT 'CREATE DATABASE \`${DATABASE}\`;'
" --skip-column-names --raw |
docker-compose exec -T "${SERVICE:-mysql}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql --database=mysql
Wiederherstellen
Beim Wiederherstellen kommt mysql zum Einsatz. Vor dem Wiederherstellen sollte darauf geachtet werden, dass die Datenbank leer ist.
Generell
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DB_USERNAME
: Username; mandatoryDB_DATABASE
: Name of the database; mandatoryDB_HOST
: Hostname / ip address of the database server; mandatoryDB_FILE
: Path of the resulting database dump; optional; default:${DATABASE}.sql.zst
zstd --decompress < "${DB_FILE:-${DB_DATABASE}.sql.zst}" |
mysql --host="${DB_HOST}" --user="${DB_USERNAME}" -p --database="${DB_DATABASE}"
Docker
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendigCONTAINER
: Name des Docker-Containers; notwendig, wenn nicht eindeutig identifizierbarFILE
: Pfad des Datenbank-Dumps; optional; default:${DATABASE}.sql.zst
zstd --decompress < "${FILE:-${DATABASE}.sql.zst}" |
docker container exec --interactive -- "${CONTAINER:-$(
docker container ls --all --format='{{.Names}}' --no-trunc | awk '
/^(wcp-)?(mariadb|mysql)[-.0-9]*$/ { database = $0; databases++; }
END { if (databases == 1) print database; }
'
)}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql --database="${DATABASE}"
Project Task Runner
Folgende Variablen haben Einfluss auf den Unten stehenden Befehl:
DATABASE
: Name der Datenbank; notwendigFILE
: Pfad des Datenbank-Dumps; optional; default:${DATABASE}.sql.zst
SERVICE
: Name der Docker Compose Services; optional; default:mysql
zstd --decompress < "${FILE:-${DATABASE}.sql.zst}" |
docker-compose exec -T "${SERVICE:-mysql}" sh -c '
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD:-root}"
exec "$@"
' sh \
mysql --database="${DATABASE}"