MySQL主从复制(docker搭建)

文章目录

    • 1.MySQL主从复制配置
        • 1.主服务器配置
          • 1.拉取mysql5.7的镜像
          • 2.启动一个主mysql,进行端口映射和目录挂载
          • 3.进入/mysql5.7/mysql-master/conf中创建my.cnf并写入主mysql配置
            • 1.进入目录
            • 2.执行命令写入配置
          • 4.重启mysql容器,使配置生效
          • 5.进入主mysql,创建要同步的用户并设置权限
            • 1.进入主mysql容器
            • 2.登录mysql(输入启动容器时设置的密码)
            • 3.允许slave用户连接到主服务器(master)并请求数据复制,密码123456
            • 4.允许用户查询主服务器的状态或从服务器的状态
            • 5.检查是否有slave用户
            • 6.检查slave用户权限
          • 6.开启3307端口
            • 1.宝塔开启
            • 2.腾讯云安全组开启
        • 2.在另一台服务器安装docker
          • 1.卸载旧版本的docker
          • 2.安装 gcc相关
          • 3.安装`yum-utils`软件包
          • 4.docker设置阿里云的镜像仓库,最好不要设置国外的
          • 5.更新yum包的索引(linux基础,以后使用yum会快一些)
          • 6.安装最新版的docker
          • 7.启动docker进程并查看docker是否成功启动
          • 8.运行docker
          • 9.停止docker
          • 10.设置docker自启动并确认是否设置成功!
          • 11.阿里云镜像加速器配置
            • 1.找到容器镜像服务
            • 2.得到镜像加速器地址
            • 3.创建目录
            • 4.通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
            • 5.重启daemon
            • 6.重启docker
        • 3.从服务器配置
          • 1.拉取mysql5.7的镜像
          • 2.启动一个主mysql,进行端口映射和目录挂载
          • 3.进入/mysql5.7/mysql-slave/conf目录新建my.cnf写入配置
            • 1.进入目录
            • 2.配置文件
            • 3.执行脚本写入配置
          • 4.重启mysql容器,使配置生效
          • 5.在主数据库中查看主从复制状态
          • 6.从机进入mysql命令行
            • 1.进入容器
            • 2.进入命令行
          • 7.从机配置主从复制
            • 1.配置指令
            • 2.执行指令,配置主从复制
            • 3.在从数据库中查看主从复制状态
            • 4.从数据库中开启主从同步
          • 8.测试
            • 1.主机执行sql
            • 2.从机读取数据
          • 9.开启端口3308
            • 1.宝塔开启
            • 2.腾讯云安全组开启
    • 2.使用主从复制
        • 1.IDEA测试连接两个数据库的连接
          • 1.主数据库
          • 2.从数据库
        • 2.解决中文插入失败的问题
          • 1.引出问题
          • 2.主服务器中查询编码,发现都是latin1
          • 3.进入主服务器配置目录/mysql5.7/mysql-master/conf
          • 4.编辑my.cnf 添加如下配置
          • 5.重启mysql容器
          • 6.启动失败了
            • 1.查看mysql日志
            • 2.因为配置文件中指定的字符集 `utf8mb4"` 不正确。从错误信息来看,字符集名称后面多了一个引号
            • 3.确实多了个引号,编辑配置文件删除引号后再次重启,成功!
          • 7.测试插入中文,还是插入失败,猜测原因可能是从服务器的编码不能满足中文
            • 1.进入从服务器配置目录/mysql5.7/mysql-slave/conf
            • 2.编辑my.cnf 添加如下配置
            • 3.重启服务使配置生效
          • 8.再次插入还是失败,分别查询一下主从数据库的字符集
            • 1.主数据库
            • 2.从数据库
          • 9.那么就只有一种可能了,就是之前创建数据库的时候没有指定编码,所以使用的默认的,也就是即使修改了默认编码原来的数据库还是不支持中文
            • 1.主数据库重新创建db,插入中文,成功!
            • 2.从数据库查询,成功!

1.MySQL主从复制配置

