翔云

Just try, don't shy. 最新文章请点击
随笔 - 294, 文章 - 0, 评论 - 27, 阅读 - 49万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

stop slave 卡住模拟--大事务场景

Posted on   翔云123456  阅读(222)  评论(0编辑  收藏  举报

上一篇文章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不会卡住。

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示