lima 1.20 搭建 mysql8.4.7 主从 踩坑记
一、前提
主要思路: 两台机器—-两个正常启动的mysql—-配置my.cnf——配置sql
已经有一台 lima1.20 创建的 基础虚拟机 default ubuntu24-lts 已经安装配置好可用 纯apt install 安装
- mysql 8.4.5:3306
- redis 7.0: 3679
- rbitmq 4.0.5: 4369、5672、15672、25672
- Nginx 1.26: 80
默认开机即启动以上软件 前期思路复制多一台机器 就有两个数据库可以配置主从了
二、创建第二台虚拟机 dev-1 并关闭开机启动项
limactl clone default dev-1
limactl shell dev-1
sudo su # 切换root 用户
# 还有 start. restart. status enable 替换disalble 即可
#或者这个 service redis-server status 少打几个字
sudo systemctl disable nginx.service #关闭开机自启动
sudo systemctl disable redis-server.service
sudo systemctl disable mysql.service
sudo systemctl disable rabbitmq-server.service
lima 默认绑定的是本地ip 127.0.0.1 端口区分,所以软件mysql 等打算用端口来区分了(后话狗头,搞完 才焕然大悟 都127.0.0.1 只能找自己机器 怎么能找到另一台呢)
三、修改mysql 端口 修改mysql主从配置
whereis msyql
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql.service
#主库
SHOW BINARY LOGS #查看二进制文件
SHOW BINARY LOG STATUS #查看二进制文件坐标 状态 这个记录查询 应该最先查询更好
server-id = 1 read-only = 0
CREATE USER 'dataer'@'%' IDENTIFIED BY '1234'; # 可以不带 WITH caching_sha2_password
GRANT REPLICATION SLAVE ON *.* TO 'dataer'@'%';# 授权
FLUSH PRIVILEGES; # 刷新
#从库
port = 33061
server-id = 2
read-only = 1
change replication source to
source_host="172.17.0.2",
source_port=3306,
source_user="dataer",
source_password="1234",
source_log_file="mysql-bin.000004",
source_log_pos=158,
GET_SOURCE_PUBLIC_KEY=1; #这个加上 不然可能无法同步 由于mysql8.4.6 caching_sha2_password 需要 SSL 进行通信。并且不支持mysql_native_password 找不到这个扩展(docker 和 ubuntu apt 两者都安装都没有找到)
start replica; #启动同步
stop replica;
show replica status; # 查看同步效果 命令行可以加上\G 格式化打印
四 、测试主从同步
新建一个数据库,或者创建一个表 或插入数据,发现数据并不会同步,而且发现 主从数据库两个无法连接
dataer 用户无法连接 原因一个大坑:lima 默认创建的虚拟机绑定的ip 都是127.0.0.1,用端口是无法区分的 如果想用绑定这类IP 192.168.105.2 的虚拟机 推荐vm fusion 个人已经可免费使用
主从两个机器 不同多端口 只会去连接本地服务 找不到对方的服务 尝试了下VMNet networks 配置相当麻烦 最终放弃
为此 我还是在同一台机器 用docker 来 创建主从数据配置测试
五、补充:如果内地虚拟机 不是绑定本地ip 以下可以忽略。以上就可以配置好!
创建一个基于docker的虚拟机
limactl create --name=docker-mysql template://docker --disk=60
docker pull mysql:8.4.6 # 基于Oracle Linux 9 以后测试可以选ubuntu、centos为基础的镜像 更通用
# -e MYSQL_ROOT_PASSWORD=1234 密码一定要设置 否则无法启动
# docker ps -a
# dosker logs mysql-master
docker run -p 33061:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=1234 -d mysql:8.4.6
docker run -p 33062:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=1234 -d mysql:8.4.6
# docker exec -it mysql-master /bin/bash
#坑来了Oracle Linux 9 dnf yum apt 命令都失效了 无法安装vim
###继续配置my.conf
docker cp mysql-master:/etc/my.cnf ./docker-mysql-data/mysql-master/ #从容器复制出来改
cd /Users/xiao1024/docker-mysql-data/mysql-master
docker cp ./my.cnf mysql-master:/etc/my.cnf #从容器复制出来改 复制进去覆盖
### my.cnf 从库同上 配置好my.conf 都要重启
docker restart mysql-master mysql-slave
六、最后 sql 配置 最后的最后 成功了
my.cnf 的一些配置参数解释 可以选择配置 不配置。会有默认设置
server-id 、read_only 是必须
| 参数 | 值 | 说明 | 主从差异 |
|---|---|---|---|
server-id |
2 |
必须与主库不同(主库通常设为1) | 主从必须不同 |
log_bin |
mysql-bin |
从库也需开启binlog,用于级联复制或备份 | 与主库相同 |
relay_log |
mysql-relay-bin |
中继日志文件名,存储从主库接收的binlog事件 | 仅从库需要 |
read_only |
ON |
禁止普通用户写操作(root用户仍可写) | 从库专用 |
super_read_only |
ON |
禁止所有用户(包括root)写操作,增强保护 | 从库专用 |
gtid_mode |
ON |
启用全局事务ID,简化复制故障恢复 | ★★★★★ |
enforce_gtid_consistency |
ON |
禁止非事务性操作破坏复制一致性 | ★★★★★ |
binlog_row_image |
FULL |
记录完整的行数据(修改前+修改后),确保数据一致性,但占用更多空间 | 主库在用 |
sync_binlog |
1 |
每次事务提交都同步binlog到磁盘,保证数据安全但性能略有下降 | 主库在用| |
跳过以下错误(生产环境慎用):
replica_skip_errors = 1062,1146,1032
- 1062:主键冲突(
Duplicate entry) - 1146:表不存在(
Table doesn't exist) - 1032:行不存在(
Can't find record)

反复配置出错的话 可以删除容器 新建数据库再配置
写得有些乱 见谅,有遇到问题,评论区找我,见到就会回复!
参考资料:博客:基于 Docker 的 MySQL 主从复制搭建及原理(真正弄懂)
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: