【史上最细教程】服务器MySQL数据库完成主从复制

文章目录

  • MySQL完成主从复制教程
    • 准备:
    • 原理:
    • 步骤:
  • 推荐文章

MySQL完成主从复制教程

主从复制(也称 AB 复制)就是将一个服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)中。

可以根据配置,指定复制哪个库哪个表数据。

可以想到复制是通过异步的。

准备:

2台版本一致的服务器数据库,一台作为主库、一台作为从库

(我的两个数据库版本:5.7)

一台服务器搭建2个数据库实例教程:http://t.csdnimg.cn/aaErM

原理:

image-20231123112751434

主库一旦变更数据,就会写入二进制日志文件(Binary log),从库IO线程( I/O thread)连接到主库,读取二进制日志文件内容并写入自己的中继日志文件(Realy log),然后从库 SQL thread 定时检查中继日志 (Realy log),发现有更新的内容就自己的库执行一遍。

从服务器都会copy主服务器二进制日志的全部内容到副本,然后从服务器设备负责决定应该执行副本中的哪些语句。

步骤:

  1. 主库配置my.cnf文件指定唯一server-id

    image-20231123132152378

    [mysqld]
    ## 同一局域网内注意要唯一
    server-id=100  
    ## 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    ## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed
    
  2. 从库配置my.cnf文件指定唯一server-id

    image-20231123132213780

    [mysqld]
    ## 设置server_id,注意要唯一
    server-id=102
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    ##复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 如果需要同步函数或者存储过程
    log_bin_trust_function_creators=true
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062
    
  3. 重启3306、3307服务,使配置生效

    # 查看mysql 3306、3307进程
    root@songdanminserver:[/usr/local/mysql/3306/run]ps -ef | grep mysqld
    root      8568 25795  0 13:40 pts/0    00:00:00 grep --color=auto mysqld
    mysql    30201     1  0 Nov10 ?        00:07:13 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql
    mysql    30473     1  0 Nov10 ?        00:07:46 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql
    # 停止3306、3307进程服务
    root@songdanminserver:[/usr/local/mysql/3306/run]kill 30201
    root@songdanminserver:[/usr/local/mysql/3306/run]kill 30473
    # 查看mysql进程
    root@songdanminserver:[/usr/local/mysql/3306/run]ps -ef | grep mysqld
    root      8614 25795  0 13:41 pts/0    00:00:00 grep --color=auto mysqld
    # 查看端口占用情况是否没有3306、3307
    root@songdanminserver:[/usr/local/mysql/3306/run]netstat -ntl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::111                  :::*                    LISTEN     
    tcp6       0      0 :::8080                 :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN     
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN     
    # 重新启动3306、3307
    root@songdanminserver:[/usr/local/mysql/3306]nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql &
    [1] 9413
    root@songdanminserver:[/usr/local/mysql/3306]nohup: ignoring input and appending output to ‘nohup.out’
    ^C
    root@songdanminserver:[/usr/local/mysql/3307]nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql &
    [2] 9457
    root@songdanminserver:[/usr/local/mysql/3307]nohup: ignoring input and appending output to ‘nohup.out’
    ^C
    root@songdanminserver:[/usr/local/mysql/3306]
    
    # 查看mysql 3306、3307进程
    root@songdanminserver:[/usr/local/mysql/3307]ps -ef | grep mysqld
    mysql     9413 25795  0 13:52 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql
    mysql     9559 25795  1 13:54 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql
    root      9608 25795  0 13:54 pts/0    00:00:00 grep --color=auto mysqld
    
  4. 登录主库,授予从库连接主库,并复制主库数据的权限,刷新权限生效

    # 登录主库3306
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3306
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 5.7.36-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    # 授予从库3307的root用户在指定从库ip上从主库复制所有库、所有表数据的权限
    mysql> grant replication slave, replication client on *.* to 'root'@'你的从库服务器ip' identified by '你的从库root用户密码';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    # 刷新权限
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    # 查看MySQL现在有哪些用户及对应的IP权限,可以看到你刚授权的从库user,host
    mysql> select user,host from mysql.user;
    +---------------+--------------+
    | user          | host         |
    +---------------+--------------+
    | root          | %            |
    | root          | 121.41.59.91 |
    | mysql.session | localhost    |
    | mysql.sys     | localhost    |
    +---------------+--------------+
    4 rows in set (0.00 sec)
    
    # 查看主库3306的binlog文件名和位置
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      612 |              | mysql            |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  5. 登录从库,连接主库,指定主库ip、主库为从库连接所创建的用户、密码、从库从主库哪个二进制文件的哪里开始读取数据等

    # 登录从库3307
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3307
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.36-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    # 配置连接主库3306
    # change master to master_host='主库服务器ip', master_user='root(上一步主库授权从库能进行复制的用户)', master_password='123456(上一步主库授权从库能进行复制的密码)', master_port=3306(主库端口), master_log_file='mysql-bin.000002(上一步查看到的主库日志文件名称)',master_log_pos=2079(上一步查看到的主库日志文件位置);
    mysql> change master to master_host='121.41.53.91', master_user='root', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003',master_log_pos=612;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
  6. 从库启动主从复制,查看是否连接主库成功

    # 启动从库复制主库
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    # 查看主从复制状态,查看Slave_IO_Running、Slave_SQL_Running 是否为yes
    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 121.41.53.91  # 绑定的主库ip
                      Master_User: root	# 主库用户
                      Master_Port: 3306	# 主库端口
                    Connect_Retry: 60	
                  Master_Log_File: mysql-bin.000003 # 主库同步日志,从这读取主库数据
              Read_Master_Log_Pos: 612
                   Relay_Log_File: edu-mysql-relay-bin.000002 # 从库中继日志
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000003
                 Slave_IO_Running: Yes   # 这里是yes 说明复制成功
                Slave_SQL_Running: Yes	 # 这里是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: 612
                  Relay_Log_Space: 531
                  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: 100
                      Master_UUID: cfb53930-7fa2-11ee-8ea9-00163e2859d2
                 Master_Info_File: /usr/local/mysql/3307/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)
    
    # 停止从库复制主库
    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
    
    
  7. 测试主从复制是否成功,在主库建表,插入数据,查看从库是否也有

    在主库执行操作:

    • 新增库
    • 新增表
    • 新增数据
    • 修改数据
    • 删除数据

    查看从库3307是否发生变化

    # 进入主库3306
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3306
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 5.7.36-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    # 新建数据库 my_test
    mysql> create database my_test;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use my_test;
    Database changed
    mysql> CREATE TABLE test (
        ->   id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        ->   name VARCHAR(30) NOT NULL,
        ->   email VARCHAR(50) NOT NULL,
        ->   reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        -> );
    Query OK, 0 rows affected (0.01 sec)
    # 插入初识数据
    mysql> INSERT INTO test (name, email)
        -> VALUES ('John Doe', 'john@example.com');
    Query OK, 1 row affected (0.00 sec)
    
    # 查看从库变化
    

    image-20231123160935413

