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