Skip to content

Commit

Permalink
Automation script for MySQL 8.0 data migration
Browse files Browse the repository at this point in the history
  • Loading branch information
an3l committed Feb 19, 2024
1 parent 4fde9c4 commit 7b9d423
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 0 deletions.
7 changes: 7 additions & 0 deletions examples/migration-8.0/.env
Original file line number Diff line number Diff line change
@@ -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'
1 change: 1 addition & 0 deletions examples/migration-8.0/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
dump-data/*
80 changes: 80 additions & 0 deletions examples/migration-8.0/compose-mysql8.0.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
version: "3.2"
# Anchors
x-common-variables: &common-variables
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MARIADB_USER: ${DB_USER}
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_DB: ${DB_DATABASE}
MYSQL_CONT_NAME: ${MYSQL_name}

x-common-attributes: &common-attributes
env_file:
- .env
image: mariadb:lts
environment: *common-variables # alias
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
start_period: 10s
interval: 20s
timeout: 20s
retries: 3
networks:
- backend

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
command: --print-identified-with-as-hex=ON
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

mariadb-dump:
<<: *common-attributes # aliases
container_name: ${MARIADB_DUMP_name}
depends_on:
mysql:
condition: service_healthy
volumes:
- mysqldump:/etc/dump/
- ./dump-mysql.sh:/docker-entrypoint-initdb.d/dump-mysql.sh

mariadb-migrated-from-mysql8:
<<: *common-attributes # aliases
container_name: ${MARIADB_MIGRATED_name}
depends_on:
mariadb-dump:
condition: service_healthy
# restart: true
volumes:
- mysqldump:/etc/dump/
- ./migrate-mariadb.sh:/docker-entrypoint-initdb.d/migrate-mariadb.sh

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:
28 changes: 28 additions & 0 deletions examples/migration-8.0/dump-mysql.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/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 'Remove files if exist'
files=("mysql-dump-data.sql.zst" "mysql-dump-users.sql.zst" "mysql-dump-stats.sql.zst" "mysql-dump-tzs.sql.zst")
for fileName in "${files[@]}"; do
if [ -f "$fileName" ]; then
echo "File ${fileName} exists. Remove it ... "
rm "$fileName"
fi
done
echo 'Dump and compress MySQL data with changed collation ...'
fileName="mysql-dump-data.sql.zst"
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}"
echo 'Dump and compress MySQL users ...'
fileName="mysql-dump-users.sql.zst"
sh -c "mariadb-dump -h${MYSQL_CONT_NAME} -uroot -p${MARIADB_ROOT_PASSWORD} --system=users | zstd > /etc/dump/${fileName}"
echo 'Dump and compress MySQL stats ...'
fileName="mysql-dump-stats.sql.zst"
sh -c "mariadb-dump -h${MYSQL_CONT_NAME} -uroot -p${MARIADB_ROOT_PASSWORD} --system=stats | zstd > /etc/dump/${fileName}"
echo 'Dump and compress MySQL timezones ...'
fileName="mysql-dump-tzs.sql.zst"
sh -c "mariadb-dump -h${MYSQL_CONT_NAME} -uroot -p${MARIADB_ROOT_PASSWORD} --system=timezones | zstd > /etc/dump/${fileName}"
echo 'Show MySQL 8.0 create user'
sh -c "mariadb -h${MYSQL_CONT_NAME} -uroot -p${MARIADB_ROOT_PASSWORD} -e 'SELECT @@print_identified_with_as_hex; show create user current_user();'"
15 changes: 15 additions & 0 deletions examples/migration-8.0/migrate-mariadb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/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;"
# In order to import MySQL users we have to fix bug MDEV-33486
# We need to load `caching_sha2_password`
3 changes: 3 additions & 0 deletions examples/migration-8.0/mysql/mysql-data.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
DROP TABLE IF EXISTS countries;
CREATE TABLE countries(name char(20));
INSERT INTO countries values ("Bosnia & Herzegovina");

0 comments on commit 7b9d423

Please sign in to comment.