注意不适用Mysql8
Docker搭建Mysql主从复制
docker run -p 3307:3306 --name mysql-master \
-v /usr/local/develop/mysql-master/log:/var/log/mysql \
-v /usr/local/develop/mysql-master/data:/var/lib/mysql \
-v /usr/local/develop/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
如果没有mysql5.7会自动下载
进入配置文件目录
cd /usr/local/develop/mysql-master/conf
创建并编辑配置文件
vim my.cnf
[mysqld]
# 设置server_id,同一局域网中需要唯一,对复制架构至关重要
server_id=101
# 指定不需要同步到从库的数据库名称,一般系统数据库mysql不需要同步
binlog-ignore-db=mysql
# 开启二进制日志功能,是MySQL复制的基础
log-bin=mall-mysql-bin
# 设置二进制日志使用的内存大小,用于缓存事务,提高性能
binlog_cache_size=1M
# 设置使用的二进制日志格式,推荐使用"row",因为它是最安全的,能准确复制每一行的变更
# mixed模式下,MySQL会根据操作类型自动选择statement模式还是row模式
binlog_format=mixed
# 二进制日志过期清理时间,设置为7天。0表示不自动清理,不推荐这样做,因为会积累大量日志
expire_logs_days=7
# 跳过主从复制中遇到的指定类型的错误,避免从库复制中断
# 注意:过度使用该设置可能会导致数据不一致,应谨慎使用
slave_skip_errors=1062
修改完配置 重启mysql docker容器实例
docker restart mysql-master
进入容器
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
创建数据同步用户 并赋予权限
CREATE USER 'replica'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replica'@'%';
刷新
FLUSH PRIVILEGES;(不刷也可以)
在宿主机上搭建从服务器
docker run -p 3308:3306 --name mysql-slave \
-v /usr/local/develop/mysql-slave/log:/var/log/mysql \
-v /usr/local/develop/mysql-slave/data:/var/lib/mysql \
-v /usr/local/develop/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
进入
cd /usr/local/develop/mysql-slave/conf
创建并编辑从数据库配置
vim my.cnf
[mysqld]
# 设置server_id,同一局域网中需要唯一,对复制架构至关重要
server_id=102
# 指定不需要同步到从库的数据库名称,一般系统数据库mysql不需要同步
binlog-ignore-db=mysql
# 开启二进制日志功能,以备Slave作为其他数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
# 设置二进制日志使用的内存大小,用于缓存事务,提高性能
binlog_cache_size=1M
# 设置使用的二进制日志格式,推荐使用"row",因为它是最安全的,能准确复制每一行的变更
# mixed模式下,MySQL会根据操作类型自动选择statement模式还是row模式
binlog_format=mixed
# 二进制日志过期清理时间,设置为7天。0表示不自动清理,不推荐这样做,因为会积累大量日志
expire_logs_days=7
# 跳过主从复制中遇到的指定类型的错误,避免从库复制中断
# 注意:过度使用该设置可能会导致数据不一致,应谨慎使用
slave_skip_errors=1062
# 配置中继日志
relay_log=mall-mysql-relay-bin
# 表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
# 将slave设置为只读(具有SUPER权限的用户除外)
read_only=1
修改完配置 重启mysql docker容器实例
docker restart mysql-slave
在主数据库中查看主从同步状态
进入主库
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
show master status;
返回宿主机
在从数据库配置主从复制 查看主从状态
docker exec -it mysql-slave /bin/bash
mysql -uroot -p
123456
在从数据库配置主从复制
change master to master_host="宿主机IP",master_user='replica',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=714,master_connect_retry=30 因为我这里是同一台ECS服务器 所以用下面这个
CHANGE MASTER TO
MASTER_HOST = '172.17.0.2',
MASTER_USER = 'replica',
MASTER_PASSWORD = '123456',
MASTER_PORT = 3306,
MASTER_LOG_FILE = 'mall-mysql-bin.000001',
MASTER_LOG_POS = 621,
MASTER_CONNECT_RETRY = 30;
在从数据库查看主从同步状态
show slave status \G; \G可加可不加 加了看的清楚点
在从数据库开启主从同步
start slave;
查看从数据库状态发现是否同步
show slave status \G;
如果不成功 用这个命令停掉 检查配置 STOP SLAVE;
测试 退出从库
进入主库
docker exec -it mysql-master /bin/bash
mysql -uroot -p123456
查看从库
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
总结:其实没必要配置外部端口 如果是单台服务器的话
注意mysql5.7中文乱码