使用docker配置MySQL8主从复制包含数据卷
使用docker配置MySQL8主从复制包含数据卷(参考B站尚硅谷教程)
-
docker安装完成后。
-
运行一个MySQL8主数据库(宿主机)
## -v /file1/mysql_master/log:/var/log/mysql :将日志映射到宿主机 ## -v /file1/mysql_master/data:/var/lib/mysql:将主要数据映射 ## -v /file1/mysql_master/conf:/etc/mysql/conf.d:将配置文件映射 ## -e MYSQL_ROOT_PASSWORD=password:配置MySQL的密码 ## -d mysql:latest:拉取最新的版本MySQL8 -p端口映射,宿主机端口:容器内数据库端口(注意防火墙要开启这些宿主机端口)端口自行选择未被占用端口 ## docker run 命令会自动拉取镜像 ,--name 为主容器起个别名
docker run -p 3307:3306 --name mysql_master --privileged=true -v /file1/mysql_master/log:/var/log/mysql -v /file1/mysql_master/data:/var/lib/mysql -v /file1/mysql_master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=password -d mysql:latest
-
配置主数据库的my.cnf配置文件,在/宿主机path/mysql/conf,就是上面一条命令中映射的/file1/mysql_master/conf(如需其他配置自行添加)(宿主机)
[client] ##设置MySQL客户端默认字符集(有这个可能使用mysqlbinlog会报字符集错误,可以删除,然后重启容器) default-character-set=UTF8MB4 [mysqld] ##设置server_id,同一局域网需要唯一 server_id=101 ##服务端字符集默认是latin1.修改 character-set-server=UTF8MB4 ##指定不需要同步的数据库名 binlog-ignore-db=mysql ##开启二进制日志功能(这是二进制log文件前缀,名字任意) log-bin=mall-mysql-bin ##开启二进制日志使用内存大小(事务) binlog_cache_size=1M ##设置使用二进制日志格式(mixed,statement,row) binlog-format=mixed ##二进制日志过期清理时间,默认为0,表示不自动清理 expire_logs_days=7 ##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断 ##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
-
重启主容器(宿主机)
##查看容器信息 docker ps ##会有这么一条d8eb9356865d mysql:latest "docker-entrypoint.s…" 54 minutes ago Up 50 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_master ## 重启容器,因为起了别名所以可以用别名重启 docker restart mysql_master
-
进入主容器(主数据库)(宿主机)
## 进入master容器(这里就将从宿主机进入主容器) docker exec -it mysql_master bash ##进入主数据库(这里进入主容器的MySQL数据库) mysql -u root -ppassword
-
在主数据库中(master容器)创建数据同步用户(用户名slave)(主容器的数据库中)
## 一定要有这条 mysql_native_password。mysql8.0 引入了新特性 caching_sha2_password;这种密码加密方式客户端不支持;客户端支持的是mysql_native_password 这种加密方式;还有就是'slave'@'%'这种方式是让所有地址均可访问,实际上这样不安全,最好设置特定的IP地址。 CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; ## 授权 grant replication slave,replication client on *.* to 'slave'@'%';
-
新建从容器(数据库)(宿主机)
##和主配置基本一样。别名不能一样。端口自行选择未被占用端口 docker run -p 3308:3306 --name mysql_slave --privileged=true -v /file1/mysql_slave/log:/var/log/mysql -v /file1/mysql_slave/data:/var/lib/mysql -v /file1/mysql_slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=password -d mysql:latest
-
配置从数据库的my.cnf(在上一步创建的数据卷映射位置/file1/mysql_slave/conf)(宿主机)
[client] ##设置MySQL客户端默认字符集 default-character-set=UTF8MB4 [mysqld] ##设置server_id,同一局域网需要唯一 server_id=102 ##服务端字符集默认是latin1.修改 character-set-server=UTF8MB4##指定不需要同步的数据库名 binlog-ignore-db=mysql ##开启二进制日志功能,以备slave作为其他数据库实例的master时使用 log-bin=mall-mysql-slave1-bin ##开启二进制日志使用内存大小(事务) binlog_cache_size=1M ##设置使用二进制日志格式(mixed,statement,row) binlog-format=mixed ##二进制日志过期清理时间,默认为0,表示不自动清理 expire_logs_days=7 ##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断 ##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ##relay_log配置中继日志 relay_log=mall-mysql-relay_bin ##log_slave_updates表示允许备库将其重放的事件也写进自己的二进制日志,好处是可以再从这个备库拓扑更多的备库。 log_slave_updates=1 ##设置slave为只读,只有super权限的用户除外 read_only=1
-
重启从容器(宿主机)
## 在宿主机使用别名重启从容器 docker restart mysql_slave
-
在主数据库中查看主从同步状态(里面的数据是下一步的基础)(主容器的数据库)
## 显示同步状态 show master status \G; ##会显示 *************************** 1. row *************************** # File: mall-mysql-bin.000004 # Position: 947 # Binlog_Do_DB: # Binlog_Ignore_DB: mysql #Executed_Gtid_Set: #1 row in set (0.01 sec) #ERROR: #No query specified ##这个数据File: mall-mysql-bin.000004和Position: 947是配置下一步的数据源,根据这条Binlog_ignore_DB:mysql 也可以看出my.cnf 是否起作用。
-
进入从容器数据库slave(宿主机)
## 进入slave容器(这里开始进入从容器) docker exec -it mysql_slave bash ##进入从数据库(这里进入从容器的数据库) mysql -u root -ppassword
-
在从数据库中配置主从复制(从容器的数据库)
#master_host:主数据库IP地址(宿主机) #master_port:主数据库端口 #master_user:在主数据库中创建的从数据库用于同步的用户名:CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'MYSQL@1'; #master_password:在主数据库中创建的从数据库用于同步的密码:CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'MYSQL@1'; #master_log_file:指定要从数据库要复制的数据库日志文件,通过查看主数据库的状态(show master status;),获取File参数 #master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据库的状态(show master status;),获取Position参数 #master_connect_retry:连接失败隔多少秒重试 change master to master_host='192.168.31.25', master_user='slave', master_password='password',master_port=3307, master_log_file='上步的参数', master_log_pos=上步的参数,master_connect_retry=30;
-
在从数据库中开启主从同步(从容器的数据库)
start slave;
-
在从数据库中查看主从状态(从容器数据库)
##\G:以键值对的形式看结果,(默认Slave_IO_Running: No Slave_SQL_Running: No)都是No状态 ##如果Slave_IO_Running和Slave_SQL_Running都为yes就可以了
##如果创建从用户的时候没有IDENTIFIED WITH mysql_native_password可能会这样Slave_IO_Running: Connecting
show slave status \G; -
基本可以简单使用了
##安装的时候可以多开几个客户端,方便操作
##主数据库的访问地址是 宿主机IP:3307 (注意端口是否开放)
##从数据库的访问地址是 宿主机IP:3308 ##read_only 参数默认不开启,开启后会阻止没有 super 权限的用户执行数据库变更操作 ##配置完成后容器重启也可使用 ##使用show variables like 'server_id'; 命令查看主从数据库的server_id 是否都一样,一样不行。如果不一样说明配置文件my.cnf没有生效。 ##出现问题要重新运行镜像的时候要清空/file1/mysql_slave/data和/file1/mysql_master/data两个文件夹下面的全部数据,否则重新运行的镜像还会保存之前的表结构等配置。 ##如果不删除这两个文件夹,可以保证再次运行的容器数据库的数据永久保存,但是数据库版本需一致。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)