MySQL-运维篇-主从复制

温馨提示:建议在PC端浏览~

  • 主从复制

    • 概述

      • 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
      • MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
      • 主库称为Master,从库称为Slave。
      • MySQL复制的优点主要包含以下三个方面:
        • 1、主库出现问题,可以快速切换到从库提供服务。
        • 2、实现读写分离,降低主库的访问压力。
        • 3、可以在从库中执行备份,以避免备份期间影响主库服务。
    • 原理

      • MySQL的主从复制原理如下:
          • 从上图来看,复制分成三步:
            • Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
            • 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log。
            • slave重做中继日志中的事件,将改变反映到它自己的数据。
    • 搭建

      • 服务器准备

        cmd 复制代码
          # 开放指定的3306端口号(生产中):
          firewall-cmd --zone=public --add-port=3306/tcp --permanent
          firewall-cmd --reload
          
          # 关闭服务器的防火墙(练习时,简单):
          systemctl stop firewalld
          systemctl disable firewalld
        • 准备好两台服务器之后,在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备工作。
      • 主库配置

        • 1、修改配置文件/etc/my.cnf

          cmd 复制代码
            #mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,默认为1
            server-id=1
            #是否只读,1代表只读,0代表读写
            read-only=0
            #忽略的数据,指不需要同步的数据库
            #binlog-ignore-db=mysql
            #指定同步的数据库
            #binlog-do-db=db01
        • 2、重启MySQL服务器

          cmd 复制代码
            systemctl restart mysqld
        • 3、登录mysql,创建远程连接的账号,并授予主从复制权限

          sql 复制代码
            #创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
            CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
            
            #为'itcast'@'%'用户分配主从复制权限
            GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
        • 4、通过指令,查看二进制日志坐标

          sql 复制代码
            show master status;
            • 字段含义说明:
              • file:从哪个日志文件开始推送日志文件
              • position:从哪个位置开始推送日志
              • binlog_ignore_db:指定不需要同步的数据库
      • 从库配置

        • 1、修改配置文件/etc/my.cnf

          cmd 复制代码
            #mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,和主库不一样即可
            server-id=2
            
            #是否只读,1代表只读,0代表读写
            #(注意,这里的读写权限只针对于普通用户,即使将read-only设置为1,超级管理员还是可以进行读写操作的,
            #要禁止超级管理员的写权限,需要单独设置super-read-only=1)
            read-only=1
        • 2、重新启动MySQL服务

          cmd 复制代码
            systemctl restart mysqld
        • 3、登录mysql,设置主库配置

          sql 复制代码
            CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx.xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;
          • 上述是8.0.23及其之后版本的语法。如果mysql是8.0.23之前的版本,执行如下SQL:

            sql 复制代码
              CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;
          • 参数说明:

        • 4、开启同步操作

          sql 复制代码
            start replica;		#8.0.22之后
            start slave;		#8.0.22之前
        • 5、查看主从同步状态

          sql 复制代码
            show replica status;		#8.0.22之后
            show replica status\G;		#将每一列数据转化为每一行来展示(便于查看)
            
            show slave status;			#8.0.22之前
            • 参数说明:
              • 只要Replica_IO_Running和Replica_SQL_Running都为Yes,就说明主从复制状态是正常的。
              • Replica_IO_Running:指主从复制的那一组IO线程是否运行正常。IO线程用于读取主库的二进制日志,并将其写入自身的中继日志。
              • Replica_SQL_Running:指主从复制的那一组SQL线程是否运行正常。SQL线程用于读取自身的中继日志,并将数据反映到自身变化。
    • 测试

      • 1、在主库上创建数据库、表,并插入数据

        sql 复制代码
          create database db01;
          use db01;
          create table tb_user(
              id int(11) primary key not null auto_increment,
              name varchar(50) not null,
              sex varchar(1)
          )engine=innodb default charset=utf8mb4;
          insert into tb_user(id,name,sex) values(null,'Tom','1'),(null,'Trigger','0'),(null,'Dawn','1');
      • 2、在从库中查询数据,验证主从是否同步

    • 注意:前面所演示的主从复制是从二进制日志的当前位置往后进行主从复制,如果需要把主库之前的数据也同步到从库,可以先把主库的数据导出到一个SQL脚本中,然后在从库中执行这个SQL脚本,这样就可以保证主库与从库的初始数据一致,最后再从当前位置往后进行同步。

相关推荐
Wzx1980122 小时前
MySQL什么时候索引失效反而提升效率?
数据库·mysql
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第71题】【Mysql篇】第1题:索引是什么?
java·开发语言·b树·mysql·面试
AC赳赳老秦3 小时前
OpenClaw碎片时间利用:设置轻量化自动化任务,高效利用职场碎片时间
java·大数据·运维·服务器·数据库·自动化·openclaw
5201-3 小时前
向量数据库在 NPU 上的加速
数据库·pytorch·python
sukioe3 小时前
Linux RPM 方式安装 MySQL 8.0
linux·mysql·adb
worm小虫3 小时前
这场劫难,从一份等保报告开始——一件运维的小事SSH升级
运维
arbitrary193 小时前
自动化业务通报系统实现
大数据·数据库·python·jupyter
JAVA学习通3 小时前
《大营销平台系统设计实现》 - 营销服务 第8节:抽奖规则树模型结构设计
运维·决策树·docker·容器·责任链模式
Keano Reurink3 小时前
长尾关键词自动化扩展:从1个种子词到1000个长尾词
运维·windows·自动化