拉取容器
docker pull mysql:5.6
主从容器启动
docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.6docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.6
VIM的安装
进入主容器,安装VIM
docker exec -it mysql-master /bin/bashapt-get updateapt-get install vim //安装之前最好更换源,原来的源安装很慢
主配置
cd /etc/mysqlvim my.cnf
添加以下配置
[mysqld]server-id=100log-bin=mysql-bin
重启MYSQL服务
service mysql restart //重启后它会退出当前容器
回到docker环境,启动容器
docker start mysql-master //docker重启主mysql
从配置
[mysqld]#设置server_id,注意要唯一server-id=101#开启二进制日志功能,以备Slave作为其它Slave的Master时使用log-bin=mysql-slave-bin#relay_log配置中继日志relay_log=edu-mysql-relay-bin
完了重启服务,与MASTER一样
主服务创建数据同步用户
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';Query OK, 0 rows affectedmysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';Query OK, 0 rows affected
刷新授权:
flush privileges;
从从服务器测试是否授权登录成功
mysql -h 172.18.0.3 -uslave -p123456 //ip是主服务的IP地址
重启主从容器
# 主docker stop mysql-masterdocker start mysql-master# 从docker stop mysql-slavedocker start mysql-slave
链接主从
查看MASTER所在的容器IP:
ubuntu@VM-0-14-ubuntu:~$ docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master172.18.0.3
查看MASTER的状态
mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 425 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set
在从服务器执行链接命令:
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;Query OK, 0 rows affected
ps: 注意 master_log_file='mysql-bin.000001', master_log_pos=425 这两个键值是上一步查看master的状态得来的。
在SLAVE查看从同步状态:
mysql> show slave status \G;1. rowSlave_IO_State: Waiting for master to send eventMaster_Host: 172.18.0.4Master_User: slaveMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 199Relay_Log_File: edu-mysql-relay-bin.000002Relay_Log_Pos: 362Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: NOSlave_SQL_Running: NO
此时 Slave_IO_Running: NO 为NO状态,表明还未连接
启动从服务
mysql> start slave;
再查看
mysql> show slave status \G;1. rowSlave_IO_State: Waiting for master to send eventMaster_Host: 172.18.0.3Master_User: slaveMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 199Relay_Log_File: edu-mysql-relay-bin.000002Relay_Log_Pos: 362Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YESSlave_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 | | |
- 停止slave服务```bashstop 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;
- 重启slave服务```bashstart slave
查看slave状态 ```bash show slave status \G;
看到此两个YES状态,即同步OK
Slave_IO_Running: Yes Slave_SQL_Running: Yes
```
- 测试
在主服务器添加数据库,看是否同步到从服务器
