基于 Docker 部署 Mysql8.0.27_单机_主从复制

news2024/12/28 20:16:20

文章目录

      • 单机部署
      • 集群部署
        • master 部署
        • slave 部署
        • 错误记录

单机部署

  1. 通过 dockerhub 或 docker search 查找镜像。
  2. 拉取 mysql 镜像。
docker pull mysql:8.0.27
  1. 创建挂载目录,并赋予权限。
mkdir -p /var/docker_data/mysql/data
mkdir -p /var/docker_data/mysql/conf
mkdir -p /var/docker_data/mysql/log
mkdir -p  /var/docker_data/mysql/mysql-files

chmod -R 770 /var/docker_data/mysql
  1. 启动容器查看 my.cnf 配置文件位置,并复制到宿主机目录下。
# 运行并进入 mysql 容器
docker run --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27
docker exec -it mysql8 /bin/bash
# 通常 mysql 配置文件在 /etc/mysql 目录下,不同版本 mysql 有所差异
# 找到 my.cnf 文件后,将其复制到宿主机目录下
docker cp mysql8:/etc/mysql/my.cnf conf/my.cnf
# 编辑 my.cnf 文件
vim /var/docker_data/mysql/conf/my.cnf
# 添加如下内容:
[client]
# 客户端默认字符编码
default_character_set=utf8

[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
# 设置允许数据导出的目录,8 版本以后可能需要指定
# 若此处为 NULL,则 /var/docker_data/mysql/mysql-files 无需创建与挂载
secure-file-priv=/var/lib/mysql-files
# 服务端设置字符编码与规则
collation_server=utf8_general_ci
character_set_server=utf8
# 传输过程当中允许的最大数据包大小
max_allowed_packet=1024M
# 最大连接数
max_connections=1000
# 服务器关闭非交互(客户端)连接之前等待活动的秒数
wait_timeout=2147483
# 服务器关闭交互式(mysql终端)连接前等待活动的秒数
interactive_timeout=2147483
# 连接超时
connect_timeout=20
# 客户端线程最大数量
thread_cache_size=256
# 表名大小写敏感设置(mysql8之后仅初始化时有效):
# 0 表名存储为给定的大小和比较是区分大小写的
# 1 表名存储为小写的,但是比较的时候是不区分大小写
# 2 表名存储为给定的大小写,但是比较的时候是小写的
# Windows下默认值是 1,Mac OS X下默认值是 2
lower_case_table_names=1
# 设置默认时区
default_time-zone='+08:00'

# Custom config should go here
!includedir /etc/mysql/conf.d/

  1. 启动 mysql 容器。
docker run --name mysql -d \
-p 3306:3306 \
-v /root/docker_data/mysql/data:/var/lib/mysql \
-v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker_data/mysql/log:/var/log/mysql \
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
mysql:8.0.27 
  1. 测试 mysql 是否可用。
# 进入容器内部
docker exec -it mysql8 bash
# 进行 mysql 交互式连接
mysql -uroot -p123456
# 查看 mysql 配置的字符编码
SHOW VARIABLES LIKE 'character%';
# 如下图结果,则安装成功

在这里插入图片描述

集群部署

master 部署

  1. 拉取镜像。
  2. 创建挂载目录并授权。
mkdir -p /var/docker_data/mysql_master/data
mkdir -p /var/docker_data/mysql_master/conf
mkdir -p /var/docker_data/mysql_master/log
mkdir -p  /var/docker_data/mysql_master/mysql-files

chmod -R 770 /var/docker_data/mysql_master
  1. 将容器内的 my.cnf 文件拷贝到宿主机,并修改。
# 在单机部署的 my.cnf 配置文件基础上添加:
[mysqld]
log-bin=mysql-bin   #[必须]启用二进制日志
server-id=101       #[必须]服务器唯一ID(唯一即可)
  1. 创建并启动 mysql 容器。
docker run --name mysql_master -d \
-p 33061:3306 \
-v /root/docker_data/mysql/data:/var/lib/mysql \
-v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker_data/mysql/log:/var/log/mysql \
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
mysql:8.0.27 
  1. 进入容器内部,创建用于主从复制的用户,并赋予权限。
# 进入容器内部
docker exec -it mysql_master bash
# 进行 mysql 交互式连接
mysql -uroot -p123456
# 数据同步的用户
# mysql8 版本默认使用 caching_sha2_password 密码插件。
# 需要添加 with mysql_native_password,否则从机会无法验证密码
# 旧版本不需要
create user 'lxl'@'%' identified with mysql_native_password by 'root';
# 授权(REPLICATION SLAVE为允许从主服务器中读取日志权限)
GRANT REPLICATION SLAVE ON *.* to 'lxl'@'%';
# 刷新权限(低版本的MySQL)
flush privileges;
  1. 查看master同步状态。

在这里插入图片描述

slave 部署

  1. 拉取镜像。
  2. 创建挂载目录并授权。
mkdir -p /var/docker_data/mysql_slave/data
mkdir -p /var/docker_data/mysql_slave/conf
mkdir -p /var/docker_data/mysql_slave/log
mkdir -p  /var/docker_data/mysql_slave/mysql-files

chmod -R 770 /var/docker_data/mysql_slave
  1. 将容器内的 my.cnf 文件拷贝到宿主机,并修改。
# 在单机部署的 my.cnf 配置文件基础上添加:
[mysqld]
server-id=102       #[必须]服务器唯一ID(唯一即可)
  1. 创建并启动 mysql 容器。
docker run --name mysql_slave -d \
-p 33062:3306 \
-v /root/docker_data/mysql/data:/var/lib/mysql \
-v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker_data/mysql/log:/var/log/mysql \
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
mysql:8.0.27 
  1. 进入容器内部,执行绑定主数据库命令。
# 进入容器内部
docker exec -it mysql_slave bash
# 进行 mysql 交互式连接
mysql -uroot -p123456
# 设置主管地址与同步主库的日志位置
# mysql5.7
# change master to master_host='192.168.70.88',source_port=3306,master_user='lxl',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=397;
# mysql8.0.27 版本
change replication source to source_host='192.168.70.88',source_port=3306,master_user='lxl',master_password='root', source_log_file='mysql-bin.000001', source_log_pos=397;
# master_host : 主库的IP地址
# master_user : 访问主库进行主从复制的用户名(上面在主库创建的)
# master_password : 访问主库进行主从复制的用户名对应的密码
# master_log_file : 从哪个日志文件开始同步(上述查询master状态中)
# master_log_pos : 从指定日志文件的哪个位置开始同步(上述查询master状态中)
  1. 启动从机同步机制,并查看同步状态。
# 开启从服务器的2个线程服务
start slave;

show slave status;
# 推荐这种,单例查看
show slave status\G; 
# 若如下图所示,则设置成功!

在这里插入图片描述

错误记录

问题 1:

Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)

原因:

MYSQL新特性 secure_file_priv 限制读写文件、输出数据的所在目录。
限制了如 LOAD DATA, SELECT … OUTFILE 等一类操作的操作目录。

解决:

# 在 my.cnf 配置文件中添加 secure-file-priv
# 设置允许数据导出的目录,8 版本以后可能需要指定
secure-file-priv=/var/lib/mysql-files

# 同时在启动 mysql8 版本的容器时,添加挂载目录
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files 

问题 2:

error connecting to master: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

原因:

mysql8.0 更新了密码加密方式 caching_sha2_password,而 mysql_native_password 作为 MySQL 5.7 的默认密码插件。在此处进行主从复制时,slave 机还是以旧的加密方式去连接 master 机,故报错!

解决:

# 创建主从同步的用户,设置密码时指定以 mysql_native_password 为使用的密码插件。
# 需要添加 with mysql_native_password
create user 'lxl'@'%' identified with mysql_native_password by `root`;

问题 3:

The slave I/O thread stops because master and slave have equal MySQL s erver UUIDs; these UUIDs must be different for replication to work.

原因:

master 与 slave 使用了共同的 server_id/server_uuid 导致。

解决:

# 解决 server_id 相同
[mysqld]
# master 与 slave 必须不同的 server_id 
server-id=102 

# 解决 server_uuid 相同
# 温和方式:在 mysql 客户端中生成 uuid,修改到 auto.cnf 文件中
select uuid();
# 暴力方式:直接删除容器内 /var/lib/mysql/auto.cnf 文件,重启后自动生成新的
# 温和或暴力方式后,都需要重启 mysql (docker 环境重启容器即可)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一些关于c++的琐碎知识点

目录 bool强转 const构成重载:const修饰*p 移动构造 new int (10)所做的四件事 this指针---为什么函数里面需要this指针? .和->的区别 new创建对象 仿函数 new和malloc的区别 c系统自动给出的函数有 delete和delete[ ]区别何在 检查有没有析构函数 e…

六一,用前端做个小游戏回味童年

#【六一】让代码创造童话,共建快乐世界# 文章目录 📋前言🎯简简单单的弹球游戏🎯代码实现📝最后 📋前言 六一儿童节。这是属于孩子们的节日,也是属于我们大人的节日(过期儿童&…

chatgpt赋能python:**Python免费编辑器:提高开发效率和便捷性**

Python 免费编辑器:提高开发效率和便捷性 Python 编程语言已经成为了越来越多开发者的首选。这是因为 Python 语言非常直观易懂,同时也拥有庞大的第三方开源库,方便开发人员快速实现项目功能。Python 编程之所以如此受欢迎,除了这…

Java基础编程

Java入门 1. JDK的安装目录介绍 目录名称说明bin该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。conf该路径下存放了JDK的相关配置文件。include该路径下存放了一些平台特定的头文件。jmods该路径下存放了JDK的各种模块。legal该路径下存放了JDK各模块的授权文…

使用kettle进行数据统计

1.使用kettle设计一个能生成100个取值范围为0到100随机整数的转换。 为了完成该转换,需要使用生成记录控件、生成随机数控件、计算器控件及字段选择控件。控件布局如下图所示 生成记录控件可以在限制框内指定生成记录的个数,具体配置如图所示 生成随机数…

chatgpt赋能python:Python免费教学:让编程更便捷

Python免费教学:让编程更便捷 Python是一门广泛应用于机器学习、数据分析、网络编程和自动化测试等领域的高级编程语言。随着人工智能和大数据分析的兴起,Python的应用广泛受到了各个行业的欢迎,越来越多的人开始学习Python。在这篇文章中&a…

STM32之任务的创建与删除

目录 1. 什么是任务? 2. 任务创建与删除相关函数 任务动态创建与静态创建的区别: xTaskCreate 函数原型 官方案例: vTaskDelete 函数原型 3. 实操 1. 什么是任务? 任务可以理解为进程 / 线程,创建一个任务&#…

【生物力学】《人体骨肌系统生物力学》- 王成焘老师 - 第2章 - 人体几何学测量与仿真建模

第1章回到目录第3章 文章目录 2.1 概论2.2 人体几何学测量2.2.1 人体外部几何形态2.2.2 人体尺寸测量与统计处理2.2.3 中国人体尺寸标准统计测量数据2.2.4 人体各部位比例及人体间尺寸换算2.2.5 人体活动范围测量 2.3 人体骨肌系统三维几何建模的数据来源2.3.1 冷冻切片数字摄像…

“微商城”项目(2准备工作)

一.安装Node.js 本项目使用Vue.js前端框架进行开发,在创建项目之前需要先下载Node.js环境。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它可以让JavaScript运行在服务器端。接下来对Node.js的下载和安装进行详细讲解。 打开Node.js官方网站&a…

