【问题标题】:MySQL error 1236 When using GTIDMySQL 错误 1236 使用 GTID 时
【发布时间】:2016-11-18 08:21:49
【问题描述】:

我想为我的 Percona 服务器创建一个启用 GTID 的副本,但是当我显示从属状态时出现此错误:

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

通常,我会停止我的从站,重置它,重置主站(在从站上),然后从主站获取新的 GTID_PURGED 值。但是这一次,master 有一个非常不寻常的值,我不确定如何确定使用哪个值:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysqld-bin.000283
         Position: 316137263
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 1570dee1-165b-11e6-a4a2-00e081e93212:1-3537,
c73f3ee7-e8d4-ee19-6507-f898a9930ccd:1-18609,
cdb70eaa-f753-ee1b-5c95-ecb8024ae729:1-2357789559:2357789561-2357790104:2357790106-2514115701:2514115703-2514115705:2514115707-2546512667
1 row in set (0.00 sec)

从带有新备份副本的从站中,我得到了这个:

root@ubuntu:/var/lib/mysql# cat xtrabackup_binlog_info
mysqld-bin.000283       294922064       1570dee1-165b-11e6-a4a2-00e081e93212:1-3537,
c73f3ee7-e8d4-ee19-6507-f898a9930ccd:1-18609,
cdb70eaa-f753-ee1b-5c95-ecb8024ae729:1-2357789559:2357789561-2357790104:2357790106-2514115701:2514115703-2514115705:2514115707-2546400960

还有一件事,我只是在进行备份之前清除了主服务器上的二进制日志。自动二进制日志清除设置为 7 天。所以我知道这不是因为错误提示的 bin 日志已被清除。

我正在运行 Ubuntu 14:04,以及 Percona 服务器版本 5.6.31-77。

我该如何解决这个问题? master 的 GTID_PURGED 的正确值是多少?