1.主服务器配置
1.拉取mysql5.7的镜像
docker pull mysql:5.7
2.启动一个主mysql,进行端口映射和目录挂载
  • 端口3307
  • –name:mysql-master
  • -v:挂载三个目录
  • -e:设置密码
  • -d:后台启动
  • mysql:5.7:镜像名字
docker run -p 3307:3306 --name mysql-master \
-v /mysql5.7/mysql-master/log:/var/log/mysql \
-v /mysql5.7/mysql-master/data:/var/lib/mysql \
-v /mysql5.7/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=\
-d mysql:5.7

image-20240518191847292

3.进入/mysql5.7/mysql-master/conf中创建my.cnf并写入主mysql配置
1.进入目录
cd /mysql5.7/mysql-master/conf
2.执行命令写入配置
cat <<EOF > my.cnf
[mysqld]
## 设置 server_id,同一复制体系中需要唯一
server_id=101

## 指定要忽略的数据库在复制过程中不传送
binlog-ignore-db=mysql

## 开启二进制日志功能
log-bin=mall-mysql-bin

## 设置二进制日志缓存大小为1M(更多)
binlog_cache_size=1M

## 设置使用的二进制日志格式(mixed, statement, row)
binlog_format=mixed

## 二进制日志过期删除时间为7天。超过此期限的日志将被自动删除
expire_logs_days=7

## 针对复制过程中遇到的特定错误编号忽略错误处理,避免 slave 端复制中断。
## 如:1062错误是指一些主键重复错误,1032错误是因为主从数据不一致
slave_skip_errors=1062
EOF

image-20240518192603828

4.重启mysql容器,使配置生效
docker restart mysql-master

image-20240518192847680

5.进入主mysql,创建要同步的用户并设置权限
1.进入主mysql容器
docker exec -it mysql-master /bin/bash
2.登录mysql(输入启动容器时设置的密码)
mysql -u root -p

image-20240518193345946

3.允许slave用户连接到主服务器(master)并请求数据复制,密码123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
4.允许用户查询主服务器的状态或从服务器的状态
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
5.检查是否有slave用户
SELECT user, host FROM mysql.user WHERE user = 'slave';
6.检查slave用户权限
SHOW GRANTS FOR 'slave'@'%';

image-20240518194149917

6.开启3307端口
1.宝塔开启
systemctl start firewalld && firewall-cmd --permanent --add-port=3307/tcp && firewall-cmd --reload && firewall-cmd --query-port=3307/tcp

image-20240518194947035

2.腾讯云安全组开启

image-20240518195109726

2.在另一台服务器安装docker
1.卸载旧版本的docker
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

image-20240517154553368

2.安装 gcc相关
yum -y install gcc && yum -y install gcc-c++

image-20240518195238121

3.安装yum-utils软件包
yum install -y yum-utils

image-20240517155524244

4.docker设置阿里云的镜像仓库,最好不要设置国外的

image-20240517155332913

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

image-20240517155823043

5.更新yum包的索引(linux基础,以后使用yum会快一些)
yum makecache fast

image-20240517155949744

6.安装最新版的docker
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

image-20240517160300623

7.启动docker进程并查看docker是否成功启动
systemctl start docker && ps -aux | grep docker

image-20240517160628449

8.运行docker

在本地找不到,会到远程仓库查找镜像

docker run hello-world

image-20240517160742958

9.停止docker
systemctl stop docker && ps -aux | grep docker

image-20240517161145268

10.设置docker自启动并确认是否设置成功!
systemctl enable docker && systemctl is-enabled docker

image-20240517161257256

11.阿里云镜像加速器配置
1.找到容器镜像服务

https://cr.console.aliyun.com/cn-beijing/instances

image-20240517161923588

2.得到镜像加速器地址

image-20240517162247947

3.创建目录
mkdir -p /etc/docker
4.通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://s0qrw5u9.mirror.aliyuncs.com"]
}
EOF
5.重启daemon
systemctl daemon-reload
6.重启docker
systemctl restart docker && ps -aux | grep docker
3.从服务器配置
1.拉取mysql5.7的镜像
docker pull mysql:5.7

image-20240518200017473

