docker-compose 安装多个mysql并配置主从复制
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | version: '3' services: mysql-1: restart: always image: mysql:5.7.28 container_name: mysql-1 volumes: # 数据库存储,根据实际情况替换 - /alidata/mysql-1/data:/ var /lib/mysql:rw # 数据库配置目录,初始安装注释配置文件目录映射 #- /alidata/mysql-1/conf/mysql.conf.d:/etc/mysql/mysql.conf.d:rw # 数据库还原目录 可将需要还原的sql文件放在这里 - /alidata/mysql-1/source:/docker-entrypoint-initdb.d environment: # 数据库密码,根据实际情况替换 - "MYSQL_ROOT_PASSWORD=123456" - "TZ=Asia/Shanghai" # network_mode: "host" # 映射端口,根据实际情况替换 ports: - 23306:3306 mysql-2: restart: always image: mysql:5.7.28 container_name: mysql-2 volumes: # 数据库存储,根据实际情况替换 - /alidata/mysql-2/data:/ var /lib/mysql:rw # 数据库配置目录,初始安装注释配置文件目录映射 # - /alidata/mysql-2/conf/mysql.conf.d:/etc/mysql/mysql.conf.d:rw # 数据库还原目录 可将需要还原的sql文件放在这里 - /alidata/mysql-2/source:/docker-entrypoint-initdb.d environment: # 数据库密码,根据实际情况替换 - "MYSQL_ROOT_PASSWORD=123456" - "TZ=Asia/Shanghai" # network_mode: "host" # 映射端口,根据实际情况替换 ports: - 23307:3306 |
1 | 初始安装注释配置目录的映射, |
1 | docker-compose -p mysql up -d |
拷贝mysql容器中的配置文件到主机目录中
1 2 | docker cp mysql-1:/etc/mysql/mysql.conf.d /alidata/mysql-1/conf docker cp mysql-2:/etc/mysql/mysql.conf.d /alidata/mysql-2/conf |
修改主机目录的配置文件,映射主机目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | version: '3' services: mysql-1: restart: always image: mysql:5.7.28 container_name: mysql-1 volumes: # 数据库存储,根据实际情况替换 - /alidata/mysql-1/data:/ var /lib/mysql:rw # 修改配置文件后,初配置文件目录映射 - /alidata/mysql-1/conf/mysql.conf.d:/etc/mysql/mysql.conf.d:rw # 数据库还原目录 可将需要还原的sql文件放在这里 - /alidata/mysql-1/source:/docker-entrypoint-initdb.d environment: # 数据库密码,根据实际情况替换 - "MYSQL_ROOT_PASSWORD=123456" - "TZ=Asia/Shanghai" # network_mode: "host" # 映射端口,根据实际情况替换 ports: - 23306:3306 mysql-2: restart: always image: mysql:5.7.28 container_name: mysql-2 volumes: # 数据库存储,根据实际情况替换 - /alidata/mysql-2/data:/ var /lib/mysql:rw # 修改配置文件后,初配置文件目录映射 - /alidata/mysql-2/conf/mysql.conf.d:/etc/mysql/mysql.conf.d:rw # 数据库还原目录 可将需要还原的sql文件放在这里 - /alidata/mysql-2/source:/docker-entrypoint-initdb.d environment: # 数据库密码,根据实际情况替换 - "MYSQL_ROOT_PASSWORD=123456" - "TZ=Asia/Shanghai" # network_mode: "host" # 映射端口,根据实际情况替换 ports: - 23307:3306 |
重新创建容器
1 2 | docker-compose down docker-compose -p mysql up -d |
修改主数据库配置(mysql-1:mysqld.cnf):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [mysqld] pid-file = / var /run/mysqld/mysqld.pid socket = / var /run/mysqld/mysqld.sock datadir = / var /lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # 主从复制配置如下 #主服务器唯一Id[必填] server-id=1 #启用二进制日志[必填] log-bin=/ var /lib/mysql/mysqlbin #主机,读写都可以 read-only=0 #设置不要复制的数据库[可选] #binlog-ignore-db=mysql #设置需要复制的数据库[可选](输数据库名字) binlog- do -db=hlyun_v5_iam binlog- do -db=hlyun_v5_crm |
修改从数据库配置(mysql-2:mysqld.cnf):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [mysqld] pid-file = / var /run/mysqld/mysqld.pid socket = / var /run/mysqld/mysqld.sock datadir = / var /lib/mysql log-error = / var /log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION #主从复制配置 #从服务器唯一Id server-id=2 #启用二进制日志 log-bin=/ var /lib/mysql/mysqlbin #只读,对拥有super权限的账号是不生效的 read_only = 1 |
重启数据库:
1 | docker-compose restart |
查看主数据库(mysql-1):
1 | show master status; |
其他命令:
1 2 | reset master show master status; |
创建其他用户
1 2 3 | CREATE USER 'slave' IDENTIFIED BY '123456' ; grant replication slave on *.* to 'slave' @ '192.168.1.130' identified by '123456' ; flush privileges; |
配置从数据库
1 2 3 4 5 | change master to master_host= '192.168.1.130' , master_user= 'root' , master_password= '123456' , master_log_file= 'mysqlbin.000001' , master_log_pos=154; |
启动复制服务
1 | start slave |
其他命令:
1 2 3 | STOP SLAVE reset slave show slave status |
进入从库:
1 | docker exec -it mysql-2 /bin/bash |
进入数据库
1 | mysql -uroot -p123456 |
查看状态
1 | show slave status\G |
注意:需要手动创建初始数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)