Docker Desktop里搭建Mysql 9.4主从复制的保姆级教程
最近想自己开发一个小系统,而我的电脑里还没有安装任何的开发相关的配套软件和环境,所以想着方便以后开发的原则,就想从头到尾搭建一个mysql主从复制的数据库环境。一开始觉得这个搭建应该不难,网上有很多现成的资料而且有AI大模型的加持,所以理论上很快能搞定,可结果是我花了大概一天半的时间才算基本完成环境搭建,因此记录一下整个过程很有必要。
一、涉及软件及环境
序号
|
软件名称
|
版本号
|
1
|
Windows 11 家庭中文版
|
26100.4652
|
2
|
Docker Desktop
|
4.44.2 (202017)
|
3
|
MySql
|
9.4.0
|
4
|
DBeaver
|
25.1.0
|
二、Docker Desktop下载&安装






温馨提示:如果想跟我一样的话,请将latest替换成“9.4.0”
- 新建docker的挂载目录,我是在D:\Users\Docker
- 在Docker文件夹下新建挂载目录下按照如下说明创建目录,如下:

- 配置主数据库my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=sys
## 开启二进制日志功能
log-bin=mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
binlog_expire_logs_seconds = 604800 ##7天对应的秒数
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062 ##设置ssl证书
require_secure_transport=ON
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
- 配置从数据库my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=sys
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
binlog_expire_logs_seconds = 604800 ##7天对应的秒数
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay-log=mysql-relay-bin # 固定日志文件名前缀
relay-log-index=mysql-relay-bin.index
##relay-log-info-repository=TABLE # 8.0+推荐使用表存储
relay-log-recovery=ON # 崩溃后自动恢复
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
slave_net_timeout=60 # 网络超时时间(秒)
master_retry_count=86400 # 最大重试次数(24小时*3600秒)
##master_connect_retry=10 # 重试间隔(秒)
replica_parallel_workers=4 # 并行复制线程数 ##设置ssl证书
require_secure_transport=ON
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
- 新建一个共享的网络
docker network create mysql-replication
这个主要是为了主从复制的时候处于同一个网络中,便于网络访问
- 启动mysql 主库的 docker命令
docker run -p 3306:3306 --name mysql_master --network mysql-replication -v D:\\Users\\Docker\\Volumes\\mysql-master\\log:/var/log/mysql -v D:\\Users\\Docker\\Volumes\\mysql-master\\data:/var/lib/mysql -v D:\\Users\\Docker\\Volumes\\mysql-master\\conf\\my.cnf:/etc/my.cnf -v D:\\Users\\Docker\\Volumes\\shared\\ssl:/etc/mysql/ssl -e MYSQL_ROOT_PASSWORD=sasa989 -e MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL=true -d mysql:latest
- 在主库容器实例的终端重新生成有效证书(需进入MySQL容器)
- 首先,切换到mysql的SSL证书目录来存储证书和密钥文件。
cd /etc/mysql/ssl
- 然后,生成自签名的CA证书和私钥。
openssl genrsa -out ca-key.pem 4096 openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem
在此处,4096位的ca-key.pem使用OpenSSL生成了一个RSA私钥,并使用该密钥签署了一个自签名X.509证书,并保存为ca-cert.pem。在输入提供关于组织和公钥的一些基本信息后,将生成ca-cert.pem文件。
- 接下来,生成服务器证书和私钥。
openssl req -newkey rsa:4096 -days 3650 -nodes -keyout server-key.pem -out server-req.pem openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem -subj "/CN=mysql-master"
这里OpenSSL生成一个4096位的RSA私钥,并使用该密钥创建服务器证书签名请求server-req.pem。然后,服务器证书从签名请求生成,使用先前创建的CA证书ca-cert.pem和私钥ca-key.pem进行签名,使用序列号01,并保存为server-cert.pem。最后,如果不是按照本文提供的mysql配置挂载目录的方式还需要将证书和密钥文件复制到MySQL从服务器和客户端所在的目录上。
- 最后确保mysql有读取证书的权限,参见第10操作
- 启动mysql 从库的 docker命令
docker run -p 3307:3306 --name mysql_slave --network mysql-replication -v D:\\Users\\Docker\\Volumes\\mysql-slave\\log:/var/log/mysql -v D:\\Users\\Docker\\Volumes\\mysql-slave\\data:/var/lib/mysql -v D:\\Users\\Docker\\Volumes\\mysql-slave\\conf\\my.cnf:/etc/my.cnf -v D:\\Users\\Docker\\Volumes\\shared\\ssl:/etc/mysql/ssl -e MYSQL_ROOT_PASSWORD=sasa989 -e MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL=true -d mysql:latest
- 在主库容器实例内创建数据同步用户
- 在主库创建同步账户 Slave:
CREATE USER 'slave'@'%' IDENTIFIED BY 'abc@123';--密码自己设置
- 添加账户权限:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; FLUSH PRIVILEGES;
- 在主库容器实例内主数据库中查看主从同步状态
SHOW BINARY LOG STATUS;
- 在从库容器实例内从数据库中配置主从复制
- 进入容器终端,在Docker Desktop主窗口里,点击左侧的“Containers”,然后出现正在运行的容器实例,如下:

