docker-compose.yml实现Mysql一主多从及一些报错问题解决

1.1、引入docker-compose.yml。linux下自己随便找个位置创建

version: '3'
services:
  masterMysql:
    image: 717160040/mysql5.5
    container_name: masterMysql
    tty: true
    restart: always
    ports:
      - "3307:3306"
    volumes:
      - /data/docker/dockerdata/mysqlWork/master/data:/var/lib/mysql ##注意这个/data/docker/dockerdata/mysqlWork/master/data宿主机目录要自己创建
      - /data/docker/dockerdata/mysqlWork/master/etc/my.cnf:/etc/my.cnf ##注意这个/data/docker/dockerdata/mysqlWork/master/etc/my.cnf宿主机目录要自己创建
      - /etc/localtime:/etc/localtime
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MASTER_SYNC_USER=masteradmin #设置脚本中定义的用于同步的账号
      - MASTER_SYNC_PASSWORD=123456 #设置脚本中定义的用于同步的密码
      - ADMIN_USER=root #当前容器用于拥有创建账号功能的数据库账号
      - ADMIN_PASSWORD=123456
      - TZ=Asia/Shanghai #解决时区问题
  slaveMysql:
    image: 717160040/mysql5.5
    container_name: slaveMysql
    tty: true
    restart: always
    ports:
      - "3308:3306"
    volumes:
      - /data/docker/dockerdata/mysqlWork/slave/data:/var/lib/mysql
      - /data/docker/dockerdata/mysqlWork/slave/etc/my.cnf:/etc/my.cnf
      - /etc/localtime:/etc/localtime
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MASTER_SYNC_USER=masteradmin #设置脚本中定义的用于同步的账号
      - MASTER_SYNC_PASSWORD=123456 #设置脚本中定义的用于同步的密码
      - ADMIN_USER=root #当前容器用于拥有创建账号功能的数据库账号
      - ADMIN_PASSWORD=123456
      - TZ=Asia/Shanghai #解决时区问题

2.2、然后创建宿主机目录

注意:对应yml的

volumes: 

        - /data/docker/dockerdata/mysqlWork/master/data:

 

 Master的etc下的my.cnf

一定要注意service_id 不能重复

要注意这个service_id不能重复。

bin_log开启二进制日志

[mysqld]
server_id =  112

# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db    =   mysql
# 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin             =   mysql-bin
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size   =   1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format       =   mixed
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days    =   7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors   =   1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates   =   ON
user=mysql
 

Slave目录跟Master一样只是父目录不一样

Slave的etc下的my.cnf

一定要注意service_id 不能重复

[mysqld]
server_id   = 113

binlog-ignore-db    =   mysql
log-bin             =   mysql-slave1-bin
binlog_cache_size   =   1M
binlog_format       =   mixed
expire_logs_days    =   7
slave_skip_errors   =   1062
relay_log           =   mysql-relay-bin
log_slave_updates   =   ON
read_only           =   1
user=mysql

2.3 运行docker-compose.yml文件,这里需要进入你放docker-compose.yml文件的目录运行

运行docker-mysql.yml

命令: docker-compose -f xxx.yml up -d

xxx:你的yml名字

-d:后台运行,不加会有详细日志。看自己加不加

docker ps -a 查看运行的容器

注意这个healthy:健康,启动成功

俩个mysql启动完成一个3307端口一个3308端口


 

 进入docker的mysql容器:docker exec -it xxx  /bin/bash

xxx:可以是的容器名字或者容器Id

登录mysql服务

 

 服务启动完毕后,创建用于同步的用户并授权

创建的用户名称为slave密码为123456

 CREATE USER 'slave' @'%' IDENTIFIED BY '123456'; 

# 设置远程链接的密码和用户方便后面用于可视化工具连接

grant all on *.* to root@'%' identified by '123456' with grant option;

#刷新权限:FLUSH PRIVILEGES;

 查看master状态:show master status;

这俩个后面从库需要用到。

最后退出

-u:用户名;-p:密码 

 切换到Slave数据库

连接slave并关联master节点

CHANGE MASTER TO
MASTER_HOST='masterMysql',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=682;
  • MASTER_HOST:直接使用container_name
  • MASTER_LOG_FILE/MASTER_LOG_POS:直接使用安装master上面圈的俩个对应MASTER_LOG_FILE:File下面的mysql-bin.000004 你的File下面是多少就写多少;      MASTER_LOG_POS : position下面对应的682你的position下面是多少就写多少;

 管理完成后 启动salve

start slave;

 最后查看Slave状态

show slave status\G

注意:可能会报错 

1、mysqld: File './mysql-bin.index' not found (Errcode: 13) 我也不知道为什么会报这样的错误,我看网上的docke-compose.yml运行多个mysql服务都是直接运行起来了我看了好多博客,没报这样的错误。

我是 用下面的命令解决的

chown -R mysql:mysql   /data/docker/dockerdata/mysqlWork/master/

chown -R mysql:mysql   /data/docker/dockerdata/mysqlWork/slave/

赋予mysql目录权限解决的

2、权限问题

Master command COM_REGISTER_SLAVE failed: Access denied for user 'slave'@'%'(using password: YES) (Errno: 1045)

回到master修改权限

show grants for 'slave'@'%';

查你创建的用户权限


这个是不对的!!!

下面这个是对的

 用这个命令修改

mysql> GRANT REPLICATION SLAVE ON *.* TO  '你创建的用户名'@'%' identified by '自己用户的密码';
mysql> show grants for '你创建的用户名'@'%';
+----------------------------------------------+
| Grants for repl@%                            |
+----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' |
+----------------------------------------------+

 

 

一定要注意service_id 不能重复

这是我第一次使用docker-compose.yml部署主从mysql。欢迎指出问题,又不懂得地方可以留言。谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值