【问题讨论】:

    标签: mysql replication percona gtid


    【解决方案1】:

    mysql 5.6 GTID 复制错误和修复 什么是 GTID? 

    4c2ad77f-697e-11e3-b2c3-c80aa9f17dc4
    
    • 这是服务器的 128 位标识号 (SERVER_UUID)。它标识交易的来源。每个服务器都有自己的 SERVER_UUID。 GTID 解决了哪些问题?

    • 可以跨复制服务器唯一地标识事务。使故障转移过程的自动化更加容易。无需进行计算,检查二进制日志等。只需 MASTER_AUTO_POSITION=1。

    • 在应用程序级别,更容易进行 WRITE/READ 拆分。在 MASTER 上写入后,您就有了 GTID,因此只需检查该 GTID 是否已在您用于读取的 SLAVE 上执行。
    • 现在开发新的自动化工具并不痛苦。 如何实施?

    复制链的所有服务器都需要三个变量

    • gtid_mode:它可以是 ON 或 OFF(不是 1 或 0)。它在服务器上启用 GTID。
    • log_bin:启用二进制日志。必须创建复制环境。
    • log-slave-updates:从服务器必须在自己的二进制日志中记录来自主服务器的更改。
    • enforce-gtid-consistency:无法以事务安全方式记录的语句被服务器拒绝。 参考:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-howto.html

    复制错误和修复:

    "'在从二进制日志中读取数据时,从主站收到致命错误 1236:"从站正在使用 CHANGE MASTER TO MASTER_AUTO_POSITION = 1 进行连接,但主站已清除包含从站需要的 GTID 的二进制日志。" slave_io 线程停止运行.

    解决方案:考虑以下是主从 UUID 的

    MASTER UUID: 4c2ad77f-697e-11e3-b2c3-c80aa9f17dc4
    SLAVE UUID: 5b37def1-6189-11e3-bee0-e89a8f22a444
    

    步骤:

    slave>stop slave;
    
    slave> FLUSH TABLES WITH READ LOCK;
    
    slave>show master status;
    
    '4c2ad77f-697e-11e3-b2c3-c80aa9f17dc4:1-83345127,5b37def1-6189-11e3-bee0-e89a8f22a444:1-13030:13032-13317:13322-13325:13328-653183:653185-654126:654128-1400817:1400820-3423394:3423401-5779965′
    
    (HERE 83345127  Last GTID executed on master and 5779965 Last slave GTID executed on Master )
    
    slave> reset master;
    
    slave>set global GTID_PURGED='4c2ad77f-697e-11e3-b2c3-c80aa9f17dc4:1-83345127,5b37def1-6189-11e3-bee0-e89a8f22a444:1-5779965′;
    
    slave>start slave;
    
    slave>unlock  tables;
    
      slave>show slave status;
    

    注意:在此之后重新启动从属链,如果它们停止复制;

    错误:查询时出现“错误“表……不存在”。默认数据库:……查询:“INSERT INTO OR Last_SQL_Error:……错误'重复条目'从属服务器上的SKIP事务(slave_sql线程停止运行)注意:

    • SQL_SLAVE_SKIP_COUNTER 不再适用于 GTID。
    • 我们需要找出导致复制失败的事务。
      • – 来自二进制日志
      • – 来自 SHOW SLAVE STATUS(已检索与已执行) 错误类型:(检查 show slave status 中的最后一个 sql 错误)

    解决方案:考虑以下是主从 UUID 的

    MASTER UUID: 4c2ad77f-697e-11e3-b2c3-c80aa9f17dc4
    SLAVE UUID: 5b37def1-6189-11e3-bee0-e89a8f22a444
    

    slave>显示从属状态;

    复制“Executed_Gtid_Set”值。 '4c2ad77f-697e-11e3-b2c3-c80aa9f17dc4:1-659731804,5b37def1-6189-11e3-bee0-e89a8f22a444:1-70734947-80436012:80436021-80437839'

    -似乎是奴隶(使用 uuid 5b37def1-6189-11e3-bee0-e89a8f22a444)事务“80437840”导致了这里的问题。

    slave> STOP SLAVE;
    
    slave> SET GTID_NEXT="5b37def1-6189-11e3-bee0-e89a8f22a444:80437840";  (last_executed_slave_gtid_on_master + 1)
    
    slave> BEGIN; COMMIT;
    
    slave> SET GTID_NEXT="AUTOMATIC";
    
    slave> START SLAVE;
    
    slave>  show slave status;
    

    一切就绪!!!

    【讨论】:

      【解决方案2】:

      #如果使用xtrabackup是主实例中的备份。

      cat xtrabackup_info | grep binlog_pos
      

      #以你提供的信息为例:

      binlog_pos = 文件名'mysqld-bin.000283',位置'294922064',上次更改的GTID '1570dee1-165b-11e6-a4a2-00e081e93212:1-3537,c73f3ee7-e8d4-ee19-6507-f898a9930ccd:1 -18609,cdb70eaa-f753-ee1b-5c95-ecb8024ae729:1-2357789559:2357789561-2357790104:2357790106-2514115701:2514115703-2514115705:2514101576

      #将上次更改的 GTID 复制到 gtid_purged

      slave>STOP SLAVE;
      slave>RESET MASTER;
      slave>SET GLOBAL gtid_purged='1570dee1-165b-11e6-a4a2-00e081e93212:1-3537,c73f3ee7-e8d4-ee19-6507-f898a9930ccd:1-18609,cdb70eaa-f753-ee1b-5c95-ecb8024ae729:1-2357789559:2357789561-2357790104:2357790106-2514115701:2514115703-2514115705:2514115707-2546400960';
      slave>change master to master_host='master ip',master_port=master port,MASTER_USER = 'Your replicate username', MASTER_PASSWORD = 'Your replicate password',master_auto_position=1; 
      slave>START SLAVE;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        相关资源
        最近更新 更多