- 然后点击上图的箭头位置,在弹出的菜单里点击“Open in terminal”即可进入容器实例终端,如下

- 在容器终端里输入mysql的命令进入mysql命令执行终端,如下:
mysql -uroot -p
- 在终端里配置主从复制
STOP REPLICA; -- 停止现有复制
CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql_master', # 使用主库容器名
SOURCE_SSL=1,
SOURCE_SSL_CA='/etc/mysql/ssl/ca-cert.pem',
SOURCE_SSL_CERT='/etc/mysql/ssl/server-cert.pem',
SOURCE_SSL_KEY='/etc/mysql/ssl/server-key.pem',
SOURCE_LOG_FILE='mysql-bin.000006', # 主库SHOW BINARY LOG STATUS结果
SOURCE_LOG_POS=688;
START REPLICA USER='slave' PASSWORD='abc@123';
- 确保私钥文件权限正确
- 在主库和从库的终端执行如下命令,确保mysql有权限读取server-key.pem
chmod 600 /etc/mysql/ssl/server-key.pem chown mysql:mysql /etc/mysql/ssl/server-key.pem
- 测试主从复制
- 在DBeaver里,新建数据库连接

- 在DBeaver里,点击“驱动属性”,将红色的属性设置为“TRUE”

- 在DBeaver里,点击“SSL”,勾选使用SSL,并设置红框里的高级参数

