Docker安装MySQL、MySQL主从复制、双主双从

news2024/12/23 23:07:35

文章目录

  • Docker安装MySQL
    • 新建容器
    • 配置,记得 重启加载配置!
    • 测试
  • MySQL 主从复制
    • 原理
    • 新增两个mysql,一主一从
    • 在主机上
    • 在从机上
  • MySQL双主双从
    • 必看!
    • 创建容器
    • 在两个主机上
    • 在两个从机上
  • 问题
    • 解决Navicat无法连接MySQL的问题
    • WARNING: IPv4 forwarding is disabled. Networking will not work
    • 主从复制不同步
    • 不建议使用Docker跑MySQL
    • Host '10.244.0.0' is not allowed to connect to this MySQL server

Docker安装MySQL

新建容器

docker run -d  -p 3306:3306 --privileged=true  -v  /app/mysql/log:/var/log/mysql   -v  /app/mysql/data:/var/lib/mysql   -v  /app/mysql/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql   mysql:8.0

#查看是否启动
docker ps 

配置,记得 重启加载配置!

#  my.cnf配置
cd /app/mysql/conf
vim my.cnf #主机的my.cnf

my.cnf文件

[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_general_ci
character_set_server = utf8mb4
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

记得重启加载配置!

docker restart mysql  # 重启容器加载配置!

docker exec -it mysql /bin/bash
mysql -uroot -p123456
show variables like '%character%'; #查看字符集编码

在这里插入图片描述

测试

在这里插入图片描述
在这里插入图片描述

完成配置!

MySQL 主从复制

原理

复制三步骤

  • 步骤1: Master 将写操作记录到二进制日志( binlog )。
  • 步骤2: Slave 将 Master 的binary log events拷贝到它的中继日志( relay log );
  • 步骤3: Slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化
    的,而且重启后从 接入点 开始复制

新增两个mysql,一主一从

#主机
docker run -d  -p 3307:3306 --privileged=true  -v  /app/mysql/mysql-master/log:/var/log/mysql   -v  /app/mysql/mysql-master/data:/var/lib/mysql   -v  /app/mysql/mysql-master/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-master   mysql:8.0
#从机
docker run -d  -p 3308:3306 --privileged=true  -v  /app/mysql/mysql-slave/log:/var/log/mysql   -v  /app/mysql/mysql-slave/data:/var/lib/mysql   -v  /app/mysql/mysql-slave/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-slave   mysql:8.0
#查看是否启动
docker ps 

在主机上

#  my.cnf配置
cd /app/mysql/mysql-master/conf/
vim my.cnf #主机的my.cnf

my.cnf文件

#主机
[mysqld]
## 设置 server_id,同一局域网中需要唯一
server_id=101
binlog-ignore-db=mysql 
log-bin=mysql-master-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

授权、改密码,记得重启容器加载配置!

docker restart mysql-master #重启容器!!!!一定要!

docker exec -it mysql-master /bin/bash #进入主机
mysql -uroot -p #登陆不了就用 mysql -uroot
#密码123456
use mysql #先进入这个库
CREATE USER  'slave'@'%'  IDENTIFIED WITH mysql_native_password BY '123456';#创建一个slave用户,用于主从复制

# ALTER USER 'root'@'%'  IDENTIFIED WITH mysql_native_password BY '123456'; 修改root用户密码
# 若修改密码报错,执行以下两条命令,再进行修改
use mysql;
select user,host from user; #查看主机和用户,看看是否有两个root,有的话删掉一个host='localhost'的root
delete from  user where user='root' and host='localhost';
update user set host='%' where user='root';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; #为这个用户授权:主从复制权限
show master status;

docker inspect mysql-master | grep IPA # mysql-master为容器名,容器Id也可以

docker restart mysql-master #重启容器!!!!一定要!

在这里插入图片描述
在这里插入图片描述

在从机上

# my.cnf配置
cd /app/mysql/mysql-slave/conf/
vim my.cnf #从机的my.cnf

my.cnf文件

#从机
[mysqld]
## 设置 server_id,同一局域网中需要唯一
server_id=102
binlog-ignore-db=mysql 
log-bin=mysql-slave-bin 
binlog_format=mixed 
## 二进制日志过期清理时间。默认值为 0,表示不自动清理。
expire_logs_days=7 
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062 
read_only=1 #设为只读
relay_log=relay-bin-log #中继日志名称!从机必须要配置!
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

开启主从复制,先重启容器加载配置!

docker restart mysql-slave  # 重启加载配置!!!!一定要!

docker exec  -it mysql-slave  /bin/bash #进入主机
# 如果 之前设置过主从,进行重置
stop slave;
stop slave; #先stop slave; 再 stop slave;

# host也可以是ip,端口也可以是容器暴露的端口
change master to master_host='172.17.0.2', 
master_user='slave', 
master_password='123456', master_port=3306, 
master_log_file='mysql-master-bin.000002', 
master_log_pos=1371, master_connect_retry=30;

在这里插入图片描述

mysql -uroot -p123456 #登录从机的mysql
reset slave; # 重置主从复制,应该先stop slave;
start slave; #开启主从复制!
stop slave; #停止主从!
show slave status\G; #查看状态

在这里插入图片描述

完成

MySQL双主双从

必看!

在这里插入图片描述

主主 复制也是一样,等同于 主从复制,在两个master都配置主从,互相复制!

创建容器

docker run -d  -p 3301:3306 --privileged=true  -v  /app/mysql/mysql-master1/log:/var/log/mysql   -v  /app/mysql/mysql-master1/data:/var/lib/mysql   -v  /app/mysql/mysql-master1/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-master1   mysql:8.0

docker run -d  -p 3302:3306 --privileged=true  -v  /app/mysql/mysql-master2/log:/var/log/mysql   -v  /app/mysql/mysql-master2/data:/var/lib/mysql   -v  /app/mysql/mysql-master2/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-master2   mysql:8.0

docker run -d  -p 3303:3306 --privileged=true  -v  /app/mysql/mysql-slave1/log:/var/log/mysql   -v  /app/mysql/mysql-slave1/data:/var/lib/mysql   -v  /app/mysql/mysql-slave1/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-slave1   mysql:8.0

docker run -d  -p 3304:3306 --privileged=true  -v  /app/mysql/mysql-slave2/log:/var/log/mysql   -v  /app/mysql/mysql-slave2/data:/var/lib/mysql   -v  /app/mysql/mysql-slave2/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-slave2   mysql:8.0

#查看是否启动
docker ps 

在两个主机上

主机1

cd /app/mysql/mysql-master1/conf/
vim my.cnf

my.cnf文件

[mysqld]
## 设置 server_id,同一局域网中需要唯一
server_id=1
binlog-ignore-db=mysql 
log-bin=mysql-master1-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

主机2

cd /app/mysql/mysql-master2/conf/
vim my.cnf

my.cnf文件

[mysqld]
## 设置 server_id,同一局域网中需要唯一
server_id=2
binlog-ignore-db=mysql 
log-bin=mysql-master2-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

两个主机都要授权、改密码,记得重启容器加载配置!

docker restart mysql-master1 #重启容器!!!!一定要!

docker exec  -it  mysql-master1  /bin/bash #进入主机
mysql -uroot -p #登陆不了就用 mysql -uroot
#密码123456
use mysql #先进入这个库
CREATE USER  'slave'@'%'  IDENTIFIED WITH mysql_native_password BY '123456';#创建一个slave用户,用于主从复制

# ALTER USER 'root'@'%'  IDENTIFIED WITH mysql_native_password BY '123456'; 修改root用户密码
# 若修改密码报错,执行以下两条命令,再进行修改
use mysql;
select user,host from user; #查看主机和用户,看看 是否有 两个root,有的话删掉一个host='localhost'的root
delete from  user where user='root' and host='localhost';
update user set host='%' where user='root';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; #为这个用户授权:主从复制权限
show master status;

docker inspect mysql-master | grep IPA # mysql-master为容器名,容器Id也可以

docker restart mysql-master1 #重启容器!!!!一定要!

在这里插入图片描述
在这里插入图片描述

在两个从机上

从机1

cd /app/mysql/mysql-slave1/conf
vim my.cnf

my.cnf文件

[mysqld]
server_id=3
binlog-ignore-db=mysql 
log-bin=mysql-slave1-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062 
read_only=1 
relay_log=relay-bin-log1 
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

从机2

cd /app/mysql/mysql-slave2/conf
vim my.cnf

my.cnf文件

[mysqld]
server_id=4
binlog-ignore-db=mysql 
log-bin=mysql-slave2-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062 
read_only=1 
relay_log=relay-bin-log2 
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

开启主从复制,先重启容器加载配置!

docker restart mysql-slave1 # 重启加载配置!!!!一定要

# host也可以是ip,端口也可以是容器暴露的端口
# 如果之前设置过主从,进行重置
stop   slave;
reset  slave; # 重置主从复制,应该先stop slave;
# host 也可以是ip,端口也可以是 容器暴露的端口

change master to master_host='172.17.0.2', 
master_user='slave', 
master_password='123456', master_port=3306, 
master_log_file='mysql-master-bin.000002', 
master_log_pos=1371, master_connect_retry=30;

在这里插入图片描述

mysql -uroot -p123456 #登录从机的mysql
reset slave; #重置主从复制,应该先stop slave;
start slave; #开启主从复制!
stop slave; #停止主从!
show slave status\G; #查看状态

在这里插入图片描述

完成配置!

问题

解决Navicat无法连接MySQL的问题

NavicatERROR 2003

报错提示:
第一种: 2003 - Can’t connect to MySQL server on ‘localhost’(10061 “Unknown error”)(本地连接数据库出错)
或者第二种:2003-cant connection to mysql server on ‘IP’(10061 unknown error)(服务器远程连接出错:未知错误)
或者第三种:Can’t connect to MySQL server on "IP地址’(10038)(服务器远程连接数据库出错:防火墙出错)

检查配置!!
在这里插入图片描述

use mysql;
select user,host from user; # 查看主机

在这里插入图片描述

如果出现以下情况,需要删除host='localhost'的root用户

否则报错

ERROR 1062 (23000): Duplicate entry ‘%-root’ for key 'user.PRIMARY’select user,host from user;

在这里插入图片描述

delete from  user where user='root' and host='localhost';

将root的主机改为%

use mysql;
update user set  host='%' where user='root';
flush privileges; #刷新权限
select user,host from user;

在这里插入图片描述

解决问题!
在这里插入图片描述

WARNING: IPv4 forwarding is disabled. Networking will not work

启动docker容器后提示 WARNING: IPv4 forwarding is disabled. Networking will not work.
在这里插入图片描述

此错误,虽然不影响主从同步的搭建,但是如果想从远程客户端通过以下方式连接docker中的MySQL则没法连接

C:\Users\administrator>mysql -h 192.168.111.101 -P 3306 -u root -p

解决方案:

#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network

解决方案

stop slave; #停止
reset slave; # 重置主从复制,应该先stop slave;
show master status; #在主机查看一边 
#在从机再次执行一次,有变化的需要修改
change master to master_host='172.17.0.2', 
				master_user='slave', 
				master_password='123456', master_port=3306, 
				master_log_file='mysql-master-bin.000002', 
				master_log_pos=1371, master_connect_retry=30;
				
start slave; #开启主从复制
show slave status \G;

在这里插入图片描述

主从复制不同步

我们知道,MySQL 主从同步最主要的依据就是 binlog,master 将自己的 binlog 发给 slave,slave重放之后获取和 master 一致的数据。

那我们就来看看 master 生成的 binlog 是啥样子。

我们按照事件的方式来看一下 binlog,命令格式如下:

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

这个表示 以事件的方式来查看 binlog,这里涉及到几个参数:

  • log_name:可以指定要查看的 binlog 日志文件名,如果不指定的话,表示查看最早的 binlog 文件。
  • pos:从哪个 pos 点开始查看,凡是 binlog 记录下来的操作都有一个 pos 点,这个其实就是相当于我们可以指定从哪个操作开始查看日志,如果不指定的话,就是从该 binlog 的开头开始查看。
  • offset:这是是偏移量,不指定默认就是 0
  • row_count:查看多少行记录,不指定就是查看所有

问题解决
binlog_format 设置为 ROW 来解决这个问题
在这里插入图片描述
之后重新配置主从,完成!

不建议使用Docker跑MySQL

Host ‘10.244.0.0’ is not allowed to connect to this MySQL server

# 编辑 my.cnf
# 在 [mysqld]下添加 skip-grant-tables -->跳过密码-->保存即可
mysql -u root -p 
    # 不用输入密码,直接回车(出现Enter Password 也一样直接回车,即可登陆成功)
update user set authentication_string=password('xxxxx') where user='root';
# ALTER USER 'root'@'%'  IDENTIFIED WITH mysql_native_password BY '123456'; mysql8.0-->修改root用户密码
# 若修改密码报错,执行以下两条命令,再进行修改
use mysql;
select user,host from user; #查看主机和用户,看看是否有两个root,有的话 删掉一个host='localhost'的root
delete from  user where user='root' and host='localhost';
update user set host='%' where user='root';
flush privileges;
# 登陆成功-->就删除skip-grant-tables,重启 mysql服务或者容器-->加载配置

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

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

相关文章

计算机网络概况

1 前言计算机网络是指将位于不同地理位置,但具有独立功能的多台设备,通过通信设备和线路连接起来,在网络操作系统,网络管理软件、网络通信协议的协调管理下,实现资源共享和信息传递的计算机系统。简单来说,…

智慧农业灌溉系统-数字农业-农业物联网机井灌溉节水新模式

平升电子智慧农业灌溉系统/农业物联网机井灌溉系统,可实现井电双控(以电控水)、以电折水、以阀控水等各种形式的地下取水井用水计量监测控制需求,助推农业水价改革实施、高效节水灌溉和地下水超采综合治理,促进节水型社…

Python数学建模问题总结(2)数据可视化Cookbook指南·上

概括总结:一、可视化问题1.不会可视化图标;2.可视化效果不好看;3.数据可视化成果无法得到很好的推广使用。二、可视化原则准确的、有帮助的、可扩展的。三、类型1.随时间变化;2.类别比较图表;3.排名列表:有…

proc文件系统下各参数解析

文章目录一、proc文件系统1.1 /proc/[pid]1.1.1 /proc/[pid]/arch_status1.1.2 /proc/[pid]/attr1.1.2.1 /proc/[pid]/attr/current1.1.2.2 /proc/[pid]/attr/exec1.1.2.3 /proc/[pid]/attr/fscreate1.1.2.4 /proc/[pid]/attr/keycreate1.1.2.5 /proc/[pid]/attr/prev1.1.2.6 /…

【操作系统】 第一章 操作系统概述

文章目录第一章 知识体系1.1 操作系统的基本概念1.1.1 操作系统的概念1.1.2 操作系统的特征1.1.3 操作系统的目标和功能1.2 操作系统的发展历程1.3 操作系统的运行环境1.3.1 处理器的运行模式1.3.2 中断和异常的概念1.3.3 系统调用1.4 操作系统结构1.5 操作系统引导1.6 虚拟机第…

C++进阶 红黑树封装map和set

作者:小萌新 专栏:C进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:使用红黑树封装出map和set 红黑树封装map和set红黑树源代码红黑树模板参数的控制红黑树结点当中存储的数据模板参数仿函数的增加正向迭…

react基础Day04-React原理揭秘React路由基础

React原理揭秘 目标 能够说出React组件的更新机制能够对组件进行性能优化能够说出虚拟DOM和DIff算法 组件更新机制 setState() 的两个作用 修改state更新组件 过程:父组件重新渲染时,也会重新渲染子组件,但只会渲染当前组件子树&#xff…

[Android Studio]查看和修改Android API SDK的配置

🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…

高并发系统设计 -- 缓存与数据库一致性问题详细讲解

CAP理论 首先来谈一下数据的一致性这个话题,所谓的一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中的数据的值是一致的。 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读…

steam搬砖项目,信息差赚钱,内含全部讲解

Steam平台就是一个全球的游戏平台,搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧,这款游戏就是CS的一个系列。(通俗易懂的理解就是,从国外steam游戏平台购买装备,再挂到国内网易buff平台上进行售卖。…

【TypeScript】TS进阶-装饰器(九)

🐱个人主页:不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到…

ADI demo PL工程的编译-以adrv9371x_zc706为例子之使用Cygwin

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ADI demo PL工程的编译-以adrv9371x_zc706为例子之使用Cygwin前言Cygwin 安装工程编译总结前言 之前一篇ADI demo工程的编译是ADI不推荐的方法,而且确实在后面NO…

【Django项目开发】django的信号机制(八)

文章目录1、什么是信号2、代码实现3、要想上面定义的信号机制生效,需要在apps.py中加载信号机制1、什么是信号 通俗来说,信号就是通信双方约定的一种信息通知方式,双方通过信号来确定发生了什么事情,然后决定自己应该做什么。 Django 中的信号用于在框架执行操作时解耦。当某…

2.1总线概述

文章目录一、总线简图二、概念与分类1.总线定义2.总线特点(1)分时(2)共享3.总线特性4.总线的分类(1)按数据传输格式①串行总线②并行总线(2)按总线功能①片内总线②系统总线③通信总…

【原创】linux实时应用如何printf输出不影响实时性?

linux实时应用printf输出 文章目录linux实时应用printf输出1. 前言2. linux终端输出3. 常见的NRT IO输出方案3.1 一种实现方式3.3 改进3. Xenomai3 printf()接口3.1 应用运行前环境初始化1. GCC特定语法2. libcobalt printf初始化流程3.2 libcobalt printf内存管理1. print_buf…

我的周刊(第074期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目code-server[1]这是一款开源的基于 VSCode 的在线编…

【Linux系统】第四篇:Linux中编辑器vim的使用

文章目录一、vim的介绍1、vim的基本模式2、vim的使用二、命令模式1、光标移动操作2、文本复制、粘贴、剪切、撤销操作3、文本编辑相关操作三、插入模式四、底行模式底行模式命令集五、vim的配置原理六、sudo无法提权问题一、vim的介绍 vim是Linux下的一款多模式编辑器。 注意…

【已解决】右键以某应用打开xx文件时,没有“始终”选项怎么办

问题解决方案简单来说详细操作解释问题 右键以某应用打开xx文件时,没有“始终”选项 解决方案 简单来说 在注册表:计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\找到要打开的文件后缀名,删除…

2022尚硅谷SSM框架跟学(五)Spring基础二

2022尚硅谷SSM框架跟学 五Spring基础二3.AOP3.1场景模拟3.1.1声明接口3.1.2创建实现类3.1.3创建带日志功能的实现类3.1.4提出问题(1)现有代码缺陷(2)解决思路(3)困难3.2代理模式3.2.1概念(1)介绍(2)生活中的代理(3)相关术语3.2.2静态代理3.2.3动态代理3.2.4测试3.3AOP概念及相关…

视频 | 生信 linux 实战题目讲解03

点击阅读原文跳转完整教案。1 Linux初探,打开新世界的大门1.1 Linux系统简介和目录理解1.1.1 为什么要用Linux系统1.1.2 Linux系统无处不在1.1.3 免费的Linux系统来一套1.1.4 Linux系统登录-联系远方的她1.1.5 初识Linux系统 - 黑夜中的闪烁是你的落脚点1.1.6 我的电…