环境描述:centos7 , docker v20.10.22 , docker-compose v1.25.1 , mysql5.7
主数据库:192.168.148.104:3311
从数据库:192.168.148.104:3312
从数据库:192.168.148.104:3313
编辑 docker-compose-mysql.yml 文件
version: '3.8'
services:
mysql-01:
container_name: mysql-01
image: mysql:5.7
# build:
# context: ./mysql
ports:
- "3311:3306"
volumes:
- /root/order/mysql1/conf:/etc/mysql/conf.d
- /root/order/mysql1/logs:/logs
- /root/order/mysql1/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_ROOT_PASSWORD: 123456
mysql-02:
container_name: mysql-02
image: mysql:5.7
# build:
# context: ./mysql
ports:
- "3312:3306"
volumes:
- /root/order/mysql2/conf:/etc/mysql/conf.d
- /root/order/mysql2/logs:/logs
- /root/order/mysql2/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_ROOT_PASSWORD: 123456
mysql-03:
container_name: mysql-03
image: mysql:5.7
# build:
# context: ./mysql
ports:
- "3313:3306"
volumes:
- /root/order/mysql3/conf:/etc/mysql/conf.d
- /root/order/mysql3/logs:/logs
- /root/order/mysql3/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_ROOT_PASSWORD: 123456
我们先去创建三个数据库需要映射挂载的目录
路径大家可以自己改
mkdir -p /root/order/{mysql1,mysql2,mysql3}/{conf,logs,data}
编写MySQL配置文件
主MySQL配置 MySQL1( vim /root/order/mysql1/conf/my.cnf )
[ mysql ]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server_id=888800001 #指定集群id
log-bin=mysql-bin #打开二进制日志功能
read-only=0 #关闭只读,可读可写
# binlog-do-db=test_db #指定要复制那一个
# binlog-do-db=bigdata #指定不复制哪一个
从MySQL配置文件 MySQL2 ( vim /root/order/mysql2/conf/my.cnf )
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server_id=888800002 #注意此处id不能与主节点相同
log-bin=mysql-bin
read-only=1 #只读
# binlog-do-db=admin #需要复制的
# replicate-ignore-db=mysql #不需要复制的
从MySQL配置文件 MySQL3 ( vim /root/order/mysql3/conf/my.cnf )
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server_id=888800003 #注意此处id不能与主节点相同
log-bin=mysql-bin
read-only=1 #只读
# binlog-do-db=admin #需要复制的
# replicate-ignore-db=mysql #不需要复制的
准备好这些以后,我们就运行 docker-compose-mysql.yml (我这里是在idea 直接运行 ,也可以放到服务器运行)

启动以后主服务器操作
登录主服务器数据库 运行下面几条sql 语句
-- 创建slave用户
CREATE USER 'guanxi_slave'@'%';
-- 设置密码
ALTER USER 'guanxi_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'guanxi_slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
查看主节点状态: (最后这条语句不能在Navicat 或者其他数据库可视化工具运行 他们不支持那个G参数传递 我们直接xshell上面运行)
-- 查看状态(不需要分号)
show master status\G

从服务器操作(登录数据库操作)
change master to master_host='192.168.148.104',master_user='guanxi_slave',master_password='123456',master_port=3311,master_log_file='mysql-bin.000001',master_log_pos=154;
上面语句参数说明:
MASTER_HOST:主库ip,
MASTER_USER:上面主库配置从服务器登录的用户密码时配置的用户名
MASTER_PASSWORD: 上面主库配置从服务器登录的用户密码时配置的用户密码
MASTER_LOG_FILE:主库的数据库日志文件, 参考上面show master statusG; 得出的File 字段的值,
MASTER_LOG_POS:参考上面show master statusG; 得出的Position 字段的值
开启主从复制并查看状态:
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

我们看到 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 这样子就成功了
从服务器3 也是一样操作
配好以后创建几个库表试试看
扩展
-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
stop slave;
-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;
-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;
-- 解决数据不一致的时候进行操作的 报错的问题
stop slave;set global sql_slave_skip_counter=1; start slave;


0 条评论