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

相关推荐
A.说学逗唱的Coke6 小时前
【大模型专题】向量数据库深度解析:从原理到实战,构建企业级 AI 知识检索底座
数据库·人工智能
果丁智能6 小时前
智能锁赋能网约房民宿数字化管控:身份核验+远程授权,筑牢安全防线、降本增效
网络·数据库·人工智能·安全·智能家居
杨浦老苏7 小时前
家庭实验室监控仪表盘HomeLab-Monitor
运维·docker·监控·群晖
无敌的牛7 小时前
redis学习过程
数据库·redis·学习
回忆2012初秋7 小时前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
IT北辰7 小时前
神通数据库管理系统V7.0.251210 for Windows(x86 64bit)安装部署
数据库·神通
北顾笙9807 小时前
MySQL-day2
数据库·mysql
Demons_kirit8 小时前
新项目如何连接上自己本地的数据库
数据库
Urbano8 小时前
工装外套全制作流程、工序痛点及自动化设备升级方案
运维·自动化
映翰通朱工8 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器