Mysql主从复制

刚处理完“挖矿”事件,在做最后一个MySQL NBU备份的时候,发现从库有问题,好奇的是怎么主从状态异常没有告警呢?先不管这么多了,处理了这个问题再完善告警内容。

主从复制:MySQL5.6开始主从复制有两种方式:基于日志(binlog);基于GTID(全局事务标示符);

一、错误信息

1》基于日志(binlog)主从复制原理:

从库show slave status G看到的错误信息如下:

    Mysql的Replication是一个异步复制的过程,从一个Mysql instace(我们称成之为:Master)复制另外一个Mysqlinstance(我们称为slave),在Master与 slave     之间实现整个复制的过程是由**三个线程来完成的,其中两个线程(sql线程和IO线程)在Slave端,另外一个线程(IO线程0在Master端.)要实MysqlReplication
   首先必须打开Master端的Binary Log(就是打开bin-log功能)否则无法实现,整个的复制过程实际上就是Slave从Master端获取binlog日志然后再slave端顺序执    行日志中所有的记录及各种操作;

Slave_IO_Running: No
Slave_SQL_Running: Yes
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin.000081' at 480141113, the last event read from './mysql-bin.000081' at 4, the last byte read from './mysql-bin.000081' at 4.'

  Mysql复制基本过程如下:
    1> Slave上面的IO线程连接上Master,并且请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
    2>Master接收到来自Slave的IO线程请求后,通过负责复制的IO线程根据请求的信息指定日志指定位置后的日志信息,返回给Slave端的IO线程,返回的信                   息当中除了日志所有包含的信息外,还包括本次返回信息在Master段的Binary log(二进制)文件名称以及Binary log(二进制)的位置.
    3>Slave的IO 线程接收到master返回的信息后,将接收到的日志内容一次写入slave端的Relay log中继日志文件,(mysql-relay-bin.xx)的最末端,并且将                     读取到的Master端的bin-log的文件和位置记录,纪录到 master-info文件当中,以方便下一次读取的时候能够清楚的告诉Master 我需要从某个bin-lo
                   g的哪个位置开始往后的日志内容,请发给我;
    4>Slave的SQL线程检测到Relay Log中心增加了内容后,会马上解析Master 二进制日志文件中的内容执行里面的Query语句;**

二、错误原因

                太阳集团所有网址16877 1

这里看到从库的io_thread已经终止,错误编号是1236,具体是由于读取主库的binlog日志位置(the first event 'mysql-bin.000081' at 480141113, the last event read from './mysql-bin.000081' at 4)不对导致主从失败建立失败。

2》主从环境

三、解决方案

   Master IP: 192.168.1。106
     Slave IP: 192.168.1。110
        在Master和Slave上安装Mysql
3》
Master(主)操作

1.检查从库状态以及读取、执行的binlog信息

    # : vim /etc/my.cnf
    #log_slave_updates 注释掉这行
    server-id=1 将id号改为1
    #mysql –uroot –p –h localhost
    mysql>grant replication slave on
.* to 'admin'@'192.168.1.106' identified by '123456'; #给13slave进行授权复制
    mysql>flush tables with read lock;
    mysql>show master status;*

mysql> show slave status G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: xx.xx.xx.xx
                  Master_User: username
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000081
          Read_Master_Log_Pos: 480141113
               Relay_Log_File: mysql9017-relay-bin.000163
                Relay_Log_Pos: 480141259
        Relay_Master_Log_File: mysql-bin.000081
             Slave_IO_Running: No
            Slave_SQL_Running: 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: 480141113
              Relay_Log_Space: 480141462
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin.000081' at 480141113, the last event read from './mysql-bin.000081' at 4, the last byte read from './mysql-bin.000081' at 4.'
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 17
1 row in set (0.00 sec)

                 太阳集团所有网址16877 2

2.查看主库的binlog内容

                mysql>unlock tables;

[太阳集团所有网址16877,backup]# mysqlbinlog  mysql-bin.000081 >mysql-bin.log

4》Slave(从)操作

太阳集团所有网址16877 3

  #:vim /etc/my.cnf
  server-id=2 #将server_id改为2
  #mysql –uroot –p –h localhost
  mysql>stop slave;
  mysql>change master to
  master_host='192.168.100.160',
  master_user='admin',
  master_password='123456',
  master_log_file='masterlog.000001',
  master_log_pos=120;
  mysql>start slave;
  mysql>show slave statusG;

看到主库binlog日志mysql-bin.000081最大的pos为480140557,但从库要读取的是'mysql-bin.000081' at 480141113,显然从库要读的pos值比主库本身存在的pos值大,导致读取不到,进而失败。

***           排错:
    如果show slave statusG;报错是因为没有找到正确的端口号,则可以在这个直接添加定义
    master_port=3306,

可通过下面语句查看binlog的pos信息和日志内容
mysql> show binlog events in  'mysql-bin.000081' from 480140557 limit 10;       
Empty set (0.04 sec)
3.更改从库的同步位置,完成数据重新同步

  检查从服务器复制功能状态:  排错:
    如果show slave statusG;报错是因为没有找到正确的端口号,则可以在这个直接添加定义
    master_port=3306,

 主库:

  检查从服务器复制功能状态:***

mysqlbinlog  mysql-bin.000082  |more

           太阳集团所有网址16877 4

从库:

                      注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

change master to master_host='xx.xx.xx.xx',master_user='username',master_port=3306,master_password='password',master_log_file='mysql-bin.000082',master_log_pos=4;

5》测试数据同步

start slave;

***  1>在Master创建一个库表插入一条数据
    #mysql –uroot –p –h localhost
    Mysql->create database zytest;
    Mysql->create table aa(
    User_id int,
    User_name varchar(10));
    Mysql->inster into aa values(‘11’,’alvin’);

show slave status G

  2>在从上查看同步情况
    #mysql –uroot –p –h localhost
    Mysql->show slave statusG;
    Mysql->show databases;***

本文由太阳集团所有网址16877发布于太阳集团城网址送彩金,转载请注明出处:Mysql主从复制

您可能还会对下面的文章感兴趣: