zoukankan      html  css  js  c++  java
  • stop slave 卡住模拟--大事务场景

    上一篇文章stop slave卡住,初步介绍了stop slave的问题现象以及一些原因。

    本文介绍另外一种情况:大事务。

    下面将演示遇到大事务时,从库stop slave卡住。

    MySQL测试集群:一主一从。

    主库、从库执行操作如下。

    1.主库数据准备

    首先,新建表

    CREATE TABLE `apple_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `a` int(11) NOT NULL DEFAULT '0' COMMENT 'a',
      `b` int(11) NOT NULL DEFAULT '0' COMMENT 'b',
      `updated_ts` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' ON UPDATE CURRENT_TIMESTAMP(6),
      `created_ts` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    

    首先插入一条记录

    > insert into apple_test(`a`, `b`) values(1,1);
    

    接着反复执行如下SQL,直到数量达到8388608

    > insert into apple_test(a, b) select a,b from apple_test;
    

    查看数量

    > select count(*) from apple_test;
    +----------+
    | count(*) |
    +----------+
    |  8388608 |
    +----------+
    1 row in set (1.87 sec)
    

    2.从库停止复制stop slave,只开启io thread

    等数据复制完成后,查看数量

    select count(*) from apple_test;
    +----------+
    | count(*) |
    +----------+
    | 16777216 |
    +----------+
    1 row in set (2.92 sec)
    

    大事务执行耗时,实际上,是SQL线程执行时的耗时。

    这里接着只开启io 线程,让后续relay log先复制到从库。

    stop slave;start slave io_thread;
    

    3.在主库上执行大事务

    再次执行

    > insert into apple_test(a, b) select a,b from apple_test limit 8388608;
    Query OK, 8388608 rows affected (1 min 20.68 sec)
    Records: 8388608  Duplicates: 0  Warnings: 0
    

    查看数量

    select count(*) from apple_test;
    +----------+
    | count(*) |
    +----------+
    | 16777216 |
    +----------+
    1 row in set (5.53 sec)
    

    4.开启复制start slave sql_thread,等待2s,接着stop slave

    启动sql线程,开始执行事务,接着等待2s,stop slave停止复制。

    > start slave sql_thread;select sleep(2);stop slave;
    Query OK, 0 rows affected (0.02 sec)
    
    +----------+
    | sleep(2) |
    +----------+
    |        0 |
    +----------+
    1 row in set (2.01 sec)
    
    Query OK, 0 rows affected (25.95 sec)
    

    可以看到,stop slave后卡住了一段时间,长度与事务大小有关,这里是约26s.

    查看数量

    select count(*) from apple_test;
    +----------+
    | count(*) |
    +----------+
    | 16777216 |
    +----------+
    1 row in set (2.92 sec)
    

    可以看到,数据插入成功,大事务已经执行完成。

    最后,start slave, stop slave都不会卡住。

    > start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    > stop slave;
    Query OK, 0 rows affected (0.01 sec)
    

    综上,从库正在执行大事务时,stop slave会卡住,等大事务执行完成后,再次stop slave不会卡住。

    Just try, don't shy.
  • 相关阅读:
    Web开发需要掌握的
    使用this关键字,构造函数的相互调用
    FCKEditor.Net在Asp.Net MVC中的配置
    技术收集
    System.Collections命名空间
    C#中的托管堆,托管
    C#中的数据类型
    sql server部分主要代码
    Visual C#常用函数和方法集汇总
    C#委托和事件
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/15113682.html
Copyright © 2011-2022 走看看