- 点击确定之后就可以连接数据库。
- 在主数据库里新建数据库“product”(等一会再创建表,要不从数据库无法及时同步数据库创建会出现其它的错误)
CREATE DATABASE `product` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
[ERROR] [MY-010584] [Repl] Replica SQL for channel '': Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000005, end_log_pos 1867; Error 'Unknown database 'test'' on query. Default database: ''. Query: '/* ApplicationName=DBeaver 25.1.0 - Main */ CREATE TABLE test.t (id int PRIMARY key,name varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci', Error_code: MY-001049
2025-08-21T02:55:01.228876Z 17 [Warning] [MY-010584] [Repl] Replica SQL for channel '': ... The replica coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: MY-001756
- 连接从数据库,如果从数据库已经同步了主数据库product,则在主数据库客户端新建表order
CREATE TABLE `order` ( `id` int NOT NULL AUTO_INCREMENT, `product_id` int DEFAULT '0', `order_no` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
- 连接从数据库,如果从数据库已经同步了主数据库product里的表order,则在表order新建数据



四、总结
Error connecting to source 'slave@mysql_master:3306'. This was attempt 2/10, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
[Repl] Replica I/O for channel '': Error connecting to source 'slave@mysql_master:3306'. This was attempt 10/10, with a delay of 60 seconds between attempts. Message: SSL connection error: Unable to get private key, Error_code: MY-002026

Error connecting to source 'slave@mysql-master:3306'. This was attempt 7/10, with a delay of 60 seconds between attempts. Message: Unknown MySQL server host 'mysql-master' (-2)
-- 在从库容器内执行
STOP REPLICA; -- 停止现有复制
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='"mysql_master', # 使用主库容器名mysql_master
SOURCE_USER='slave',
SOURCE_PASSWORD='abc@123',
SOURCE_SSL=1,
SOURCE_SSL_CA='/etc/mysql/ssl/ca-cert.pem',
SOURCE_SSL_CERT='/etc/mysql/ssl/server-cert.pem',
SOURCE_SSL_KEY='/etc/mysql/ssl/server-key.pem',
SOURCE_LOG_FILE='binlog.000010', # 主库SHOW BINARY LOG STATUS结果
SOURCE_LOG_POS=462;
START REPLICA USER='slave' PASSWORD='abc@123';
Storing MySQL user name or password information in the connection metadata repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START REPLICA; see the 'START REPLICA Syntax' in the MySQL Manual for more information.
STOP REPLICA; -- 停止现有复制
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='mysql_master', # 使用主库容器名
SOURCE_SSL=1,
SOURCE_SSL_CA='/etc/mysql/ssl/ca-cert.pem',
SOURCE_SSL_CERT='/etc/mysql/ssl/server-cert.pem',
SOURCE_SSL_KEY='/etc/mysql/ssl/server-key.pem',
SOURCE_LOG_FILE='mysql-bin.000006', # 主库SHOW BINARY LOG STATUS结果
SOURCE_LOG_POS=688;
START REPLICA USER='slave' PASSWORD='abc@123';
Replica failed to initialize applier metadata structure from the repository
2025-08-21T02:24:12.162382Z 22 [System] [MY-014001] [Repl] Replica receiver thread for channel '': connected to source 'slave@mysql_master:3306' with server_uuid=d55239e3-7db5-11f0-8543-2e1613da1bf7, server_id=101. Starting replication from file 'binlog.000010', position '462'.
2025-08-21T02:24:12.163621Z 22 [ERROR] [MY-010557] [Repl] Error reading packet from server for channel '': Could not find first log file name in binary log index file (server_errno=1236)
2025-08-21T02:24:12.163662Z 22 [ERROR] [MY-013114] [Repl] Replica I/O for channel '': Got fatal error 1236 from source when reading data from binary log: 'Could not find first log file name in binary log index file', Error_code: MY-013114
STOP REPLICA; RESET REPLICA ALL; -- MySQL 8.0+专用语法
SHOW BINARY LOG STATUS;
STOP REPLICA; -- 停止现有复制
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='mysql_master', # 使用主库容器名
SOURCE_SSL=1,
SOURCE_SSL_CA='/etc/mysql/ssl/ca-cert.pem',
SOURCE_SSL_CERT='/etc/mysql/ssl/server-cert.pem',
SOURCE_SSL_KEY='/etc/mysql/ssl/server-key.pem',
SOURCE_LOG_FILE='mysql-bin.00000x', # 主库SHOW BINARY LOG STATUS新的结果
SOURCE_LOG_POS=xxx;# 主库SHOW BINARY LOG STATUS新的结果
START REPLICA USER='slave' PASSWORD='abc@123';
Docker Desktop里搭建Mysql 9.4主从复制的保姆级教程的更多相关文章
- 强大博客搭建全过程(1)-hexo博客搭建保姆级教程
1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- Docker 快速安装&搭建 Mysql 环境
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- docker 搭建 MYSQL并且完成主从复制
mysql主从复制逻辑: 1.从库执行start slave 开启主从复制. 2.从库请求连接到主库,并且指定binlog文件以及位置后发出请求. 3.主库收到从库请求后,将信息返回给从库,除了信息日 ...
- docker - 容器里安装mysql
在docker中安装mysql ubuntu官方镜像是精简的ubuntu系统,很多软件和库没有安装,所以直接安装mysql的话依赖较多,建议直接从源码编译安装mysql 通过命令行安装 先启动一个容器 ...
- Docker学习之搭建MySql容器服务
描述 MySQL 5.6 SQL数据库服务器Docker镜像,此容器映像包含用于OpenShift的MySQL 5.6 SQL数据库服务器和一般用法.用户可以选择RHEL和基于CentOS的图像.然后 ...
- 保姆级教程,带你认识大数据,从0到1搭建 Hadoop 集群
大数据简介,概念部分 概念部分,建议之前没有任何大数据相关知识的朋友阅读 大数据概论 什么是大数据 大数据(Big Data)是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需 ...
- 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话
导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...
- 保姆级教程:VsCode调试docker中的NodeJS程序
最近在写NodeJS相关的项目,运行在docker容器中,也是想研究一下断点调试,于是查阅相关资料,最终顺利配置好了. 首先我选择了VsCode作为ide,并用VsCode来做NodeJS可视化deb ...
- 1.4 Apache Hadoop完全分布式集群搭建-hadoop-最全最完整的保姆级的java大数据学习资料
目录 1.4 Apache Hadoop 完全分布式集群搭建 1.4.1 虚拟机环境准备 1.4.2 集群规划 1.4.3 安装Hadoop 1.4.3.1 集群配置 1.4.3.1.1 HDFS集群 ...
随机推荐
- sublime text 3 c++配置(编译+运行)
之前在网上找了很多配置教程都没成功,要么只能编译,要么只能运行编译好后的exe,没办法一键运行. 方法: 操作方式: 点击**工具,再选编译系统,再选新建编译系统** 然后,把下面的代码,全部复制,并 ...
- 图扑软件 | 带你体验 Low Poly 卡通三维世界
在三维场景搭建中,图扑软件提供了多样化的设计风格,以满足不同项目的视觉需求.无论是写实风格的细腻渲染.科幻未来的赛博质感,还是简约现代的几何美学,都能通过灵活的工具体系实现.而今天,我们将重点介绍一种 ...
- Django的Model类
1.model 用来和数据交互的(读取和传入数据) 2.orm Object Relational Mapping对象关系映射,python中的model对象和数据库中的表做映射 3.重要概念 3.1 ...
- 三种熔断策略在数据服务API中的实践应用
熔断策略的概念最早可以追溯到电力系统中的保险丝.当电流过大时,保险丝会自动熔断,以防止电器设备因过载而损坏.这种简单而有效的保护机制为后来软件系统中的熔断策略提供了灵感.在软件系统中,熔断策略的工作原 ...
- 商品中心—10.商品B端搜索系统的说明文档
大纲 1.商品B端搜索系统的运行流程 + 缓存和索引设计 2.商品B端搜索系统监听数据变更与写入ES索引 3.商品B端搜索系统的历史搜索词的实现 4.商品B端搜索系统的搜索词补全的实现 5.商品B端搜 ...
- 二、SDK编译
二.sdk编译 1.linux 1.1.一键编译 ./build.sh lunch # RK_ROOTFS_SYSTEM目前可设定三种系统:buildroot.debian. yocto export ...
- ES索引迁移优化:3倍速ReIndex + 零感知切换
在大模型驱动的时代,向量模型.索引抽取模型.文本切分模型(chunking)的迭代速度令人目不暇接,几乎每几个月就要升级一次.随之而来的,是Elasticsearch索引结构的频繁变更需求.然而,ES ...
- 《Building REST APIs with Flask》读后感
一. 为什么读这本书? 之所以选择这本书其实是因为最近自己在梳理 JWT 的用法.自己曾参与过的一个项目虽然使用的是 Flask 开发,但是授权使用的 PyJWT,当时以为使用 PyJWT 是行业通用 ...
- Map集合-主要HashMap和Hashtable
JAVA8除了给Map集合新增了方法remove(Object key,Object value)默认方法外 还增加了以下方法 Object replace(Object key,Object val ...
- cgal 安装
简介 INSTALL.md里面的文字 感觉cgal只需要头文件?? 似乎是的,因为我好像也没有安装它 安装可以参考这个连接,比较详细,windows 里面的安装 https://www.bilibil ...