2.启动一个主mysql,进行端口映射和目录挂载
  • 端口3308
  • –name:mysql-slave
  • -v:挂载三个目录
  • -e:设置密码
  • -d:后台启动
  • mysql:5.7:镜像名字
docker run -p 3308:3306 --name mysql-slave \
-v /mysql5.7/mysql-slave/log:/var/log/mysql \
-v /mysql5.7/mysql-slave/data:/var/lib/mysql \
-v /mysql5.7/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=\
-d mysql:5.7

image-20240518200104571

3.进入/mysql5.7/mysql-slave/conf目录新建my.cnf写入配置
1.进入目录
cd /mysql5.7/mysql-slave/conf
2.配置文件
[mysqld]
## 设置 server_id,同一复制体系中需要唯一
server_id=102

## 指定要忽略的数据库在复制过程中不传送
binlog-ignore-db=mysql

## 开启二进制日志功能,以 slave 为前缀来区分这是针对 Master 的日志
log-bin=mall-mysql-slave1-bin

## 设置二进制日志缓存大小为1M(更多)
binlog_cache_size=1M

## 设置使用的二进制日志格式(mixed, statement, row)
binlog_format=mixed

## 二进制日志过期删除时间为7天。超过此期限的日志将被自动删除
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

## 设置该服务器为只读(具有 super 权限的用户除外)
read_only=1

3.执行脚本写入配置
cat <<EOF > my.cnf
[mysqld]
server_id=102
binlog-ignore-db=mysql
log-bin=mall-mysql-slave1-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mall-mysql-relay-bin
log_slave_updates=1
read_only=1
EOF

image-20240518200559198

4.重启mysql容器,使配置生效
docker restart mysql-slave

image-20240518200702959

5.在主数据库中查看主从复制状态
  • 这里的File就是后面主从复制的master_log_file
  • 这里的Position就是后面主从复制的master_log_pos
show master status;

image-20240518201037571

6.从机进入mysql命令行
1.进入容器
docker exec -it mysql-slave /bin/bash
2.进入命令行
mysql -u root -p
7.从机配置主从复制
1.配置指令
  • master_host: 指定主服务器的 IP 地址或主机名。
  • master_user: 用于复制过程的 MySQL 用户名。
  • master_password: 该用户的密码。
  • master_log_file: 从服务器开始读取的二进制日志文件名。这通常是从服务器上次停止复制的位置,或者是一个新的复制起点。
  • master_log_pos: 从指定的二进制日志文件开始复制的位置(字节单位)。这指定了从哪里开始复制日志事件。
  • master_port: 主服务器的 MySQL 端口号,如果不是默认的 3306,则需要指定。
  • master_connect_retry: 如果连接失败,从服务器在尝试重新连接前等待的时间(秒)。
CHANGE MASTER TO
    master_host='',
    master_user='slave',
    master_password='123456',
    master_log_file='mall-mysql-bin.000001',
    master_log_pos=617,
    master_port=3307,
    master_connect_retry=30;
2.执行指令,配置主从复制

image-20240518201849652

3.在从数据库中查看主从复制状态
show slave status \G;
4.从数据库中开启主从同步
start slave;
8.测试
1.主机执行sql
create database db01;
use db01;
create table test
(
    id int,
    name varchar(32)
);
insert into test (id, name)
values (1, 'test');
select *
from test;

image-20240518202559561

2.从机读取数据
use db01;
select * from test;

image-20240518202645123

9.开启端口3308
1.宝塔开启
systemctl start firewalld && firewall-cmd --permanent --add-port=3308/tcp && firewall-cmd --reload && firewall-cmd --query-port=3308/tcp

image-20240518202930965

2.腾讯云安全组开启

image-20240518203025997

2.使用主从复制

1.IDEA测试连接两个数据库的连接
1.主数据库
2.从数据库
2.解决中文插入失败的问题
1.引出问题

image-20240518203737783

image-20240518203741304

2.主服务器中查询编码,发现都是latin1
show variables like 'character%';

image-20240518203915018

3.进入主服务器配置目录/mysql5.7/mysql-master/conf
cd /mysql5.7/mysql-master/conf
4.编辑my.cnf 添加如下配置
vim my.cnf
[client]
## 设置客户端的默认字符集
default_character_set=utf8mb4

