关于删除MySQL Logs的问题记录

  五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住。

  今天尝试着重现了此问题,这里简要分析下原因。

  重现步骤:

  1. 构造slow log (将long_query_time设成了0);

  2. 观察删rm slow log瞬间,tps/qps变化;

  3. 观察执行flush slow logs瞬间,tps/qps变化;

  4. 记录flush slow logs执行时, pstack打出的调用栈情况;

  第一步,没啥好说的。

  第二步,tps/qps没啥变化。

  第三步,会发现tps/qps瞬间跌0,如下所示:

  mysql命令行会发现,flush slow logs执行时间刚好为3s左右。

  第四步,我们看下pstack的输出结果,只记录相关的:

  会发现">Thread 2在执行flush slow logs操作,其他的线程都在等待锁LOCK_log上边。

  背后的原因其实很简单,在shell中执行rm slow log操作时,由于mysqld仍有文件句柄打开此文件,所以实际上此时文件并未删除。执行flush logs操作,其实际执行的是1)close;2)open 操作(logger.flush_slow_log -> mysql_slow_log.reopen_file),在close操作执行时,文件系统真正删除文件,此时该线程占用着LOCK_log锁。

  删除时会执行刷脏(当然我构造这个场景很极端,基本所有slow log文件的内容都在文件系统缓存中),这个会很耗时间,比如我执行这个语句耗了3s。此时间段内,如果连接发来的语句需要记log(server层的log:slow log/binlog/general log共有LOCK_log这把锁)就会处于等待状态,那么系统对外的反应就是hang住了。

  flush slow logs中调用执行的close所需时间和文件大小、以及文件系统缓存中该文件脏页比例都有关系,比如我在执行flush slow logs前使用sysctl vm.drop_caches=3清空

  了文件系统缓存的话,同样大小的flush slow logs操作执行时间是0.42s,相应的阻塞时间也会减少不少。

  可以考虑在slow logs的文件句柄上执行posix_fadvise调用,促使不会缓存很大的log文件内容(slow log也没啥需要缓存的),这有篇霸爷的文章,可以参考下 posix_fadvise清除缓存的误解和改进措施 。

  另外,peter在07年就讨论过这个问题, Be careful rotating MySQL logs 其给出的建议是先mv file,然后flush logs,再执行删除文件的操作,让真正的删除行为由自己而不是mysqld完成。比较遗憾的是,七年过去了,LOCK_log这把锁的问题还没有完整的解决掉。

  PS:

  文章结尾记一点备忘,通过close/rm操作删除一个10G大小的文件,在执行sysctl vm.drop_caches=3清空缓存后,此操作的耗时仍在百毫秒量级(我的机器上是200ms+),其背后做了什么事情还需要找内核组的同事了解下。

时间: 2024-11-03 14:12:46

关于删除MySQL Logs的问题记录的相关文章

删除MySQL重复数据

原文:删除MySQL重复数据 删除MySQL重复数据 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据.因为在采集中,对于同一台设备,同一个时间点应该只有一个数据,然而,数据库中存入了多个数据.对于如何造成了这个结果,一时没有想清楚,但为了解决入库慢的问题,首先要删除冗余数据. 问题描述 数据库的表结构很简单,如下: +----------------+--------------+------+-----+---------+--

删除MySQL二进制日志具体方法

服务器上的120G SSD硬盘空间用了92%,检查后发现,原来是 MySQL的二进制日志没有及时清除,占用了大量的空间,于是直接用命令:reset master 一把删干净了.  代码如下 复制代码 reset master 如果MySQL服务器上的数据库做了replication,就不要使用该命令,而是应该用:purge binary logs 命令.purge 比较温和,通常有两种执行方式:  代码如下 复制代码 purge binary logs to     'mysql-bin.010

如何有条件的分步删除数据表中的记录

数据|条件 如何有条件的分步删除数据表中的记录作者:eygle出处:http://blog.eygle.com日期:February 22, 2005« 自己动手,丰衣足食 | Blog首页 有时候我们需要分配删除数据表的一些记录,分批提交以减少对于Undo的使用,本文提供一个简单的存储过程用于实现该逻辑.你可以根据你的需要进行适当调整,本例仅供参考: SQL> create table test as select * from dba_objects;Table created.SQL>

如何查找、删除表中重复的记录

重复 如何查找.删除表中重复的记录软件环境: 1.Windows NT4.0+ORACLE 8.0.42.ORACLE安装路径为:C:\ORANT问题提出: 1.当我们想要为一个表创建唯一索引时,如果该表有重复的记录,则无法创建成功. 方法原理: 1.Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, rowid确定了每条记录是在ORACLE中的哪一个数据文件.块.行上. 2.在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中 那

DataGrid中删除最后一页的记录时出错的解决办法

datagrid|解决       比如现在有三页,第3页只有一条记录,当删除第3页的记录时,有时候可能会出错,解决的办法如下:       //------------------------------       //by:∮明天去要饭       //-------------------------------               string listClass = Class.SelectedValue.ToString();        dgManage.DataSou

看实例学VFP:删除数据表中的记录

本例对看实例学VFP:对数据表中记录进行修改一文的实例进行了一点改进,增加了"撤消"功能.程序运行时如下图: 在组合框中选择要查找的字段,在文本框中输入查找内容后单击右侧的"查找"按钮后将查找结果显示在上方的表格中,"查找"按钮变成"撤消"按钮,同时激活"删除"按钮及用于显示数据的文本框,并将当前记录(满足查询条件的记录)的值同时显示在文本框中,:单击"删除"按钮后会删除查找出来的记录刷

Word 2007如何删除最近使用文档记录

  在办公室里或许会有人来用你的电脑,这样你的word的最近使用记录就会出卖你最近的工作记录,如果是自己的竞争对手就麻烦了,今天跟大家讲的就是Word 2007如何删除最近使用文档记录. 1.首先打开word 2007就会发现里面有我们的最近使用文档的记录,如图 ( 图 1 ) 2.如图逐个单击红色方框圈出来的现象"office"--"word选项" ( 图 2 ) 3.这时会弹出"word选项"对话框,"高级"--"

命令行删除mysql服务

原文地址: http://blog.sina.com.cn/s/blog_62bc8a820100uvj4.html 又会一招–如何删除MySql服务 进入"控制面板->管理工具->服务"查看才发现,虽然MYSQL已经卸载了,但是MYSQL服务仍然残留在系统服务里. 又不想改服务名,改怎么办呢. 后来上百度搜索发现,只要在CMD里输入一跳命令就可以将服务删除: sc delete mysql //这里的mysql是你要删除的服务名 这样一来服务就被删除了,进入服务里查看确实

mfc 里用addnew()向mysql表中添加记录时有时在前面,有时在后面,求解啊

问题描述 mfc 里用addnew()向mysql表中添加记录时有时在前面,有时在后面,求解啊 mfc 里用addnew()向mysql表中添加记录时有时在前面,有时在后面,求解啊!! 解决方案 直接用SQL语句控制记录. 解决方案二: 文档 数独求解"> 解决方案三: 我是这样插入的