当前位置: 首页 > news >正文

mysql在服务器中的主从复制Linux下

mysql在服务器中的主从复制Linux下

    • 为什么要进行主从复制
    • 主从复制的原理
    • 主从复制执行流程
      • 操作步骤
        • 主库创建
        • 从库创建
      • 测试

为什么要进行主从复制

  1. 在业务中通常会有情况,在sql执行时,将表锁住,导致不能进行查询,这样就会影响业务的正常运行,这个时候可以使用主从复制,用主库负责写,用从库进行读,这样即使出现锁表的情况也不影响正常的业务。
  2. 主从复制可以进行数据的热备份,主库宕机后,从库可以切换,保证业务的正常执行。
  3. 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘的I\O,提高单个库的性能。

主从复制的原理

  • 主数据库

    MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

    binlog:主库中保存所有更新事件日志的二进制文件。binlog是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。

  • 从数据库

    在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。
    从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。 从库I/O线程读取主库的binlog输出线程发送的更新并拷 贝这些更新到本地文件,其中包括relay log文件。

主从复制执行流程

  1. 主库db的更新事件(update、insert、delete)被写到binlog的日志中去
  2. 从库启动并发起连接,连接到主库
  3. 主库创建一个binlog dump thread,把binlog的内容发送到从库
  4. 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
  5. 从库启动之后,创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
    在这里插入图片描述
    在这里插入图片描述

此案例中规定主库端口号为3306,从库为3307

操作步骤

主库创建

在操作之前先安装docker(Linux中有);然后在docker中获取mysql8的镜像:

docker pull daocloud.io/library/mysql:8.0.16

查看mysql是否安装

docker images

在这里插入图片描述

创建环境目录

1、进入usr下的local下
cd /usr/local
2、创建mysql目录
mkdir mysql
3、进入mysql目录
cd mysql
4、创建master-data目录
mkdir ,aster-data

在这里插入图片描述

主mysql容器运行

mysql]# docker run --name  mysql-master  --privileged=true  -v /usr/local/mysql/master-data:/var/lib/mysql  -p 3306:3306  -e  MYSQL_ROOT_PASSWORD=root  -d  (docker image中的imageId)  --character-set-server=utf8 --server-id=1 --lower_case_table_names=1

参数:

–privileged指定了当前容器是否真正的具有root权限

-p表示宿主机上的某个端口映射到docker容器内的某个端口

-d参数指定了当前容器是在后台运行

–server-id 设置服务器的编号,主从复制的每一个服务的编号都不能相同

在这里插入图片描述

配置mysql权限账户

docker exec -it mysql-master /bin/bash

登录主服务器mysql

mysql -uroot -p
注:此时密码为root

在这里插入图片描述

修改密码和设置从服务器登录用户

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
CREATE USER 'slave_one'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave_one'@'%';

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

查看主mysql的master节点的binlog状态

show master status;

在这里插入图片描述

至此主服务器搭建完毕,下面开始搭建从服务器

从库创建

创建环境目录

cd /usr/local/mysql
mkdir slave_one-data

从mysql容器运行

docker run --name mysql-slave_one --privileged=true -v /usr/local/mysql/slave_one-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master  -e MYSQL_ROOT_PASSWORD=root   -d df8662dadd4f --character-set-server=utf8 --server-id=2   --lower_case_table_names=1

在这里插入图片描述

配置mysql权限账户

docker exec -it mysql-slave_one /bin/bash

在这里插入图片描述

登录从服务器mysql

mysql -uroot -p
注:密码为root

在这里插入图片描述

修改密码登录用户

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

在这里插入图片描述

切换当前服务的状态,使其能够连接上master服务器,并且复制其数据

change master to master_host='master', master_user='slave_one', master_password='123456', master_port=3306, master_log_file='binlog.000002', master_log_pos=1409, master_connect_retry=30;解释:
change master to master_host='master', master_user='slave_one', master_password='123456', 
master_port=3306, master_log_file='master中binlog日志文件名', master_log_pos=master中binlog日志位置, 
master_connect_retry=30;

启动日志同步

start slave;

查看状态

show slave status\G;

在这里插入图片描述

测试

在测试之前首先要保证服务器中的3306he3307的两个端口号防火墙开启

在这里插入图片描述

连接两个数据库

主数据库连接

在这里插入图片描述

从数据库连接

在这里插入图片描述

主库中的数据
在这里插入图片描述

从库不做任何库、表、数据的操作,刷新后有相同的数据

在这里插入图片描述
测试成功。

相关文章:

  • 基于Redis商品库存扣减方案
  • 第一个 Angular 项目 - 动态页面
  • Elastic Search:构建语义搜索体验
  • 简单几步通过DD工具把云服务器系统Linux改为windows
  • Linux编译器---gcc/g++使用详解
  • ChatGPT在数据处理中的应用
  • C++从入门到精通 第五章(指针与引用)
  • ai图片放大老照片ai处理ps学习
  • 回调函数(Language C)
  • JavaSec 之 SQL 注入简单了解
  • 利用PaddleNLP进行文本数据脱敏
  • 前后端延迟怎么解决
  • 汽车信息安全--S32K3的HSE如何与App Core通信(1)?
  • 稀疏计算、彩票假说、MoE、SparseGPT
  • 第2.1章 StarRocks表设计——概述
  • AHK 中 = 和 == 等比较运算符的用法
  • Apache Spark Streaming 使用实例
  • CentOS 7 修改主机名
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JDK 6和JDK 7中的substring()方法
  • python_bomb----数据类型总结
  • python3 使用 asyncio 代替线程
  • SOFAMosn配置模型
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue学习系列(二)vue-cli
  • 对象管理器(defineProperty)学习笔记
  • 汉诺塔算法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 字符串匹配基础上
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 函数计算新功能-----支持C#函数
  • #define、const、typedef的差别
  • #Linux(Source Insight安装及工程建立)
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (9)STL算法之逆转旋转
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)四层和七层负载均衡的区别
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Reactor简单使用教程
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /bin/rm: 参数列表过长"的解决办法
  • ??eclipse的安装配置问题!??
  • @ModelAttribute注解使用