|
| 1 | +#!/bin/bash |
| 2 | +#################### 变量定义 #################### |
| 3 | +mysql_user="mydb_slave_user" # 主服务器允许从服务器登录的用户名 |
| 4 | +mysql_password="mydb_slave_pwd" # 主服务器允许从服务器登录的密码 |
| 5 | +root_password="111" # 每台服务器的root密码 |
| 6 | +# 主库列表 |
| 7 | +master_container=mysql_master |
| 8 | +# 从库列表 |
| 9 | +slave_containers=(mysql_slave mysql_slave2) |
| 10 | +# 所有的数据库集群列表 |
| 11 | +all_containers=($master_container ${slave_containers[@]}) |
| 12 | + |
| 13 | +#################### 函数定义 #################### |
| 14 | +# 获取服务器的ip |
| 15 | +docker-ip() { |
| 16 | + docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@" |
| 17 | +} |
| 18 | + |
| 19 | +#################### docker-compose初始化 #################### |
| 20 | +docker-compose down |
| 21 | +rm -rf ./master/data/* |
| 22 | +rm -rf ./slave/data/* |
| 23 | +rm -rf ./slave2/data/* |
| 24 | +docker-compose build |
| 25 | +docker-compose up -d |
| 26 | + |
| 27 | +#################### 服务器初始化操作 #################### |
| 28 | +# 这个操作的目的是尝试连接服务器, 如果连接失败, 就等待4s后重试, 直到等待mysql服务器就绪, 并且连接上为止 |
| 29 | +for container in ${all_containers[@]};do |
| 30 | + until docker exec $container sh -c 'export MYSQL_PWD='$root_password'; mysql -u root -e ";"' |
| 31 | + do |
| 32 | + echo "Waiting for mysql_master database connection..." |
| 33 | + sleep 4 |
| 34 | + done |
| 35 | +done |
| 36 | + |
| 37 | +#################### 主服务器操作 ####################开始 |
| 38 | +# 在主服务器上添加数据库用户 |
| 39 | +priv_stmt='GRANT REPLICATION SLAVE ON *.* TO "'$mysql_user'"@"%" IDENTIFIED BY "'$mysql_password'"; FLUSH PRIVILEGES;' |
| 40 | + |
| 41 | +docker exec $master_container sh -c "export MYSQL_PWD='$root_password'; mysql -u root -e '$priv_stmt'" |
| 42 | + |
| 43 | +# 查看主服务器的状态 |
| 44 | +MS_STATUS=`docker exec $master_container sh -c 'export MYSQL_PWD='$root_password'; mysql -u root -e "SHOW MASTER STATUS"'` |
| 45 | + |
| 46 | +# binlog文件名字,对应 File 字段,值如: mysql-bin.000004 |
| 47 | +CURRENT_LOG=`echo $MS_STATUS | awk '{print $6}'` |
| 48 | +# binlog位置,对应 Position 字段,值如: 1429 |
| 49 | +CURRENT_POS=`echo $MS_STATUS | awk '{print $7}'` |
| 50 | + |
| 51 | +#################### 从服务器操作 ####################开始 |
| 52 | +# 设置从服务器与主服务器互通命令 |
| 53 | +start_slave_stmt="CHANGE MASTER TO |
| 54 | + MASTER_HOST='$(docker-ip $master_container)', |
| 55 | + MASTER_USER='$mysql_user', |
| 56 | + MASTER_PASSWORD='$mysql_password', |
| 57 | + MASTER_LOG_FILE='$CURRENT_LOG', |
| 58 | + MASTER_LOG_POS=$CURRENT_POS;" |
| 59 | +start_slave_cmd='export MYSQL_PWD='$root_password'; mysql -u root -e "' |
| 60 | +start_slave_cmd+="$start_slave_stmt" |
| 61 | +start_slave_cmd+='START SLAVE;"' |
| 62 | + |
| 63 | +# 执行从服务器与主服务器互通 |
| 64 | +for slave in ${slave_containers[@]};do |
| 65 | + # 从服务器连接主互通 |
| 66 | + docker exec $slave sh -c "$start_slave_cmd" |
| 67 | + # 查看从服务器得状态 |
| 68 | + docker exec $slave sh -c "export MYSQL_PWD='$root_password'; mysql -u root -e 'SHOW SLAVE STATUS \G'" |
| 69 | +done |
| 70 | + |
0 commit comments