拉取容器

  1. docker pull mysql:5.6

主从容器启动

  1. docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.6
  2. docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.6

VIM的安装

进入主容器,安装VIM

  1. docker exec -it mysql-master /bin/bash
  2. apt-get update
  3. apt-get install vim //安装之前最好更换源,原来的源安装很慢

主配置

  1. cd /etc/mysql
  2. vim my.cnf

添加以下配置

  1. [mysqld]
  2. server-id=100
  3. log-bin=mysql-bin

重启MYSQL服务

  1. service mysql restart //重启后它会退出当前容器

回到docker环境,启动容器

  1. docker start mysql-master //docker重启主mysql

从配置

  1. [mysqld]
  2. #设置server_id,注意要唯一
  3. server-id=101
  4. #开启二进制日志功能,以备Slave作为其它Slave的Master时使用
  5. log-bin=mysql-slave-bin
  6. #relay_log配置中继日志
  7. relay_log=edu-mysql-relay-bin

完了重启服务,与MASTER一样

主服务创建数据同步用户

  1. mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
  2. Query OK, 0 rows affected
  3. mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  4. Query OK, 0 rows affected

刷新授权:

  1. flush privileges;

服务器测试是否授权登录成功

  1. mysql -h 172.18.0.3 -uslave -p123456 //ip是主服务的IP地址

重启主从容器

  1. # 主
  2. docker stop mysql-master
  3. docker start mysql-master
  4. # 从
  5. docker stop mysql-slave
  6. docker start mysql-slave

链接主从

查看MASTER所在的容器IP:

  1. ubuntu@VM-0-14-ubuntu:~$ docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
  2. 172.18.0.3

查看MASTER的状态

  1. mysql> show master status;
  2. +------------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | mysql-bin.000001 | 425 | | | |
  6. +------------------+----------+--------------+------------------+-------------------+
  7. 1 row in set

服务器执行链接命令:

  1. mysql> change master to master_host='172.18.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=425, master_connect_retry=30;
  2. Query OK, 0 rows affected

ps: 注意 master_log_file='mysql-bin.000001', master_log_pos=425 这两个键值是上一步查看master的状态得来的。

在SLAVE查看从同步状态:

  1. mysql> show slave status \G;
  2. 1. row
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: 172.18.0.4
  5. Master_User: slave
  6. Master_Port: 3306
  7. Connect_Retry: 30
  8. Master_Log_File: mysql-bin.000002
  9. Read_Master_Log_Pos: 199
  10. Relay_Log_File: edu-mysql-relay-bin.000002
  11. Relay_Log_Pos: 362
  12. Relay_Master_Log_File: mysql-bin.000002
  13. Slave_IO_Running: NO
  14. Slave_SQL_Running: NO

此时 Slave_IO_Running: NO 为NO状态,表明还未连接

启动从服务

  1. mysql> start slave;

再查看

  1. mysql> show slave status \G;
  2. 1. row
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: 172.18.0.3
  5. Master_User: slave
  6. Master_Port: 3306
  7. Connect_Retry: 30
  8. Master_Log_File: mysql-bin.000002
  9. Read_Master_Log_Pos: 199
  10. Relay_Log_File: edu-mysql-relay-bin.000002
  11. Relay_Log_Pos: 362
  12. Relay_Master_Log_File: mysql-bin.000002
  13. Slave_IO_Running: YES
  14. Slave_SQL_Running: YES

此时 Slave_IO_Running: YES 为YES状态,表明主从已成功同步

教训

特别注意启动主从链接命令,是在 服务器执行链接,否则会出现执行命令 show slave status \G 为空现象。

重新同步数据

出于某些其它方面的原因,可能从服务器出现数据未同步,此时需要重新同步数据,步骤如下:

  • 主状态的同步位置查看 ```bash show master status;

    File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +—————————+—————+———————+—————————+—————————-+ | mysql-bin.000004 | 20693163 | | |

  1. - 停止slave服务
  2. ```bash
  3. stop slave
  • 重新设置同步位置 ```bash

    注意 master_log_file 与 master_log_pos 的配置,是上一步master查询值

    change master to master_host=’172.18.0.3’, master_user=’slave’, master_password=’123456’, master_port=3306, master_log_file=’mysql-bin.000004’, master_log_pos=20693163, master_connect_retry=30;
  1. - 重启slave服务
  2. ```bash
  3. start slave
  • 查看slave状态 ```bash show slave status \G;

    看到此两个YES状态,即同步OK

    Slave_IO_Running: Yes Slave_SQL_Running: Yes

```

  • 测试

在主服务器添加数据库,看是否同步到从服务器