Skip to content
Snippets Groups Projects
Commit 7b9d423b authored by Anel Husakovic's avatar Anel Husakovic
Browse files

Automation script for MySQL 8.0 data migration

parent 4fde9c48
No related branches found
No related tags found
No related merge requests found
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
dump-data/*
\ No newline at end of file
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:
\ No newline at end of file
#!/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();'"
\ No newline at end of file
#!/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`
\ No newline at end of file
DROP TABLE IF EXISTS countries;
CREATE TABLE countries(name char(20));
INSERT INTO countries values ("Bosnia & Herzegovina");
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment