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脚本,这样就可以保证主库与从库的初始数据一致,最后再从当前位置往后进行同步。

相关推荐
wei_shuo3 小时前
KES 扩展与插件开发实战:自定义函数、触发器与第三方插件集成
数据库·kes
weixin_471383033 小时前
Docker - 05 - 构建流程
运维·docker·容器
风中芦苇啊4 小时前
从直接生成到受控配置:新一代图表Agent的SQL安全生成范式
数据库·sql·安全
吴声子夜歌4 小时前
SQL进阶——窗口函数
数据库·sql
周杰伦的稻香4 小时前
MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER
数据库·mysql
动恰客流统计4 小时前
客流统计如何结合AI分析?从传统计数到智能决策的技术升级路径
数据库·人工智能·边缘计算
夏玉林的学习之路4 小时前
如何远程连接服务器
运维·服务器
宠友信息5 小时前
多端数据互通场景下Spring Boot仿小红书源码结构设计
数据库·spring boot·redis·缓存·架构
风曦Kisaki5 小时前
#Linux数据库管理Day06:主从同步与MaxScale读写分离
linux·运维·数据库
影寂ldy5 小时前
C# try-catch 异常处理全套笔记
服务器·数据库·c#