lima 1.20 搭建 mysql8.4.7 主从 踩坑记

一、前提

主要思路: 两台机器—-两个正常启动的mysql—-配置my.cnf——配置sql

已经有一台 lima1.20 创建的 基础虚拟机 default ubuntu24-lts 已经安装配置好可用 纯apt install 安装

- mysql 8.4.53306
- redis 7.0: 3679
- rbitmq 4.0.5: 436956721567225672  
- 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

lima 1.20 搭建 mysql8.4.7 主从 踩坑记

反复配置出错的话 可以删除容器 新建数据库再配置
写得有些乱 见谅,有遇到问题,评论区找我,见到就会回复!
参考资料:博客:基于 Docker 的 MySQL 主从复制搭建及原理(真正弄懂)

本作品采用《CC 协议》,转载必须注明作者和本文链接
唯有坚持,滴水穿石----will
zhaocrazy
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
编程AI 出海 @ 数字游民
文章
83
粉丝
29
喜欢
68
收藏
152
排名:502
访问:1.7 万
私信
所有博文