1、新建主服务器容器实例,端口: 3307
- docker run \
- -p 3307:3306 \
- --name mysql-master \
- -v /var/docker/mysql-master/log:/var/log/mysql \
- -v /var/docker/mysql-master/data:/var/lib/mysql \
- -v /var/docker/mysql-master/conf:/etc/mysql \
- --privileged=true \
- -e MYSQL_ROOT_PASSWORD=123456 \
- -d mysql:5.7
2、进入 /var/docker/mysql-master/conf 目录下新建 my.cnf
vim my.cnf
- [client]
- # 设置客户端监听的端口
- port=3307
- # 设置字符集类型
- default-character-set=utf8mb4
-
-
- [mysqld]
- port=3306
- # 默认使用的字符集
- character_set_server=utf8mb4
- collation-server=utf8mb4_unicode_ci
- init_connect='SET NAMES utf8mb4'
- explicit_defaults_for_timestamp=true
-
- default-storage-engine=Innodb
-
-
- server_id=11
- # 指定不需要同步的数据库名称
- binlog-ignore-db=mysql
- # 开启二进制日志功能
- log-bin=mall-mysql-bin
- # 设置二进制日志使用内存大小
- binlog_cache_size=1M
- # 设置使用的二进制日志格式(mixed,statement,row)
- binlog_format=mixed
- # 二进制日志过期清理时间。默认值为0,表示不自动清理。
- expire_logs_days=7
- # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
- slave_skip_errors=1062
3、修改完配置后重启 master 实例
docker restart mysql-master
4、进入 mysql-master 容器
docker exec -it mysql-master /bin/bash
5、进入 mysql
mysql -urtoo -p
查询 mysql 字符集:
SHOW VARIABLES LIKE 'character%';

6、master容器实例内创建具有复制权限的账号
- CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
- GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
7、新建从服务器容器实例 3308
- docker run \
- -p 3308:3306 \
- --name mysql-slave \
- -v /var/docker/mysql-slave/log:/var/log/mysql \
- -v /var/docker/mysql-slave/data:/var/lib/mysql \
- -v /var/docker/mysql-slave/conf:/etc/mysql \
- --privileged=true \
- -e MYSQL_ROOT_PASSWORD=123456 \
- -d mysql:5.7

8、进入 /var/docker/mysql-slave/conf目录下新建 my.cnf
- [client]
- port=3308
- default-character-set=utf8mb4
-
-
- [mysqld]
- port=3306
- character_set_server=utf8mb4
- collation-server=utf8mb4_unicode_ci
- init_connect='SET NAMES utf8mb4'
- explicit_defaults_for_timestamp=true
-
- default-storage-engine=Innodb
-
-
- server_id=12
- binlog-ignore-db=mysql
- # 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
- log-bin=mall-mysql-slave1-bin
- # 设置二进制日志使用内存大小
- binlog_cache_size=1M
- binlog_format=mixed
- # 二进制日志过期清理时间。默认值为0,表示不自动清理。
- expire_logs_days=7
- # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
- slave_skip_errors=1062
- # relay_log配置中继日志
- relay_log=mall-mysql-relay-bin
- # log_slave_updates表示slave将复制事件写进自己的二进制日志
- log_slave_updates=1
- read_only=1
9、重启 slave 实例
docker restart mysql-slave
10、在主数据库中查看主从同步状态
show master status;

11、进入 mysql-slave 容器中配置主从复制
- change master to master_host='宿主机ip',
- master_user='slave',
- master_password='123456',
- master_port=3307,
- master_log_file='mall-mysql-bin.000004',
- master_log_pos=617,
- master_connect_retry=30;
主从复制命令参数说明
master_host 主数据库的IP地址;
master_port 主数据库的运行端口;
master_user 在主数据库创建的用于同步数据的用户账号;
master_password 在主数据库创建的用于同步数据的用户密码;
master_log_file 指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos 指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry 连接失败重试的时间间隔,单位为秒。
12、在从数据库中查看主从同步状态
show slave status \G;
- mysql> show slave status \G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 192.168.11.12
- Master_User: slave
- Master_Port: 3307
- Connect_Retry: 30
- Master_Log_File: mall-mysql-bin.000003
- Read_Master_Log_Pos: 313
- Relay_Log_File: mall-mysql-relay-bin.000001
- Relay_Log_Pos: 4
- Relay_Master_Log_File: mall-mysql-bin.000003
- Slave_IO_Running: No
- Slave_SQL_Running: No
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 313
- Relay_Log_Space: 154
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: NULL
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 0
- Master_UUID:
- Master_Info_File: /var/lib/mysql/master.info
- SQL_Delay: 0
- SQL_Remaining_Delay: NULL
- Slave_SQL_Running_State:
- Master_Retry_Count: 86400
- Master_Bind:
- Last_IO_Error_Timestamp:
- Last_SQL_Error_Timestamp:
- Master_SSL_Crl:
- Master_SSL_Crlpath:
- Retrieved_Gtid_Set:
- Executed_Gtid_Set:
- Auto_Position: 0
- Replicate_Rewrite_DB:
- Channel_Name:
- Master_TLS_Version:
- 1 row in set (0.00 sec)
13、在从数据库中开启主从同步
start slave;