RabbitMQ高频面试题

RabbitMQ的使用场景 异步发送消息(验证码、短信、邮件…)mysql、redis、es之间的数据同步分布式事务削峰填谷… 面试题:RabbitMQ如何保证消息不丢失 消息丢失原因 生产者发送的消息未到达交换机交换机未把消息路由到队列mq服务器宕机&…

辅助驾驶功能开发-功能算法篇(1)-ACC-多目标选择

1、总体架构 2、漏斗概念(Funnel) 路径漏斗是围绕着自车预测轨迹的一片区域。换言之,漏斗的中心应该根据预测的轨迹方向相应的弯曲。 2.1、普通&略宽漏斗(Normal Funnel & Wider Funnel) 普通漏斗用于选择路径中最近的目标车辆A和次近的车辆B。 更宽的漏斗用于选择…

@SentinelResource和openFeign+sentinel 对远程调用熔断降级加规则持久化的具体实 现

SentinelResource 自定义全局限流处理类 需求分析/图解 先看前面的一段代码 这个就是上面的Sentinel 热点规则 注意看我们的限制处理方法在本类中代码的耦合度高 阅读性差 不利于程序的扩展 SentinelResource的作用就是解决这个需求将处理方法放到一个类中 GetMapping("…

Docker从入门到会搭建一个简单的系统

一、环境准备 1、查看Llinux的版本 [rootlocalhost ~]# cat /etc/redhat-release 2、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld.service 3、设置开机不启动防火墙 [rootlocalhost ~]# systemctl disable firewalld.service 二、Docker的安装 1、Docker是中高…

单片机GD32F303RCT6 (Macos环境)开发 (三十二)—— GD32 SPI主从实验 中断模式

GD32 SPI主从实验 中断模式 1、接线 SPI0 PA4 PA5 PA6 PA7SPI1 PB12 PB14 PB14 PB15采用全双工模式SPI0 SPI1CS PA4----------------PB12CLK PA5----------------PB13MISO PA6----------------PB14MOSI PA7----------------PB152、spi0 主设…

chatgpt赋能python:Python简单游戏开发入门

Python简单游戏开发入门 Python作为一门流行的编程语言,可以用来开发各种各样的应用,包括游戏。虽然Python不是游戏开发的主流语言,但我们可以用它来制作一些简单而有趣的游戏。在这篇文章中,我们将介绍如何用Python创建一个简单…

批量剪辑视频工具源码开发搭建分享

搭建步骤 1. 首先需要根据自身产品确定视频类型及需要实现的视频效果 2. 根据预期视频效果选择视频上传模式,并将视频素材进行上传 3. 添加音频、字幕,标题等与素材进行组合。 4. 设置投放计划,包括:视频标题、视频话题等 5.…

Are Emergent Abilities of Large Language Models a Mirage?

Paper name Are Emergent Abilities of Large Language Models a Mirage? Paper Reading Note Paper URL: https://arxiv.org/pdf/2304.15004.pdf Video URL: https://www.youtube.com/watch?vhZspGdApDIo TL;DR 2023 年斯坦福的研究,探索大语言模型表现出涌…

LeetCode 1552. Magnetic Force Between Two Balls【二分,排序,贪心】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

内存栈与CPU栈机制

1. 内存栈: 先入后出,LIFO(LAST IN FIRST OUT) 入栈:将一个新的元素放到栈顶 出栈:从栈顶取出一个元素 栈顶元素总是最后一个入栈,需要时出栈. 2.CPU栈机制 8086CPU提供相关指令以栈方式来访问内存空间.相当于将一段内存当做栈来使用 8086CPU提供的入栈指令为:PUSH ,出栈指令为…

【Linux】序列化和反序列化

目录 🌈前言🌸1、应用层🌺2、重谈协议🍁3、网络计算器🍡3.1、定制协议🍢3.2、样例代码 🌈前言 这篇文章给大家带来序列化和反序列化的学习!!! 🌸…