MySQL搭建主从复制流程及相关问题

news2024/11/30 0:41:52

目录

  • 一、关于主从复制
    • 1.1 关于主从复制
    • 1.2 应用场景
    • 1.3 优缺点
    • 1.4 原理
  • 二、配置主从复制
    • 2.1 同步各个服务器的时间
    • 2.2 修改主库(M1)配置
    • 2.3 主库(M1)为从库(S1\S2)增加账号
    • 2.3 查看主库(M1)日志状态
    • 2.4 修改从库(S1) MySQL 配置
  • 2.5 从库(S1)连接主库(M1)
    • 2.5 测试
  • 三、相关问题
    • 问题一:重启从库 MySQL后 是否还要重新 start slave?
    • 问题二:在搭建主从复制之前,主库本身存在其它数据库,会影响主从复制吗?
    • 问题三:如何给从库设置为只读
    • 问题四:MySQL 配置文件的 server-id 必须不一样吗?
    • 问题五:主从复制过程中出现数据不一致的情况
    • 问题六:主从复制延迟同步

一、关于主从复制

1.1 关于主从复制

主从复制是将主数据库中的 DDL 和 DML 操作通过二进制日志(binlog)传输到从数据库上,在从数据库上,将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。

1.2 应用场景

  • 单库压力大,主从同步后读写分离减轻压力。
  • 单个数据库宕机、损坏则造成数据丢失,业务瘫痪。

1.3 优缺点

优点:

  • 读写分离,提高效率
  • 作为备份,避免数据丢失

缺点:

  • 高并发情况下,加上同步问题,导致MySQL效率低。
  • 主从复制延迟,导致数据没及时更新。

1.4 原理

  • Binary log:主数据库的二进制日志
  • Relay log:从服务器的中继日志

在这里插入图片描述
第一步:master 将操作记录到 binlog 日志中。

第二步:slave 的 IO线程读取 master 的 binlog 日志到 relay log 日志中。

第三步:slave 的 SQL 线程读取 relay log 日志,该改变应用到自己的数据库中。

二、配置主从复制

Master:主,简称 M1
Slave:从,简称 S1丶S2

ip地址主从在本文中的简称
49.100.13.244主库M1
176.24.33.241从库S2
102.34.44.144从库S2

2.1 同步各个服务器的时间

2.2 修改主库(M1)配置

  • 修改主库 MySQL 配置文件:vim /etc/my.cnf
server-id = 1   //指定的任意id号,服务器的唯一标识,但是和其它从库不能相同
log-slave-updates=true       //从服务器更新二进制日志
  • 重启 MySQL 服务
systemctl restart mysqld

2.3 主库(M1)为从库(S1\S2)增加账号

GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'176.24.33.%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'102.34.44.%' IDENTIFIED BY '123456';

其中, myslave 是自定义的用户名,后面的(176.24.33.%)是从库的 IP 地址,123456 是账号密码。

PS:例如,我有两个从库(S1、S2),而且每个从库所属 IP 都不一致,根据自己的从库数量 来增加相应数量账号即可。

增加好后,刷新权限列表:

flush privileges;#刷新权限列表

2.3 查看主库(M1)日志状态

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 13242693 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

2.4 修改从库(S1) MySQL 配置

下面只举配置从库 S1 的例子,如果你有多个从库 S2、S3、S4……Sn,配置流程都是一模一样的。

修改 S1 的 MySQL 配置文件:

server-id = 2 #指定的任意id号,服务器的唯一标识,但是不能和其它主库或者从库相同
read_only = 1 #只读不写模式

2.5 从库(S1)连接主库(M1)

建立连接:

mysql> change master to master_host='49.100.13.244',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=13242693;
Query OK, 0 rows affected, 8 warnings (0.08 sec)

开启复制:start slave

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)

查看状态:show slave status\G

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 49.100.13.244
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 13242693
               Relay_Log_File: VM-0-7-centos-relay-bin.000004
                Relay_Log_Pos: 1181
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 13242693
              Relay_Log_Space: 1396
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 0dbd386f-49cb-11ec-940c-00163e12a2c5
             Master_Info_File: /www/server/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

只要 Slave_IO_RunningSlave_SQL_Running 都为 Yes就表示 主从复制已打通。

2.5 测试

主库(M1)新建数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| diary              |
| mycar              |
| mysql              |
| onlinetool         |
| performance_schema |
| video              |
+--------------------+
7 rows in set (0.00 sec)

mysql> create database slave_test;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| diary              |
| mycar              |
| mysql              |
| onlinetool         |
| performance_schema |
| slave_test         |
| video              |
+--------------------+
8 rows in set (0.00 sec)

从库(S1)查看:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| slave_test         |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

三、相关问题

问题一:重启从库 MySQL后 是否还要重新 start slave?

不需要,MySQL 重启后自动开启 start slave。

