From e06c25acb7d5c4270cd5c5115aa827f0460b7dc2 Mon Sep 17 00:00:00 2001 From: Anel Husakovic <anel@mariadb.org> Date: Mon, 12 Feb 2024 15:03:56 +0100 Subject: [PATCH] Automation script for MySQL 8.0 data migration --- examples/migration-8.0/.env | 7 ++ examples/migration-8.0/.gitignore | 1 + examples/migration-8.0/compose-mysql8.0.yml | 81 +++++++++++++++++++++ examples/migration-8.0/dump-mysql.sh | 13 ++++ examples/migration-8.0/migrate-mariadb.sh | 13 ++++ examples/migration-8.0/mysql/mysql-data.sql | 3 + 6 files changed, 118 insertions(+) create mode 100644 examples/migration-8.0/.env create mode 100644 examples/migration-8.0/.gitignore create mode 100644 examples/migration-8.0/compose-mysql8.0.yml create mode 100755 examples/migration-8.0/dump-mysql.sh create mode 100644 examples/migration-8.0/migrate-mariadb.sh create mode 100644 examples/migration-8.0/mysql/mysql-data.sql diff --git a/examples/migration-8.0/.env b/examples/migration-8.0/.env new file mode 100644 index 00000000..67f58abb --- /dev/null +++ b/examples/migration-8.0/.env @@ -0,0 +1,7 @@ +DB_ROOT_PASSWORD='secret' +DB_USER='testuser' +DB_PASSWORD='password' +DB_DATABASE='testdb' +MYSQL_name='mysql-container' +MARIADB_DUMP_name='mariadb-container-dump' +MARIADB_MIGRATED_name='mariadb-migrated-mysql8.0' \ No newline at end of file diff --git a/examples/migration-8.0/.gitignore b/examples/migration-8.0/.gitignore new file mode 100644 index 00000000..7aea0eaa --- /dev/null +++ b/examples/migration-8.0/.gitignore @@ -0,0 +1 @@ +dump-data/* \ No newline at end of file diff --git a/examples/migration-8.0/compose-mysql8.0.yml b/examples/migration-8.0/compose-mysql8.0.yml new file mode 100644 index 00000000..9bcb5025 --- /dev/null +++ b/examples/migration-8.0/compose-mysql8.0.yml @@ -0,0 +1,81 @@ +version: "3" + +services: + mysql: + environment: + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + MYSQL_USER: ${DB_USER} + MYSQL_PASSWORD: ${DB_PASSWORD} + MYSQL_DATABASE: ${DB_DATABASE} + container_name: ${MYSQL_name} + image: mysql:8.3.0 + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] + interval: 20s + timeout: 20s + retries: 2 + start_period: 0s + volumes: + # Preload files for MySQL data + - ./mysql:/docker-entrypoint-initdb.d:z + # We have to save MySQL volume that will be used in upgrade + - dbdata:/var/lib/mysql + networks: + - backend + +# Sidecar for dumping files + mariadb-dump: + environment: + MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + MARIADB_USER: ${DB_USER} + MARIADB_PASSWORD: ${DB_PASSWORD} + MARIADB_DB: ${DB_DATABASE} + MYSQL_CONT_NAME: ${MYSQL_name} + container_name: ${MARIADB_DUMP_name} + image: mariadb:lts + depends_on: + mysql: + condition: service_healthy + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 10s + interval: 20s + timeout: 20s + retries: 3 + volumes: + - mysqldump:/etc/dump/ + - ./dump-mysql.sh:/docker-entrypoint-initdb.d/dump-mysql.sh + networks: + - backend + +# Sidecar for insert dump file + mariadb-migrated-from-mysql8: + environment: + MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + MARIADB_USER: ${DB_USER} + MARIADB_PASSWORD: ${DB_PASSWORD} + MARIADB_DB: ${DB_DATABASE} + container_name: ${MARIADB_MIGRATED_name} + image: mariadb:lts + depends_on: + mariadb-dump: + condition: service_healthy + # restart: true + volumes: + - mysqldump:/etc/dump/ + - ./migrate-mariadb.sh:/docker-entrypoint-initdb.d/migrate-mariadb.sh + networks: + - backend + +volumes: + dbdata: {} + # sudo chown -R 999:999 ${PWD}/dump-data # on host before running this file + mysqldump: + driver: local + driver_opts: + type: none + device: "${PWD}/dump-data" + o: bind + +networks: + backend: \ No newline at end of file diff --git a/examples/migration-8.0/dump-mysql.sh b/examples/migration-8.0/dump-mysql.sh new file mode 100755 index 00000000..4c41bbba --- /dev/null +++ b/examples/migration-8.0/dump-mysql.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +echo 'MariaDB service started.' +# Run your commands and exit container +whoami # mysql +# sh -c "chown -R mysql:mysql /etc/dump" # Operation permitted +echo 'Dump and compress MySQL data with changed collation ...' +fileName="mysql-dump-data.sql.zst" +if [ -f "$fileName" ]; then + echo "File ${fileName} exists. Remove it ... " + rm "$fileName" +fi +sh -c "mariadb-dump -h${MYSQL_CONT_NAME} -uroot -p${MARIADB_ROOT_PASSWORD} ${MARIADB_DB} | sed 's/utf8mb4_0900/uca1400/g' | zstd > /etc/dump/${fileName}" \ No newline at end of file diff --git a/examples/migration-8.0/migrate-mariadb.sh b/examples/migration-8.0/migrate-mariadb.sh new file mode 100644 index 00000000..d56f7481 --- /dev/null +++ b/examples/migration-8.0/migrate-mariadb.sh @@ -0,0 +1,13 @@ +#!/bin/bash +echo "Extract file" +oldFile="/etc/dump/mysql-dump.sql" +if [ -f "$oldFile" ]; then + echo "Old file ${oldFile} exists. Remove it ... " + rm "$oldFile" + echo "Extracting ..." +fi +sh -c "zstd -d /etc/dump/mysql-dump-data.sql.zst -o /etc/dump/mysql-dump.sql" +echo "Show data in MariaDB" +mariadb -uroot -p"${MARIADB_ROOT_PASSWORD}" -e "create database testdb;" +mariadb -uroot -p"${MARIADB_ROOT_PASSWORD}" "${MARIADB_DB}" < /etc/dump/mysql-dump.sql +mariadb -uroot -p"${MARIADB_ROOT_PASSWORD}" -e "show databases; select * from testdb.countries;" \ No newline at end of file diff --git a/examples/migration-8.0/mysql/mysql-data.sql b/examples/migration-8.0/mysql/mysql-data.sql new file mode 100644 index 00000000..c71d9588 --- /dev/null +++ b/examples/migration-8.0/mysql/mysql-data.sql @@ -0,0 +1,3 @@ +DROP TABLE IF EXISTS countries; +CREATE TABLE countries(name char(20)); +INSERT INTO countries values ("Bosnia & Herzegovina"); \ No newline at end of file