Zum Inhalt

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; optional
  • CONTAINER: 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; optional
  • SERVICE: 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; mandatory
  • DB_DATABASE: Name of the database; mandatory
  • DB_HOST: Hostname / ip address of the database server; mandatory
  • DB_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; notwendig
  • CONTAINER: Name des Docker-Containers; notwendig, wenn nicht eindeutig identifizierbar
  • FILE: 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; notwendig
  • FILE: 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; notwendig
  • CONTAINER: 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; notwendig
  • 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 \
    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; mandatory
  • DB_DATABASE: Name of the database; mandatory
  • DB_HOST: Hostname / ip address of the database server; mandatory
  • DB_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; notwendig
  • CONTAINER: Name des Docker-Containers; notwendig, wenn nicht eindeutig identifizierbar
  • FILE: 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; notwendig
  • FILE: 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}"