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

news2024/11/15 21:56:23

文章目录

  • 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实例

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

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

相关文章

云安全之盾:ZStack 云主机安全防护解决方案全方位保护云环境

随着云计算的蓬勃发展,网络威胁愈发复杂,涵盖了从勒索病毒到APT攻击的各种威胁类型。在这一风云变幻的网络安全环境下,云主机安全不再仅仅是一个选项,它是信息系统安全的核心要素。云轴科技ZStack 云主机安全防护解决方案是为了满…

java项目之品牌银饰售卖平台(ssm+vue)

项目简介 主要功能包括首页、个人中心、用户管理、促销活动管理、饰品管理、我的收藏管理、系统管理、订单管理等。管理员模块: 管理员可以查询、编辑、管理每个用户的信息和系统管理员自己的信息,同时还可以编辑、修改、查询用户账户和密码,以及对系统…

项目管理套路:看这一篇绝对够用❤️

写论文必不可少的,就是创建代码并进行实验。好的项目管理可以让实验进行得更加顺利。本篇博客以一次项目实践为例,介绍项目管理的方法,以及可能遇到的问题,并提供一些可行的解决方案。 目录 项目管理工具开始第一步版本管理十分关…

微信小程序:This Mini Program cannot be opened as your Weixin version is out-of-date.

项目场景: 问题描述 升级基础库3.2.0,然后PC端整个小程序都打不开了,点击小程序提示”This Mini Program cannot be opened as your Weixin version is out-of-date. Update Weixin to the latest version.“,并且点击Update Wei…

成为AI产品经理——模型构建流程(下)

目录 1.模型训练 2.模型验证 3.模型融合 4.模型部署 上节课我们讲了模型设计、特征工程,这节课我们来讲模型构建剩下的三个部分:模型训练、模型验证和模型融合。 1.模型训练 模型训练就是要不断地训练、验证、调优直至让模型达到最优。 那么怎么达…

Linux系统装宝塔面板提示磁盘空间不足如何清理,检测到当前磁盘超过80%,空间不足如何清理

Linux系统装宝塔面板提示磁盘空间不足如何清理,检测到当前磁盘超过80%,空间不足如何清理 今天登陆服务器查看到磁盘空间满,如题这部分属于运维问题,如果直接点击 如何直接点立即清理会跳转企业版购买,1599CNY对普通用…

如何做一个简单的深度集成学习框架

使用同一个框架,独立在一个数据集上面,分别训练多次,每个单独模型训练超参数可以一样,也可以不一样,最后若干个训练好的独立模型在测试集数据上面做最后集中决策。 实例代码如下: class MyEnsemble(nn.Modu…

CVE-2023-6099:优卡特脸爱云一脸通智慧管理平台SystemMng.ashx接口未授权漏洞复现

文章目录 优卡特脸爱云一脸通智慧管理平台未授权SystemMng.ashx接口漏洞复现(CVE-2023-6099) [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 优卡特脸爱云一脸通智慧管理平台未授权…

eNSP-远程登陆实验

实验拓扑: 实验需求: 1. 如图所示,配置设备名称和IP地址 2. 配置R2的远程登录vty接口0-4,完成以下需求: 1)采用接口password的验证方式,口令为"spoto"(不含引号&#xf…

为何越来越多的程序员纷纷转行网络安全?

目前,我国IT行业的人才结构不断升级,公司对程序员的要求越来越高,出现了大量的裁员现象,导致很多的程序员纷纷想转行的想法。 可能对于早期的程序员而言,学好编程语言就能找到比较好的工作。而现在伴随着互联网的不断发…

美国大学陪读签证申请条件是什么?

美国大学陪读签证是留学生的家庭成员在美国陪同留学生就读期间的签证类型。申请该签证需要满足一定的条件,这些条件通常包括: 1.申请人身份关系证明:申请人必须是留学生的家庭成员,如配偶或子女,需要提供证明文件&…

Lua脚本解决redis实现的分布式锁多条命令原子性问题

线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删除锁,但是此时他的锁到期了,那么此时线程2…

【深度学习实验】图像处理(一):Python Imaging Library(PIL)库:图像读取、写入、复制、粘贴、几何变换、图像增强、图像滤波

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 安装 PIL 库1. 图像读取和写入a. 图像读取b. 图像写入c. 构建新图像 2. 图像复制粘贴a. 图像复制b. 图像局部复制c. 图像粘贴 3. 几何变换a. 图像调整大小b. 图像旋转c. 图像翻转 4. 图像增强a.…

QGIS之二十五两个面图层数据中选择图形完全一致的数据

效果 步骤 1、准备数据 2、按位置选择 在Qgis工具箱中搜索"按位置选择"工具 选择要素和比较要素根据实际选择 运行 3、结果

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-3:任务切换)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。 注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

WorkPlus解放企业应用开发,实现跨平台无缝切换

在移动应用的快速发展时代,企业对于自主开发和应用平台替换的需求日益增长。WorkPlus作为一个完整的移动数字化APP底座,为企业提供了独立自主的应用开发环境,实现了平台无关性和应用解耦。今天,我们将深入探讨WorkPlus在企业应用开…

基于 Flink SQL 和 Paimon 构建流式湖仓新方案

本文整理自阿里云智能开源表存储负责人,Founder of Paimon,Flink PMC 成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为四部分: 数据分析架构演进介绍 Apache PaimonFlink Paimon 流式湖仓流式湖仓Demo演示 数据分析架构演进 …

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道,指针变量也是变量,它也有自己的地址,使用什…

TypeError: Cannot read property ‘sendpost‘ of undefined

箭头函数指向问题,定义let that this 解决

【外贸商机篇】黑色星期五来啦,跨境电商必备手册!

黑色星期五是每年11月的第四个星期五,三天后是网络星期一。这两个购物日是美国一年中最繁忙的购物日之一,仅在2021年的感恩节周末,电子商务收入估计就达到196亿美元。 在一项Statista调查中,美国消费者被问及他们计划购买哪些商品…