[mysqld]
## 设置mysql的默认字符集
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

image-20240518204400910

5.重启mysql容器
docker restart mysql-master

image-20240518204656277

6.启动失败了
1.查看mysql日志
docker logs mysql-master

image-20240518204904823

2.因为配置文件中指定的字符集 utf8mb4" 不正确。从错误信息来看,字符集名称后面多了一个引号

image-20240518204937660

3.确实多了个引号,编辑配置文件删除引号后再次重启,成功!

image-20240518205100535

7.测试插入中文,还是插入失败,猜测原因可能是从服务器的编码不能满足中文
1.进入从服务器配置目录/mysql5.7/mysql-slave/conf
cd /mysql5.7/mysql-slave/conf
2.编辑my.cnf 添加如下配置
vim my.cnf
[client]
## 设置客户端的默认字符集
default_character_set=utf8mb4

[mysqld]
## 设置mysql的默认字符集
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

image-20240518205842833

3.重启服务使配置生效
docker restart mysql-slave
8.再次插入还是失败,分别查询一下主从数据库的字符集
1.主数据库

image-20240518210413934

2.从数据库

image-20240518210424714

9.那么就只有一种可能了,就是之前创建数据库的时候没有指定编码,所以使用的默认的,也就是即使修改了默认编码原来的数据库还是不支持中文
1.主数据库重新创建db,插入中文,成功!
create database db02;
use db02;
create table test
(
    id int,
    name varchar(32)
);
insert into test (id, name)
values (1, '孙显圣');
select *
from test;

image-20240518210800324

2.从数据库查询,成功!
use db02;
select *
from test;

image-20240518210842345

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求&#xff0c;下载excel模版&#xff0c;本来看着还是简单的&#xff0c;然后实现起来一把泪&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才实现&#xff0c;然后是我用easyexcel又实现了一遍&#xff0c;用了一个周多才实现。 这是需求&#x…

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步&#xff08;Master-Slave Replication&#xff09;是一种常用的解决方案&#xff0c;它允许一个主服…

【Redis7】Redis持久化机制之RDB

文章目录 1.RDB简介2.RDB配置触发设置3.RDB的优缺点4.如何检查修复RDB文件5.如何禁用RDB6.RDB参数优化7.总结 1.RDB简介 Redis持久化机制中的RDB&#xff08;Redis Database&#xff09;是一种将Redis在某个时间点的数据以快照形式保存到磁盘上的方法。 原理&#xff1a;RDB通…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展&#xff0c;链游&#xff08;Blockchain Games&#xff09;作为区块链技术的重要应用领域之一&#xff0c;正逐渐展现出其独特的魅力和优势。其中&#xff0c;智能合约作为链游的核心技术之一&#xff0c;对于实现游戏内的各种功能起到了至关重要的作…

k8s的网路配置

目录 1、k8s相关网络类型 1.1 K8S中Pod网络通信 1.2 Overlay Network 1.3 VXLAN 1.3.1 vlan和vxlan的区别 2、Flannel 2.1 简介 2.2 Flannel工作原理 2.3 ETCD之Flannel提供说明 2.4 Flannel部署 2.4.1 在node节点上操作 2.4.2 在master01节点上操作 2.4.2.1 安装f…

LangChain llamaindex

LangChain 参考&#xff1a; 全流程 | Windows 系统本地部署开源模型阿里通义千问 QWEN 1.5&#xff0c;结合 LangChain-Chatchat 框架和向量数据库 FAISS、Milvus - 知乎

MySQL 插入数据的时候自动忽略重复数据

MySQL中插入数据&#xff0c;如果插入的数据在表中已经存在&#xff08;主键或者唯一键已存在&#xff09;&#xff0c;使用insert into语法的时候&#xff0c;如果遇到重复数据&#xff0c;会直接报错&#xff0c;导致事务回滚&#xff0c;所有插入数据&#xff0c;全部失败。…

Go语言直接使用Windows的IOCP API写一个echo服务器