注意:如果出现从库复制失败没有效果时候,从库重新绑定主库(执行6)

造成这类问题的原因一般是在主从复制的时候,基于创建表,然后又去删除和操作了数据表或者表。

推荐文章

【史上最细教程】一台服务器上搭建2个MySQL实例

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

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

相关文章

windows根据已有的安卓签名文件获取MD5签名

windows根据已有的安卓签名文件获取MD5签名 0 现状 uniapp 本机号码一键登录需要MD5的,现有的签名文件但是只有SHA1和SHA256 查看SHA1和SHA256 keytool -list -v -keystore [你的.keystore文件]1 前提 已有生成签名文件的环境 搭建Openssl环境,设置…

Spring框架学习 -- 读取和存储Bean对象

目录 🚀🚀 回顾 getBean()方法的使用 根据name来获取对象 再谈getBean() (1) 配置扫描路径 (2) 添加注解 ① spring注解简介 ② 对类注解的使用 ③ 注解Bean对象的命名问题 ④ 方法加Bean注解 (3) Bean 注解的重命名 (4) 获取Bean对象 -- …

Linux---常用命令汇总

文章目录 关于目录操作的命令ls/llcdpwdmkdir 关于文件操作的命令touchechocatrmmvcpvim 关于查询操作的命令greppsnetstat 关于目录操作的命令 ls/ll ls : 列出当前目录下的目录和文件(以行的展示形式) ll : 列出当前目录下的目录和文件&…

如何正确接入API接口通过淘宝商品ID和sku ID获取到淘宝商品SKU信息接口,可获取sku价格,sku销量,sku图片及sku库存参数等

接入API接口的正确方式可能因API的具体要求而有所不同,但一般来说,以下是一些通用的步骤: 获取API文档:API文档通常包括API的请求方式、请求参数、响应格式等信息。您需要仔细阅读文档,了解API的具体要求和使用方式。…

构建个性化预约服务:预约上门服务系统源码解读与实战

随着社会的发展,预约上门服务系统在满足用户需求、提升服务效率方面发挥着越来越重要的作用。在本文中,我们将深入研究预约上门服务系统的源码,通过实际的技术代码示例,揭示系统内部的关键机制,以及如何在实际项目中应…

mybatis 语法使用各种踩坑(持续更新中。。。)

1、大小写命名:这个别说了,都是泪。 2、联表查询查询,多条合成一条,不生效的原因 博主各种检查关联关系和字段大小写,本来是4条数据最后合成一条数据,死活给你直接返回了4条数据,而且每个类似p…

四肽-3——增加皮肤光滑度、紧致度,让肌肤看起来更年轻

Caprooyl四肽-3,也称为KGHK Caproic acid,是一种基于TGF-(转化生长因子β)的仿生脂肽结构,在细胞外基质成分的自然产生中发挥重要作用。肽序列是Lys-Gly-His-Lys。它可以减少细纹和皱纹的出现,提高皮肤弹性…

万宾科技智能井盖传感器效果,特点有哪些?

现在城市发展越来越好,对基础设施的改造越来越多,比如修路搭桥、整改生态等都是为民服务的好工程。平时走在路上我们享受着平整的路面,井然有序的交通也为我们带来很大的方便。但是一个又一个的井盖看起来无关紧要,实际上如果路上…

shell循环语句 for while until

目录 什么是循环语句 概念 for循环 格式 while循环 格式 until 循环 格式 实验 for (1)计算1到100的和 ​编辑 (2)100以内的偶数 (从0开始到100结束,每次加2步 打印的都是偶数) &…

maxwell采集数据到kafka报错

问题: 启动maxwell后出现数据更新后就出现以下报错。 13:29:14,727 ERROR MaxwellKafkaProducer - TimeoutException Position[BinlogPosition[binlog.000002:12215591], lastHeartbeat1700717043797] -- maxWellData: medical:consultation:[(id,212)] 13:29:14,7…

DNS协议、ICMP协议、NAT技术

文章目录 一.DNS协议1.DNS背景2.域名简介3.域名解析过程4.使用dig工具分析DNS过程 二.ICMP协议1.ICMP功能2.ICMP协议格式3.ping命令4.一个值得注意的坑5.traceroute命令 三.NAT技术1.NAT技术背景2.NAT IP转换过程3.NAPT4.NAT技术的缺陷5.NAT和代理服务器 四.网络协议总结1.应用…

微信运营神器:从群发到批量添加,让你的微信营销更轻松

在这个数字化时代,微信已经成为了我们生活中不可或缺的一部分。对于许多企业和个人来说,微信营销也是非常重要的一部分。但是,微信营销并不是一件容易的事情,需要花费大量的时间和精力。为了解决这个问题,今天我们将向…

C语言——接受一个整形值(无符号),使用函数的递归,按照顺序打印他的每一位。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void print(int n) {if(n>9){print(n/10);}printf("%d ",n%10); }int main() {unsigned int num 0;scanf("%d", &num);print(num);return 0; }

JavaScript 如何拷贝对像(Object)或者数组(Array)

目录 JavaScript数据拷贝类型 浅拷贝 深拷贝 举例&#xff1a; 浅拷贝 数组 对象 深拷贝 lodash cloneDeep使用示例 自定义深拷贝方法示例 JSON.parse() 和 JSON.stringify()使用示例 JavaScript数据拷贝类型 浅拷贝 数组可以使用Array.prototype.slice()方法 …

高通Camera HAL3: CamX、Chi-CDK要点

目录 一、概述 二、目录 三、CamX组件之前的关系 一、概述 高通CamX架构是高通实现的相机HAL3架构&#xff0c;被各OEM厂商广泛采用。 二、目录 代码位于vendor/qcom/proprietary下&#xff1a; camx&#xff1a;通用功能性接口的代码实现集合chi-cdk&#xff1a;可定制化…

排查光模块故障原因,少不了这2条命令!

光模块故障定位常用命令 根据光模块的告警信息查找故障原因&#xff1a; display interface transceiver查看光模块光功率是否正常 display interface transceiver verbose根据光模块的告警信息查找故障原因 执行命令display interface transceiver查看“Alarm information”…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区联动地址选择器组件(上)

目录 概述 云数据库开发 一、创建云数据库的对象类型。 二、预置数据&#xff08;为对象类型添加数据条目&#xff09;。 三、部署云数据库 云函数实现业务逻辑 一、创建云函数 二、云函数目录讲解 三、创建resources目录 四、获取云端凭据 五、导出之前创建的元数据…

redis之cluster集群

1、redis-cluster集群&#xff1a;redis3.0引入的分布式存储方案 2、集群&#xff1a;由多个node节点组成&#xff0c;redis数据分布在这些节点之中 &#xff08;1&#xff09;在集群之中也分主节点和从节点 &#xff08;2&#xff09;自带哨兵模式 3、redis-cluster集群的…

thinkphp6 不支持:redis错误

起因&#xff1a; 使用 redis 时候&#xff0c;thinkphp 报错。 解决方法&#xff1a; 打开 php.ini 文件&#xff0c;增加 extensionphp_redis.dll 即可

「 系统设计 」 为什么要做架构分层?

「 系统设计 」 为什么要做架构分层&#xff1f; 参考&鸣谢 3.设计模式之分层思维&#xff1a;为什么要做代码分层架构&#xff1f; 从零开始学架构&#xff08;八&#xff09;分层架构和设计模式 架构模式之分层架构总结 文章目录 「 系统设计 」 为什么要做架构分层&…