问题二:在搭建主从复制之前,主库本身存在其它数据库,会影响主从复制吗?

会影响。

例如搭建好主从复制后,在主库新建一个 B 数据库,并在 B 数据库新建了一个数据表,添加了一些数据。这些流程都能正常同步到从库中。

但是,

如果此时主库存在 A 数据库,修改了 A 数据库中的某个表,由于从库中原先就没该数据库,导致主从复制失败,无法进行后续的复制操作(即使主库修改的数据存在)。

解决:

方法一:

锁定主从,先将主库数据同步到从库中。

方法二:

通过修改配置文件可以跳过错误,即使主库修改了从库中不存在的数据库或数据表,也不会影响从库的后续主从复制流程。

修改从库的 MySQL 配置文件:

slave-skip-errors=all

问题三:如何给从库设置为只读

方法一:

mysql5.7.8 开始支持 super_read_only 参数,该参数权限要高于 read_only

将 super_read_only 和 read_only 设置为 on 即可。

mysql> set global super_read_only=on;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like "%read_only%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | ON    |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+
5 rows in set (0.00 sec)

方法二:

配置文件中:

read_only = 1 #只读不写模式

问题四:MySQL 配置文件的 server-id 必须不一样吗?

是的,必须不一样。

一个 MySQL 服务器对应一个 server-id,是服务器的唯一标识,不能出现相同的 server-id。

否则会报错:

The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it)

问题五:主从复制过程中出现数据不一致的情况

产生原因一:

主库和从库的配置文件中,有 binlog_format 参数,参数值分别为:

  • STATEMENT:每一条会修改数据的sql都会记录到 binlog 中。(条)
  • ROW:会将每一条数据的变化写到 binlog 中。(行)
  • MIXED:mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在statement和row之间选一种。(混合)

尽量将主库和从库配置文件中的格式保持一致。

问题六:主从复制延迟同步

原因有以下:

  • 主库读写压力大,导致复制延迟。
  • 主从库之间的网络延迟。
  • 慢SQL语句太多。
  • 主从复制单线程,如果主库写并发太大,来不及传送到从库。

解决方案有以下:

  • 在业务中加入 非关系型数据库层(memcache、redis、MongoDB),降低 MySQL 压力。
  • 读写分离,读从库,写主库,i减轻主库压力。
  • 提高硬件能力。
  • 直接禁用 Slave 的binlog。
  • 禁用 log-slave-updates,从服务器 从主服务器接受的更新日志不计入二进制日志。、
  • 业务层面:强制走主库方案、根据需求适当 sleep。

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

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

相关文章

欢迎女神科学家颜宁回国,并祝她如愿以偿

目录1、女神科学家颜宁是谁2、颜宁在深圳人才论坛最新演讲,以及招聘邮箱3、颜宁微博回应4、结论与展望最近女神科学家颜宁回国了,整个科学界和中国都沸腾了,也上了热搜,成了热门话题,越来越多的海归精英选择回国 1、…

Python 和Java 哪个更适合做自动化测试?

很多小伙伴在功能测试行业工作了2、3年后,发现自己已经把功能测试做的非常好了,已经到职业发展和薪资发展的瓶颈期了,就想着学点东西,提升一下技能。 而对于功能测试升级来说,一般有这么3个主流的发展方向:…

事件/边沿检测--上升沿检测、下降沿检测

检测上升沿&#xff1a;&#xff08;从低到高的跳变 __| ) input sig_a; reg sig_a_d1; wire sig_a_risedge; alaways (posedge clk or negedge rstb) begin if(!rstb) sig_a_d1 < 1b0; else sig_a_d1 < sig_a; end assign sig_a_risedge sig_a & !sig_a_d1; …

【02】概率图模型在真实世界中的应用案例

概率图模型在真实世界中的应用案例 概率图模型有许多不同的实际应用。 为了激起大家对概率图模型的兴趣&#xff0c;也为了让大家能够对概率图模型有感性的认知&#xff0c;本章我会分享概率图模型的诸多实际应用案例。 文章目录图像中的概率模型图像生成图像修复图像降噪语言…

【Python百日进阶-WEB开发】Day171 - Django案例:03配置工程日志

文章目录八、配置工程日志8.1 目的和原因8.2 配置工程日志的步骤8.2.1 配置工程日志8.2.2 准备日志文件目录8.2.3 日志器记录器的使用8.2.4 Git管理工程日志九、配置前端静态文件9.1 准备静态文件9.2 指定静态文件的加载路径十、相关文档八、配置工程日志 8.1 目的和原因 目的…

什么是跨域?以及解决方案

现在的web项目&#xff0c;很多都是前后端分离&#xff0c;特别容易出现跨域问题 那么什么是跨域问题呢?本篇文章带你彻底从本质上弄明白什么是跨域问题以及如何解决 一、跨域有什么现象 首先我们看一下现象&#xff0c;如何出现的跨域问题。例&#xff1a; 前段&#xff1a…