Go的标准库中Windows下的网络是使用了IOCP的&#xff0c;参见go源码go/src/runtime/netpoll_windows.go&#xff0c;标准库为了与Epoll、kqueue等不同平台的IO模式使用统一的API&#xff0c;进行了封装。 如果想直接使用Windows的IOCP API编程&#xff0c;比如想按照&#xff…

iOS swift5 提示信息显示,提示弹框,第三方框架XHToastSwift

文章目录 1.github地址(亲测好用)2.源代码 1.github地址(亲测好用) XHToastSwift - github 2.源代码 XHToast.swift // // XHToast.swift // XHToastSwiftExample // // Created by xiaohui on 16/8/12. // Copyright © 2016年 CoderZhuXH. All rights reserved. …

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

鸿蒙开发ArkUI-X基础知识:【ArkUI代码工程及构建介绍】

代码工程及构建介绍 背景 ArkUI作为OpenHarmony的默认开发框架&#xff0c;在本项目&#xff08;ArkUI-X&#xff09;中需要做到一套代码同时支持多平台构建&#xff0c;所以会采取共仓开发的方式&#xff0c;部分仓直接指向OpenHarmony相关开源仓。 代码结构及仓库结构 代…

基于YOLO系列算法(YOLOv5、YOLOv6、YOLOv8以及YOLOv9)和Streamlit框架的行人头盔检测系统

摘要 本文基于最新的基于深度学习的目标检测算法 (YOLOv5、YOLOv6、YOLOv8)以及YOLOv9) 对头盔数据集进行训练与验证&#xff0c;得到了最好的模型权重文件。使用Streamlit框架来搭建交互式Web应用界面&#xff0c;可以在网页端实现模型对图像、视频和实时摄像头的目标检测功能…

C语言-atoi()库函数的模拟实现

文章目录 前言一、atoi()库函数的介绍及使用1.1 atoi()库函数介绍1.2 atoi()库函数使用 二、atoi()库函数的模拟实现2.1 函数设计2.2 函数实现思路2.3 具体实现2.4 测试 总结 前言 本篇文章介绍c语言中库函数atoi()的使用&#xff0c;以及模拟实现库函数。 一、atoi()库函数的…

【linux】详解linux权限

目录 用户 文件属性 更改文件权限 更改文件拥有者 更改文件所属组 用户的权限 文件掩码 粘滞位 总结 基本指令可参考&#xff1a; 【linux】详解linux基本指令-CSDN博客 【linux】详解linux基本指令-CSDN博客 用户 超级用户&#xff08;root&#xff09;&#xff…

Redis篇 在linux系统上安装Redis

安装Redis 在Ubuntu上安装Redis 在Ubuntu上安装Redis 在linux系统中,我们安装Redis,必须先使它有root权限. 那么在linux中,如何切换到root用户权限呢? sudo su 就可切换到用户权限了. 在切换到用户权限后,我们需要用一条命令来搜索Redis相关的软件包 apt search redis 会出现非…

怎样下载Android Studio历史版本文件包

1.在官网上下载都是推荐最新版本&#xff0c;想下载历史版本比较费劲&#xff0c;绕来绕去的。 2.进入这个网站可以下载其他版本https://android-studio.en.uptodown.com/windows/versions Older versions of Android Studio Its not uncommon for the latest version of an a…

解耦:哪些方法可以用来解耦代码

目录 1.引用 2.为何解耦如此重要 3.如何判断代码是否需要解耦 4.如何给代码解耦 5.思考题 1.引用 前面我们曾经讲到&#xff0c;重构可以分为大型重构和小型重构。小型重构的主要目的是提高代码的可读性&#xff0c;大型重构的主要目的是解耦。本节讲解如何对代码进行解耦…

webgl three 模型操作

模型位置操作是改变相关属性 平移改变位置 缩放改变缩放值 旋转改变角度 webgl中是4x4矩阵 前三排是原始状态 第四排是改变值 .position 位置 .scale 缩放 .rotation 绕轴旋转 .quaternion 绕axis旋转 其实和svg差不多 缩放 缩放是操作对角线 // Matrix4x4 …