MySQL主从复制(docker搭建)

news2024/11/24 22:47:45

文章目录

    • 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

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

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

相关文章

c#自动生成缺陷图像-添加新功能(可从xml直接提取目标数据,然后进行数据离线增强)--20240524

在进行深度学习时,数据集十分重要,尤其是负样本数据。 故设计该软件进行深度学习数据预处理,最大可能性获取较多的模拟工业现场负样本数据集。 该软件基于VS2015、.NETFrameWork4.7.2、OpenCvSharp1.0.0.0、netstandard2.0.0.0、SunnyUI3.2.9.0、SunnyUI.Common3.2.9.0及Ope…

Android studio的Gradle出问题

Gradle sync failed: Plugin [id: com.android.application, version: 7.1.1, apply: false] was not found in any of the following sources: 在src里面的build.gradle中 plugins { id ‘com.android.application’ } 的上面加上 buildscript {repositories {jcenter()}depen…

数字驱动,教育先行——低代码揭秘教育机构管理数字化转型

数字化时代为教育带来了许多变革和挑战&#xff0c;同时也为教育创新提供了无限可能。数字化转型可以帮助教育机构应对这些变革和挑战&#xff0c;提高教育效率和质量&#xff0c;满足学生个性化需求&#xff0c;优化教育管理和服务&#xff0c;并提高教育机构的竞争力。 并且…

【译】MySQL复制入门: 探索不同类型的MySQL复制解决方案

原文地址&#xff1a;An Introduction to MySQL Replication: Exploring Different Types of MySQL Replication Solutions 在这篇博文中&#xff0c;我将深入介绍 MySQL 复制&#xff0c;回答它是什么、如何工作、它的优势和挑战&#xff0c;并回顾作为 MySQL 环境&#xff0…

131. 面试中关于架构设计都需要了解哪些内容?

文章目录 一、社区系统架构组件概览1. 系统拆分2. CDN、Nginx静态缓存、JVM本地缓存3. Redis缓存4. MQ5. 分库分表6. 读写分离7. ElasticSearch 二、商城系统-亿级商品如何存储三、对账系统-分布式事务一致性四、统计系统-海量计数六、系统设计 - 微软1、需求收集2、顶层设计3、…

开源大模型与闭源大模型:谁主沉浮?

目录 &#x1f349;引言 &#x1f349;数据隐私 &#x1f348;开源大模型的优势与挑战 &#x1f34d;优势&#xff1a; &#x1f34d;挑战&#xff1a; &#x1f348;闭源大模型的优势与挑战 &#x1f34d;优势&#xff1a; &#x1f34d;挑战&#xff1a; &#x1f34…

【设计模式深度剖析】【2】【创建型】【工厂方法模式】

&#x1f448;️上一篇:单例模式 | 下一篇:抽象工厂模式&#x1f449;️ 目录 工厂方法模式概览工厂方法模式的定义英文原话直译 工厂方法模式的4个角色抽象工厂&#xff08;Creator&#xff09;角色具体工厂&#xff08;Concrete Creator&#xff09;角色抽象产品&#x…

2001-2022年全国31省份互联网发展47个指标合集各省电信业务信息化软件信息技术服务业

全国31省份互联网发展47个指标合集各省电信业务信息化软件信息技术服务业&#xff08;2001-2022年&#xff09;插值填补无缺失 整理了各省电信业务、从业人员、电信通信、互联网发展、企业信息化、软件和信息技术服务业等47个互联网主要发展指标&#xff0c;内含原始数据、线性…

Web前端一套全部清晰 ⑨ day5 CSS.4 标准流、浮动、Flex布局

我走我的路&#xff0c;有人拦也走&#xff0c;没人陪也走 —— 24.5.24 一、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如:块元素独占一行&#xff0c;行内元素可以一行显示多个。 二、浮动 作用: 让块级元素水平排列。 属性名:floa…

LeetCode1161最大内层元素和

题目描述 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层&#xff0c;而根节点的子节点位于第 2 层&#xff0c;依此类推。请返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个。 解析 在上一题&…

微信小程序报错:notifyBLECharacteristicValueChange:fail:nodescriptor的解决办法

文章目录 一、发现问题二、分析问题二、解决问题 一、发现问题 微信小程序报错&#xff1a;notifyBLECharacteristicValueChange:fail:nodescriptor 二、分析问题 这个提示有点问题&#xff0c;应该是该Characteristic的Descriptor有问题&#xff0c;而不能说nodescriptor。 …

【传知代码】Modnet 人像抠图-论文复现

文章目录 概述原理介绍核心逻辑ModNet 的结构 环境配置WebUI 小结 论文地址 论文GitHub 本文涉及的源码可从Modnet 人像抠图该文章下方附件获取 概述 人像抠图技术在多个领域有着广泛的应用场景&#xff0c;包括但不限于&#xff1a; 展馆互动拍照&#xff1a;展馆中使用的抠…

二叉树的递归实现及例题

目录 遍历方式 示例 原理 前序遍历示例 二叉树的节点个数 原理 层序遍历 原理 这样做的目的是 判断完全二叉树 例题 ​编辑 思路 代码 遍历方式 二叉树的遍历方式可分为&#xff1a; 前序遍历&#xff1a;先访问根&#xff0c;访问左子树&#xff0c;在访问右子…

2024.05.24 学习记录

1、面经复习&#xff1a; js基础、知识深度、js垃圾回收 2、代码随想录刷题&#xff1a;动态规划 完全背包 all 3、rosebush 完成 Tabs、Icon、Transition组件

C++中获取int最大与最小值

不知道大家有没有遇到过这种要求&#xff1a;“返回值必须是int&#xff0c;如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] &#xff0c;需要截断这个整数&#xff0c;使其保持在这个范围内。例如&#xff0c;小于 −2^31 的整数应该被固定为 −2^31 &#xff0c;大…

【Ubuntu查看硬盘和网络配置信息】解决方案

1.查看硬盘序列号 搜索系统中有应用&#xff0c;打开“磁盘”&#xff0c;因为我本人是只设置了一个分区&#xff0c;所以打开如下&#xff0c;从上面可以得到硬盘序列号 2.查看ip地址和MAC地址 ctrl alt t 打开命令行 输入ifconfig, 如下图所示&#xff0c;MAC地址即为&…

多家知名媒体到访“光子1号金融算力中心“ 交流AI与算力未来观

5月23日&#xff0c;企商在线 “光子1号金融算力中心媒体参观日”活动成功举办&#xff0c;十多家主流媒体、IT行业媒体及自媒体代表走进光子1号金融算力中心&#xff0c;深入了解企商业务发展、战略规划及“光子1号金融算力中心”等企商打造的新型数字基础设施&#xff0c;共同…

论文研读之hpn-ssh: High speed bulk data transfer using the SSH protocol

优化解决方案的策略 其中提到盲目的增加窗口大小实际上可能导致性能下降,这种下降可能由这几个因素引起:中间路由器上的缓冲区填满;路径过快饱和;过度缓冲;引入新的问题。虽然较大的缓冲区在某些情况下可能提高性能,但也有引入新的、难以诊断的问题的风险。这种复杂性使…

QtCreator,动态曲线实例

样式图&#xff1a; .ui 在sloem1.ui文件中&#xff0c;拖入一个label控件&#xff0c; 头文件.h #include "QtGui/QPainter.h" #include "QtCore/QTimer.h"protected:bool eventFilter(QObject *obj,QEvent *event);void labelPaint();public slots: /…

6款网站登录页(附带源码)

6款网站登录页 效果图及部分源码123456 领取源码下期更新预报 效果图及部分源码 1 部分源码 <style>* {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;background-image: linear-gradient(to right, #fbc2eb, #a6c1ee);}.l…