【Linux】基础IO —— 上

&#x1f387;Linux&#xff1a;基础IO详解 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让…

Web渗透测试攻防之浅述信息收集

前言 众所周知渗透测试的本质是信息收集&#xff0c;在渗透测试中信息收集的质量直接关系到渗透测试成果的与否。在对系统进行渗透测试前的信息收集是通过各种方式获取所需要的信息&#xff0c;收集的信息越多对目标进行渗透的优势越有利。通过利用获取到的信息对系统进行渗透…

Java Spring Cloud XVIII 之 Kafka I

Java Spring Cloud XVIII 之 Kafka I Kafka 1.Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。Kafka最初是由LinkedIn开发&#xff0c;并随后于2011年初开源…

C++ 类和对象 (中)

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客目标&#xff1a;梳理自己六个小时学到的知识 并且将类和对象知识分享给大家 专注的去做一件事 如果累了就去休息 C 类和对象 中本章学习目标前言一. 构造函数1.1 概…

破解系统密码与重装windows系统

数据来源 一、利用5次shift漏洞破解win7密码 1.1 漏洞 1. 在未登录时&#xff0c;连续按5次shift键&#xff0c;弹出程序C:\Windows\System32\sethc.exe 2. 部分win7及win10系统在未进入系统时&#xff0c;可以通过系统修复漏洞篡改系统文件名&#xff01; 注意&#xff1a;…

使用Maven部署到远程Linux服务器Tomcat

一、安装JDK 首先给服务器安装jdk&#xff0c;访问官网下载&#xff1a;Java Downloads | Oracle&#xff0c;下载图中的版本。首先我使用的是tomcat10&#xff0c;最低支持jdk1.8。安装了jdk19&#xff0c;是当时的最新版实测tomcat开启失败&#xff0c;新版jdk也不自带jre&a…

Windows上使用QEMU创建aarch64(ARM64)虚拟机

前言 随着国产化的推进&#xff0c;现在采用ARM、MIPS的机器越来越多&#xff0c;作为开发、运维人员要调测软件总不能每种架构的机器都去买一台吧&#xff1f;主要像博主这样的穷B&#xff0c;实在也是承受不起。。 需要的工具 1、QEMU Windows版官网下载地址&#xff1a;…

软件测试最最最重要的事

软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必须包含…

Articulate360在线学习课件制作工具

Articulate是一款全新理念的在线和移动学习课件制作工具&#xff0c;可以说是目前国际上用户最广泛的e-learning课件制作工具之一。它包含了全新版的Storyline 360和Rise 360以及大量其他创作应用程序。使用Storyline 360开发可在所有设备上运行的自定义交互式课程&#xff0c;…

Java日志框架的发展历史,你不想了解一下吗

前言 相信大家在项目开发中肯定遇到过log4j&#xff0c;JUL&#xff0c;slf4j&#xff0c;logback&#xff0c;log4j2等日志框架相关名词&#xff0c;这些日志框架之间到底有什么关系&#xff0c;Java日志框架究竟经历了什么样的发展历程&#xff0c;相信有很多人都对此充满了好…

Socket 编程基础

文章目录一、socket 简介二、socket 编程接口介绍1. socket()函数2. bind()函数3. listen()函数4. accept()函数5. connect()函数6. 发送和接收函数read()函数recv()函数write()函数send()函数7. close()关闭套接字三、IP 地址格式转换函数inet_pton()函数inet_ntop()函数本篇会…

决策树与随机森林在分类预测中的应用(附源码)

写在前面 今天给大家分享一下基于决策树和随机森林在乳腺癌分类中实战。决策树和随机森林是白盒模型&#xff0c;数学建模中常用到这两种模型&#xff0c;用于预测或分类&#xff0c;随机森林还可以进行特征选择&#xff0c;故很推荐大家学习&#xff01;&#xff01;&#xff…

Qt5.14.2在Windows下使用mysql

第一步:下载依赖 1.1去Qt官方下载Qt5.14.2的源代码: Index of /archive/qt/5.14/5.14.2/singlehttps://download.qt.io/archive/qt/5.14/5.14.2/single/ 下载链接:https://download.qt.io/archive/qt/5.14/5.14.2/single/qt-everywhere-src-5.14.2.zip 1.2去Mysql官网下载Mys…

面试官:说说TCP如何实现可靠传输

今天来讲一下TCP是如何保证可靠传输的。这也是面试常问的一个题目&#xff0c;这个问题不单止能看出你是否真的了解TCP原理&#xff0c;更看出你是否有一个总结的能力。 我们从三个部分来讲TCP是如何实现可靠传输的。 滑动窗口 首先是讲TCP中的滑动窗口&#xff0c;它和TCP的…