|
| 1 | +#!/bin/bash |
| 2 | +set -e |
| 3 | +set -o pipefail |
| 4 | +[ -f .env ] && . .env |
| 5 | + |
| 6 | +for i in 1 2 3; do |
| 7 | + SERVICE="mysql$i" |
| 8 | + CONTAINER="${COMPOSE_PROJECT}-${SERVICE}-1" |
| 9 | + echo -n "Waiting for container '${CONTAINER}' ..." |
| 10 | + |
| 11 | + MAX_WAIT=120 |
| 12 | + COUNT=0 |
| 13 | + PASS_OPT="" |
| 14 | + while true; do |
| 15 | + if [ $COUNT -ge $MAX_WAIT ]; then echo " TIMEOUT"; docker logs "${CONTAINER}" | tail -n 20; exit 1; fi |
| 16 | + STATE=$(docker inspect -f '{{.State.Running}}' "${CONTAINER}" 2>/dev/null || echo "false") |
| 17 | + if [ "${STATE}" != "true" ]; then echo -e "\nERROR: Container ${CONTAINER} is NOT running!"; docker logs "${CONTAINER}" | tail -n 20; exit 1; fi |
| 18 | + # Try dynamic password first |
| 19 | + if docker exec "${CONTAINER}" mysql -h127.0.0.1 -uroot -p"${ROOT_PASSWORD}" -e "SELECT 1" >/dev/null 2>&1; then |
| 20 | + PASS_OPT="-p${ROOT_PASSWORD}" |
| 21 | + echo " OK (Auth: Dynamic)." |
| 22 | + break |
| 23 | + fi |
| 24 | + # Try default root password from image |
| 25 | + if docker exec "${CONTAINER}" mysql -h127.0.0.1 -uroot -proot -e "SELECT 1" >/dev/null 2>&1; then |
| 26 | + PASS_OPT="-proot" |
| 27 | + echo " OK (Auth: Default root)." |
| 28 | + break |
| 29 | + fi |
| 30 | + # Try empty password |
| 31 | + if docker exec "${CONTAINER}" mysql -h127.0.0.1 -uroot -e "SELECT 1" >/dev/null 2>&1; then |
| 32 | + PASS_OPT="" |
| 33 | + echo " OK (Auth: Empty)." |
| 34 | + break |
| 35 | + fi |
| 36 | + echo -n "."; sleep 2; COUNT=$((COUNT+2)) |
| 37 | + done |
| 38 | + |
| 39 | + if [ "$i" -eq 1 ]; then |
| 40 | + echo "Configuring master (mysql1)..." |
| 41 | + docker exec -i "${CONTAINER}" mysql -h127.0.0.1 -uroot ${PASS_OPT} <<SQL || { echo "ERROR: Failed master configuration on ${CONTAINER}"; exit 1; } |
| 42 | +SET GLOBAL READ_ONLY=0; |
| 43 | +
|
| 44 | +-- Ensure root user has the correct dynamic password (replicated to replicas) |
| 45 | +CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY '${ROOT_PASSWORD}'; |
| 46 | +ALTER USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY '${ROOT_PASSWORD}'; |
| 47 | +ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '${ROOT_PASSWORD}'; |
| 48 | +GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; |
| 49 | +
|
| 50 | +-- Monitor user (replicated to replicas) |
| 51 | +CREATE USER IF NOT EXISTS 'monitor'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'monitor'; |
| 52 | +GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%'; |
| 53 | +
|
| 54 | +-- testuser (replicated to replicas) |
| 55 | +CREATE USER IF NOT EXISTS 'testuser'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'testuser'; |
| 56 | +GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%'; |
| 57 | +
|
| 58 | +-- Binlog user (required for binlog reader, replicated to replicas) |
| 59 | +CREATE USER IF NOT EXISTS 'binlog'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'binlog'; |
| 60 | +GRANT USAGE, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'binlog'@'%'; |
| 61 | +
|
| 62 | +-- sbtest7 and sbtest8 users (specifically for binlog tests, replicated to replicas) |
| 63 | +CREATE USER IF NOT EXISTS 'sbtest7'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'sbtest7'; |
| 64 | +GRANT ALL PRIVILEGES ON *.* TO 'sbtest7'@'%'; |
| 65 | +CREATE USER IF NOT EXISTS 'sbtest8'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'sbtest8'; |
| 66 | +GRANT ALL PRIVILEGES ON *.* TO 'sbtest8'@'%'; |
| 67 | +
|
| 68 | +-- Create test databases |
| 69 | +CREATE DATABASE IF NOT EXISTS sysbench; |
| 70 | +CREATE DATABASE IF NOT EXISTS test; |
| 71 | +CREATE DATABASE IF NOT EXISTS t1; |
| 72 | +CREATE DATABASE IF NOT EXISTS jdbc_test; |
| 73 | +GRANT ALL PRIVILEGES ON sysbench.* TO 'sbtest7'@'%'; |
| 74 | +GRANT ALL PRIVILEGES ON sysbench.* TO 'sbtest8'@'%'; |
| 75 | +GRANT ALL PRIVILEGES ON test.* TO 'sbtest7'@'%'; |
| 76 | +GRANT ALL PRIVILEGES ON test.* TO 'sbtest8'@'%'; |
| 77 | +
|
| 78 | +FLUSH PRIVILEGES; |
| 79 | +SQL |
| 80 | + else |
| 81 | + echo "Configuring replica (mysql${i})..." |
| 82 | + docker exec -i "${CONTAINER}" mysql -h127.0.0.1 -uroot ${PASS_OPT} <<SQL || { echo "ERROR: Failed replica configuration on ${CONTAINER}"; exit 1; } |
| 83 | +SET GLOBAL READ_ONLY=1; |
| 84 | +RESET BINARY LOGS AND GTIDS; |
| 85 | +
|
| 86 | +-- Configure replication using MySQL 8.4 syntax |
| 87 | +CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql1.${INFRA}', SOURCE_USER='root', SOURCE_PASSWORD='${ROOT_PASSWORD}', SOURCE_AUTO_POSITION=1; |
| 88 | +START REPLICA; |
| 89 | +
|
| 90 | +FLUSH PRIVILEGES; |
| 91 | +SQL |
| 92 | + fi |
| 93 | +done |
| 94 | + |
| 95 | +echo "================================================================================" |
| 96 | +echo "MySQL cluster configuration complete." |
| 97 | +echo "================================================================================" |
0 commit comments