Skip to content

Commit 2fa4337

Browse files
committed
Automation script for MySQL 8.0 data migration
1 parent 7cf67e4 commit 2fa4337

File tree

7 files changed

+223
-0
lines changed

7 files changed

+223
-0
lines changed

examples/migration-8.0/.env

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
DB_ROOT_PASSWORD='secret'
2+
DB_USER='testuser'
3+
DB_PASSWORD='password'
4+
DB_DATABASE='testdb'
5+
MYSQL_name='mysql-container'
6+
MARIADB_DUMP_name='mariadb-container-dump'
7+
MARIADB_MIGRATED_name='mariadb-migrated-mysql8.0'
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
version: "3"
2+
3+
services:
4+
mysql:
5+
environment:
6+
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
7+
MYSQL_USER: ${DB_USER}
8+
MYSQL_PASSWORD: ${DB_PASSWORD}
9+
MYSQL_DATABASE: ${DB_DATABASE}
10+
container_name: ${MYSQL_name}
11+
image: mysql:8.3.0
12+
healthcheck:
13+
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
14+
interval: 20s
15+
timeout: 20s
16+
retries: 2
17+
start_period: 0s
18+
volumes:
19+
# Preload files for MySQL data
20+
- ./mysql:/docker-entrypoint-initdb.d:z
21+
# We have to save MySQL volume that will be used in upgrade
22+
- dbdata:/var/lib/mysql
23+
networks:
24+
- backend
25+
26+
# Sidecar for dumping files
27+
mariadb-dump:
28+
environment:
29+
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
30+
MARIADB_USER: ${DB_USER}
31+
MARIADB_PASSWORD: ${DB_PASSWORD}
32+
container_name: ${MARIADB_DUMP_name}
33+
image: mariadb:lts
34+
depends_on:
35+
mysql:
36+
condition: service_healthy
37+
healthcheck:
38+
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
39+
start_period: 10s
40+
interval: 20s
41+
timeout: 20s
42+
retries: 3
43+
# command: >
44+
# bash -c "
45+
# echo 'MariaDB service started. Dump MySQL data ...'
46+
# mariadb-dump -h mysql-container -uroot -psecret testdb > /etc/dump/mysql-dump-data.sql"
47+
# user: ${UID}:${EUID}
48+
volumes:
49+
- mysqldump:/etc/dump/
50+
# This will not exit container, but command: will
51+
- ./dump-mysql.sh:/docker-entrypoint-initdb.d/dump-mysql.sh
52+
networks:
53+
- backend
54+
# entrypoint: ["/docker-entrypoint-initdb.d/dump-mysql.sh"]
55+
56+
# We cannot share the same dump directory, we need to stop mariadb-dump
57+
stopper:
58+
image: docker:20.10
59+
depends_on:
60+
mariadb-dump:
61+
condition: service_healthy
62+
volumes:
63+
- /var/run/docker.sock:/var/run/docker.sock
64+
command: ["sh", "-c", "docker stop mariadb-container-dump"]
65+
66+
# Sidecar for insert dump file
67+
mariadb-migrated-from-mysql8:
68+
environment:
69+
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
70+
MARIADB_USER: ${DB_USER}
71+
MARIADB_PASSWORD: ${DB_PASSWORD}
72+
container_name: ${MARIADB_MIGRATED_name}
73+
image: mariadb:lts
74+
depends_on:
75+
mariadb-dump:
76+
condition: service_completed_successfully
77+
volumes:
78+
- mysqldump:/etc/dump/
79+
- ./migrate-mariadb.sh:/docker-entrypoint-initdb.d/migrate-mariadb.sh
80+
networks:
81+
- backend
82+
83+
volumes:
84+
dbdata: {}
85+
# sudo chown -R 999:999 ${PWD}/dump-data # host
86+
mysqldump:
87+
driver: local
88+
driver_opts:
89+
type: none
90+
device: "${PWD}/dump-data"
91+
o: bind
92+
93+
networks:
94+
backend:
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
-- MariaDB dump 10.19 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)
2+
--
3+
-- Host: mysql-container Database: testdb
4+
-- ------------------------------------------------------
5+
-- Server version 8.3.0
6+
7+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10+
/*!40101 SET NAMES utf8mb4 */;
11+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12+
/*!40103 SET TIME_ZONE='+00:00' */;
13+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17+
18+
--
19+
-- Table structure for table `countries`
20+
--
21+
22+
DROP TABLE IF EXISTS `countries`;
23+
/*!40101 SET @saved_cs_client = @@character_set_client */;
24+
/*!40101 SET character_set_client = utf8 */;
25+
CREATE TABLE `countries` (
26+
`name` char(20) DEFAULT NULL
27+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
28+
/*!40101 SET character_set_client = @saved_cs_client */;
29+
30+
--
31+
-- Dumping data for table `countries`
32+
--
33+
34+
LOCK TABLES `countries` WRITE;
35+
/*!40000 ALTER TABLE `countries` DISABLE KEYS */;
36+
INSERT INTO `countries` VALUES
37+
('Bosnia & Herzegovina');
38+
/*!40000 ALTER TABLE `countries` ENABLE KEYS */;
39+
UNLOCK TABLES;
40+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
41+
42+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
43+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
44+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
45+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
46+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
47+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
48+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
49+
50+
-- Dump completed on 2024-02-12 13:48:45
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
-- MariaDB dump 10.19 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)
2+
--
3+
-- Host: mysql-container Database: testdb
4+
-- ------------------------------------------------------
5+
-- Server version 8.3.0
6+
7+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10+
/*!40101 SET NAMES utf8mb4 */;
11+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12+
/*!40103 SET TIME_ZONE='+00:00' */;
13+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17+
18+
--
19+
-- Table structure for table `countries`
20+
--
21+
22+
DROP TABLE IF EXISTS `countries`;
23+
/*!40101 SET @saved_cs_client = @@character_set_client */;
24+
/*!40101 SET character_set_client = utf8 */;
25+
CREATE TABLE `countries` (
26+
`name` char(20) DEFAULT NULL
27+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
28+
/*!40101 SET character_set_client = @saved_cs_client */;
29+
30+
--
31+
-- Dumping data for table `countries`
32+
--
33+
34+
LOCK TABLES `countries` WRITE;
35+
/*!40000 ALTER TABLE `countries` DISABLE KEYS */;
36+
INSERT INTO `countries` VALUES
37+
('Bosnia & Herzegovina');
38+
/*!40000 ALTER TABLE `countries` ENABLE KEYS */;
39+
UNLOCK TABLES;
40+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
41+
42+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
43+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
44+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
45+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
46+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
47+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
48+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
49+
50+
-- Dump completed on 2024-02-12 13:48:45
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/bin/bash
2+
3+
echo 'MariaDB service started. Dump MySQL data ...'
4+
# Run your commands and exit container
5+
whoami # mysql"
6+
# sh -c "chown -R mysql:mysql /etc/dump" # Operation permitted
7+
# sh -c "ls -la /etc/dump"
8+
sh -c "mariadb-dump -h mysql-container -uroot -psecret testdb > /etc/dump/mysql-dump-data.sql"
9+
sh -c "ls -la /etc/dump/"
10+
echo "List before"
11+
sh -c "cp /etc/dump/mysql-dump-data.sql /etc/dump/mysql-dump-data-utf8mb4_unicode_ci.sql"
12+
sh -c "ls -la /etc/dump/"
13+
echo "List after"
14+
sh -c "sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' /etc/dump/mysql-dump-data-utf8mb4_unicode_ci.sql"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash
2+
echo "Show data in MariaDB"
3+
mariadb -uroot -psecret -e "create database testdb;"
4+
mariadb -uroot -psecret testdb < /etc/dump/mysql-dump-data-utf8mb4_unicode_ci.sql
5+
mariadb -uroot -psecret -e "show databases; select * from countries;"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
DROP TABLE IF EXISTS countries;
2+
CREATE TABLE countries(name char(20));
3+
INSERT INTO countries values ("Bosnia & Herzegovina");

0 commit comments

Comments
 (0)