MySQL 配置主从复制测试

步骤

  1. 修改主、从服务器配置并重启
  2. 主服务器查看当前bin文件和位置,在从服务器上设置, 并启动
# 主服务器运行sql
#   如果主服务器之前有数据,或正在持续读写,需要同步之前数据则加锁手动dump
#   flush table with read lock;
#   mysqldump 到 从服务器
show master status#   unlock tables;

# 从服务器运行
#   直接用root同步,省略单独建账户步骤
CHANGE MASTER TO MASTER_HOST='主服务器地址', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='MYSQL_ROOT_PASSWORD', MASTER_LOG_FILE='MASTER_LOG_FILE', MASTER_LOG_POS=$MASTER_LOG_POS; 
start slave;
  1. 主服务新建数据库,表,插入数据,从服务器上验证

master/my.cnf

[mysqld]
log-bin = /var/lib/mysql/binlog
server-id = 1
; binlog_do_db = db1    # 需同步的DB, 默认全部
; binlog_do_db = db2
; binlog_ignore_db = db3 # 忽略的DB
; binlog_ignore_db = db4

slaver1/my.cnf

[mysqld]
server-id = 21  # 每台服务器名字不一样即可
; binlog_do_db = db1    # 需同步的DB, 默认全部
; binlog_do_db = db2
; binlog_ignore_db = db3 # 忽略的DB
; binlog_ignore_db = db4

slaver2/my.cnf

[mysqld]
server-id = 22
; binlog_do_db = db1    # 需同步的DB, 默认全部
; binlog_do_db = db2
; binlog_ignore_db = db3 # 忽略的DB
; binlog_ignore_db = db4

使用docker启动三个mysql测试

#!/usr/bin/bash
set -e

MYSQL_ROOT_PASSWORD="123"

echo "正在创建一主二从Mysql"
docker run --name mysql-master -h mysql-master -e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" -d mysql:5.7
docker run --name mysql-slaver1 -h mysql-slaver1 --link mysql-master:master -e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" -d mysql:5.7
docker run --name mysql-slaver2 -h mysql-slaver2 --link mysql-master:master -e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" -d mysql:5.7

echo "正在修改my.cnf配置文件"
docker exec mysql-master bash -c 'cat << EOF >> /etc/mysql/my.cnf
[mysqld]
log-bin = /var/lib/mysql/binlog
server-id = 1
EOF'

docker exec mysql-slaver1 bash -c 'cat << EOF >> /etc/mysql/my.cnf
[mysqld]
server-id = 21
EOF'

docker exec mysql-slaver2 bash -c 'cat << EOF >> /etc/mysql/my.cnf
[mysqld]
server-id = 22
EOF'

echo "正在重启所有Mysql服务器"
sleep 5s
docker restart mysql-master mysql-slaver1 mysql-slaver2


# 全新安装,不考虑主服务器之前需要同步的数据
# 如需同步之前数据,先锁定主服务器只读,mysqldump出数据
# 手动备份到从服务器再执行同步配置
echo "正在获取主服务器log_bin文件和位置"
_tmp=$(docker exec -i mysql-master mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "flush table with read lock;/*如果主服务器之前有数据,或正在持续读写,需要同步之前数据则加锁手动dump*/ show master status\G unlock tables")
MASTER_LOG_FILE=$(echo "$_tmp" | awk '/File:/ {print $2}')
MASTER_LOG_POS=$(echo "$_tmp" | awk '/Position:/ {print $2}')
echo "----------------------------"
echo "  File: $MASTER_LOG_FILE"
echo "  Position: $MASTER_LOG_POS"
echo "----------------------------"

echo "正在设置从服务器同步配置"
sleep 5
docker exec mysql-slaver1 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "CHANGE MASTER TO MASTER_HOST='master', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='$MYSQL_ROOT_PASSWORD', MASTER_LOG_FILE='$MASTER_LOG_FILE', MASTER_LOG_POS=$MASTER_LOG_POS; start slave"

docker exec mysql-slaver2 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "CHANGE MASTER TO MASTER_HOST='master', MASTER_PORT=3306, MASTER_USER='root', MASTER_PASSWORD='$MYSQL_ROOT_PASSWORD', MASTER_LOG_FILE='$MASTER_LOG_FILE', MASTER_LOG_POS=$MASTER_LOG_POS; start slave"

echo "设置完成, 查看从服务器运行状态"
sleep 5
echo "----------------------------"
docker exec mysql-slaver1 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "show slave status\G" | grep -iP "IO_Running|SQL_Running"
docker exec mysql-slaver2 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "show slave status\G" | grep -iP "IO_Running|SQL_Running"
echo "----------------------------"

# 输出
正在创建一主二从Mysql
048e5f4b09c05364176ec1cebc76b0cc090af54994e3708d21a71a9c6cabba86
1ceabd786c752eb30fa5eef8308f1756fd339c9cc8dfe2004adcc699885b89b2
05056dfe221304c722d04654ffe28913117c2c39c59290f109111c36710235ff
正在修改my.cnf配置文件
正在重启所有Mysql服务器
mysql-master
mysql-slaver1
mysql-slaver2
正在获取主服务器log_bin文件和位置
mysql: [Warning] Using a password on the command line interface can be insecure.
----------------------------
  File: binlog.000003
  Position: 154
----------------------------
正在设置从服务器同步配置
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
设置完成, 查看从服务器运行状态
----------------------------
mysql: [Warning] Using a password on the command line interface can be insecure.
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
mysql: [Warning] Using a password on the command line interface can be insecure.
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
----------------------------

测试验证

主服务器修改
从服务器1验证
从服务器2验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值