基于Docker实现mysql主从配置
版本
mysql - latest(8.0)感谢
感谢B站狂神说java这个IP上上传的视频资源
Docker搭建MySQL8主从复制 (全网最详细版)_bright的博客-CSDN博客
ShardingShpere数据库中间件- 专栏 -KuangStudy
@@GLOBAL.GTID_MODE = OFF 问题_wangxuelei036的博客-CSDN博客
docker安装配置mysql
安装mysql
docker pull mysql:latest选择你自己需要安装的mysql版本,这这里选择的是最新的(latest),对应 8.0,版本这里包含了一个连接的坑,我下文会讲!
如果你不是使用Docker进行安装,而是直接在linux下安装mysql,我推荐教程 - (02~03)
该博客是KaungStudy飞哥提供的文档。
mysql 是否安装成功?
# 查看安装成功的镜像
docker images
存在mysql红框内容就表示安装成功!
mysql 启动
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:latestrun : 启动
-p 3306:3306 : 指定映射端口, -p 外部端口:内部端口(容器内部)
--name mysql-master :给容器起别名,起个名称方便以后称呼(我用的主-mysql是mymysql)
-e MYSQL_ROOT_PASSWORD=12345678 : 设置root用户的密码
-d : 后台运行
mysql:latest : mysql:tag,tag就是你选择的msyql版本号
查看mysql容器是否启动成功?
mysql启动成功后,会打印出当前运行容器的id或者你自己查看容器状态!
docker ps
这样的就表示启动成功了。
msyql配置主从数据库
mysql共同配置
先进入 mysql容器内部,这里我的主mysql叫mymysql,命令如下:
docker exec -it mymysql /bin/bash
可以看到下一行的root@已经不一样了,并且该id就是你当前进入的容器的容器id,
查看容器内部配置文件所在,我已经把my.cnf所在截图了,如下图:

/etc/mysql/my.cnf (这个有用!)
OK,我感觉我是不是废话太多了,那我们下面就加快进度吧!
拿到路径之后,我们先进入my.cnf。

好吧,容器内部没装vim,你可以自己去安装。
apt-get update
apt-get install vim我就没有这么去安装了我直接用了docker cp
使用 docker cp 配置 my.cnf
将my.cnf 从容器复制到主机上。
shelldocker cp 容器id(或容器名称):/etc/mysql/my.cnf /docker/mysql/master(或slavel1)/my.cnf将容器id或名称为XXX的容器在 /etc/mysql/my.cnf 复制给主机路径下的/docker/mysql/master/my.cnf文件。
修改my.cnf(添加对应的主从配置)。
shell# 主节点如下: [mysqld] ## 同一局域网内注意要唯一 server-id=100 ## 开启二进制日志功能,可以随便取(关键) log-bin=master-bin binlog-format=ROW // 二级制日志格式,有三种 row,statement,mixed binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库shell# 从节点如下: [mysqld] # 设置server_id,注意要唯一 server-id=201 # 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin # relay_log配置中继日志 relay_log=mysql-relay-bin # 设置为只读,该项如果不设置,表示slave可读可写 read_only=1注意每个主从节点的server-id都要唯一!!!
将修改后的my.cnf复制回容器中。
shelldocker cp /docker/mysql/master(或slavel1)/my.cnf 容器id(或容器名称):/etc/mysql/my.cnf就是和步骤1的指令路径反一下。
重启服务
shelldocker restart 容器名称/容器id
master(主)配置
经过共同配置之后呢,我们先进入主-mysql中,查看对应配置从节点需要的信息。
进入mysql内部
# 进入容器内部
docker exec -it 容器id/容器名称 /bin/bash
# 进入mysql
mysql -uroot -p密码
登录成功
查看master服务的binlog文件名和位置(master节点执行)
show master status;
OK,接下来配置从节点。
slave(从)配置
它一开始的步骤和主的一样,都是共同配置,唯一不一样的是修改 my.cnf不一样,请注意!
这里的内容已经在共同配置里面写了。
进入mysql内部
# 进入容器内部
docker exec -it 容器id/容器名称 /bin/bash
# 进入mysql
mysql -uroot -p密码
登录成功。
执行 change master to
change master to master_user='root',master_password='mysql8.0',master_host='192.168.168.101',master_port=3306,get_master_public_key=1, master_log_file='master-bin.000004', master_log_pos=1097, master_connect_retry=30;master_host :Master库的地址。
master_port:Master的端口号,指的是容器的端口号。
master_user:用于数据同步的用户。
master_password:用于同步的用户的密码。
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值。
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值。
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
get_master_public_key=1: 解决 Authentication plugin 'caching_sha2_password' reported error:Authentication require secure connection 问题导致的密码插件问题 - msyql8.0才出现的问题。
注意: 当前字段中说的文中指的是 在锚点 - 查看master服务的binlog文件名和位置(master节点执行)那里查询出来的主节点信息。
启动slave
start slave;查看是否配置成功?
show slave status \G\G : 表示换行。

两个 YES 就成功了!
配置从节点时,出现的各种问题?
飞哥这里已经例举了一大部分,我就不一一讲了,放置传送门: https://www.kuangstudy.com/zl/sharding#1369645557613608962
我讲一下我的主机配置时出现的问题?
1. Authentication plugin 'caching_sha2_password' reported error:Authentication require secure connection 问题导致的密码插件问题 - msyql8.0才出现的问题。
从配置锚点 - 执行 change master to里已经加上了该解决的配置了,看 get_master_public_key=1,从博客中得到的解决方法(在评论那块)。
2. No query specified
show slave status\G;
多了个分号(;)。
3. The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
因为我的从节点连接主节点配置那里的ip地址配置错了。
4. Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS can
由于之前用的master_auto_position=1,现在改回0,重新用pos方法change就可以了。
# 停止slave
stop slave;
# 清楚配置
reset slave;
change master to master_auto_position=0;
change master to master_user='root',master_password='mysql8.0',master_host='192.168.168.101',master_port=3306,get_master_public_key=1, master_log_file='master-bin.000004', master_log_pos=1097, master_connect_retry=30;
# 启动slave
start slave;使用 root用户 造成从(slavel-mysql)服务器可以操作数据(crud)?
影响: 一不小心就可能造成主从数据不一致!
mysql从库不能写吗_mysql的主从复制,从库设为只读不能写_L NEO的博客-CSDN博客
我建议给从库分配一个普通用户账号并仅分配对应权限!
# 例如以下,创建一个名称为 'username' 密码为 'password' 且任何ip都可以连接的账号
create user 'username'@'%' identified by 'password';
# 分配权限,例如我只给他 SELECT 权限
grant select on *.* to 'username'@'%';
# 需要刷新
flush privileges;
# 查看效果
show grants for 'username'@'%';
然后你就可以自己去测试了,如果先看账号创建成功了吗?
# 查询 mysql 库下的用户表信息
select host,user from mysql.user;
权限分配成功后,我这边使用navicat对'username'账号进行登录,并(修改、新增、删除)数据,出现下图错误信息!

