本文作者:kris

MySQL锁阻塞的深入分析-mysql 阻塞

kris 2025-01-19 23:36:05 2
MySQL锁阻塞的深入分析-mysql 阻塞摘要: MYSQL所在机器磁盘满了以后,写入数据库会阻塞吗?当磁盘空间写满了之后,MySQL是无法再写入任何数据的,包括对表数据的写入,以及binlog、binlog-index等文件。当...

MYSQL所在机器磁盘满了以后,写入数据库会阻塞吗?

当磁盘空间写满了之后,MySQL是无法再写入任何数据的,包括对表数据的写入,以及binlog、binlog-index等文件。

当然了,因为InnoDB是可以把脏数据先放在内存里,所以不会立刻表现出来无法写入,除非开启了binlog,写入请求才会被阻塞。

当MySQL检测到磁盘空间满了,它会:

每分钟:检查空间是否得到释放,以便写入新数据。当发现有剩余空间了,就会继续写入数据,一切照旧。

每十分钟:如果还是发现没剩余空间,则会在日志中写入一条记录,报告磁盘空间满(这时候只写入几个字节还是够的)。

应该怎么办

那么,当发现磁盘空间满了之后,我们应该怎么处理呢,建议:

提高监控系统检测频率,预防再次发生;

MySQL锁阻塞的深入分析-mysql 阻塞

图片来源:网络

及时删除不用的文件,释放空间;

若有线程因磁盘满的问题被阻塞了,可先杀掉,等到下一分钟重新检测时它可能又可以正常工作了;

可能因磁盘满导致某些线程被阻塞,引发其他线程也被阻塞,可把导致阻塞的线程杀掉,其他被阻塞的线程也就能继续工作了。

例外

有个例外的情况是:

当执行 REPAIR TABLE 或者 OPTIMIZE TABLE 操作时,或者执行完 LOAD DATA INFILE 或 ALTER TABLE 之后批量更新索引时,这些操作会创建临时文件,当执行这些操作过程中mysqld发现磁盘空间满了,就会把这个涉及到的表标记为crashed,删掉临时文件(除了 ALTER TABLE 操作,MySQL会放弃正在执行的操作,删除临时文件,释放磁盘空间)。

备注:当执行这些命令过程中mysqld进程被意外被杀掉的话,其所生成临时文件不会自动删除,需要手工删掉才能释放磁盘空间。

何时使用分布式消息队列?

就我的认知来看,消息队列目前有几类用途。

1.消除峰值,控制流速

比如这样一个场景,今日头条的百万答题,在结束之后需要分钱,分钱就需要写库。而你的mysql只允许你以300每秒写入,这时候消息队列是一个好的办法

2.离线计算

日志分析,图像处理,这些属于这类应用。

比如你想你能够根据web站点的日志做监控,这时候在不影响web服务的前提下,你可以定时通过消息队列传送日志流

3.解耦

想象一个用户上传图像的服务,用户只是想上传到空间,但是你需要加水印。如果加水印和用户记录在一起,会很慢。所以常见的做法是web服务接受图片,通过消息队列转发给水印服务,web服务本身不会阻塞住。

你所说的分布式队列,只是为了适应大吞吐的消息队列的优化实现,作用无非这几种。

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/24994.html发布于 2025-01-19 23:36:05
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享