MySql主从复制

MySql主从复制

前言

学习-》记录-》分享

MySQL 主从复制(也称 A/B 复制) 的原理

  • Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,
    这些记录叫做二进制日志事件(binary log events);

  • Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);

  • Slave 重做中继日志中的事件, 把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储, 从而实现将改变反映到它自己的数据(数据重放)。

主从配置需要注意的点

  • 主从服务器操作系统版本和位数一致;
  • Master 和 Slave 数据库的版本要一致;
  • Master 和 Slave 数据库中的数据要一致;
  • Master 开启二进制日志, Master 和 Slave 的 server_id 在局域网内必须唯一;
  • 注:MySql主从复制与Redis不同:MySQL是从接入点开始复制,而Redis则是会复制主库的所有操作。

安装mysql8.0

可以使用两台虚拟机来装mysql,也可以在同一台上装两个mysql

具体怎么装这里就不演示了

主从配置

  1. 主库配置

    [mysqld]
    
    #设置服务器id,为1表示主服务器,实例唯一ID,不能和canal的slaveId重复
    server_id=1
    #启动MySQ二进制日志系统
    log-bin=mysql-bin
    #选择STATEMENT模式 
    binlog-format=STATEMENT
    #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
    binlog-do-db=mycat_test_db
    #不同步mysql系统数据库 可以不加但是建议添加mysql系统库
    binlog-ignore-db=mysql
    

    binlog-format的三种模式:

    STATEMENT : (mysql 默认)所有的写操作记录到bin-log日志里

    ​ update xxx set xxx time = now() where name = ‘张三’

    ​ 主从运行:时间在变化所以会导致数据不一致的情况出现。

    ROW : 行模式会记录每一行的变化

    ​ update xxx set xxx time = now()

    ​ 如果更新一个表并且没有条件而这个表有15万数据,那么它就会操作15万次,会造成效率低下。

    MIXED : 会在STATEMENT 和ROW之间进行选择

    ​ MIXED 无法识别系统变量 如: @@host name

    ​ 也会造成数据不一致的情况出现。

  2. 从库配置

    [mysqld]
    #实例唯一ID,不能和canal的slaveId重复,表示为从数据库
    server-id=2
    #启动MySQL二进制日志系统
    log-bin=mysql-relay
    
    

启动

  1. 配置完,重新启动数据库服务就好。

  2. 连接主数据库,执行 show master status;

在这里插入图片描述

  1. 创建主从复制授权用户

       use mysql;
       create user 'slave(用户名)'@'%' identified by '123456(密码)';
       grant replication slave on *.*  to 'slave'@'%';
       flush privileges;
    
  2. 连接从数据库,执行:

       CHANGE MASTER TO MASTER_HOST='服务器主机地址',MASTER_USER='用户名',MASTER_PASSWORD='密码!',MASTER_LOG_FILE='binlog.000004',MASTER_LOG_POS=1076;
    

    在这里插入图片描述

    1. 开始同步
    START SLAVE; 
    

    在这里插入图片描述

    1. 查看Slave的运行状态

    2. SHOW SLAVE STATUS\G;
      

      在这里插入图片描述

测试

可以自行在主数据库创建/删除数据库,然后看看从的数据库是否有变化。

具体操作:略…

错误总结

  1. [Err] 3021 - This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL ‘’ first.

    1. 原因

      此前有执行过这个IO通道了,已经有一个io进程在执行这个通道。

    2. 解决方法

      stop SLAVE;
      reset master;
      
      CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_USER='slave',MASTER_PASSWORD='123123',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=155;
      
      START SLAVE; 
      
  2. [ERROR] Slave SQL: Slave failed to initialize relay log info structure from the repository, Error_code: 1872

    1. 原因没有指定bin-log或者bin-log被占用

    2. 在my.ini中指定bin-log就好了

      log-bin=mysql-relay
      
  3. Slave_IO_Running:Connecting ;

    1. 原因

      1.网络不通
      2.账户密码错误
      3.防火墙
      4.mysql配置文件问题
      5.连接服务器时语法
      6.主服务器mysql权限

  4. 问题原因:

    可能是主库的表,在从库中没有找到,出现这种情况可能是在创建连接同步的时候接入点没有读到见表的语句,所以就会导致从库中没有对应的表。

    MySQL 的主从复制时从接入点开始复制的,所以在接入点之前的主库的所有操作从库时不会去执行的。

    解决方法:

    1. 却啥补啥

    2. 或者执行:

      stop slave;
      set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
      start slave;
      show slave status\G;
      查看Slave_SQL_Running的值是否为yes,如果不是那么就执行多几次就好了,执行到Slave_SQL_Running为yes为止。
      
      实在不行就缺啥补啥吧!
      
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页