Mysql二进制日志不旋转,分区空间不足,复制相关的pipe理查询挂起

我有一个根分区已满的框。

最直接的解释是mysql二进制日志不能轮转。 尽pipeexpire_log_days被设置为10,但是有超过10天的日志。 show master statusshow slave statuspurge binary logs都无限期挂起。

我会尝试一些事情,但确保/充满是你的问题。 通常情况下,Mysql将数据存储在/ var / lib / mysql中,除/ tmp之外不使用/。

首先尝试清除一些空间。 从/ var / log /删除旧的日志或重击你下载的src代码,从不使用。 如果你可以得到/低于100%,你的Mysql可能会返回到没有被楔住的状态。

假设您已经清除了一些空间,请尝试清除日志。 我会尝试在DATE_SUB(NOW(),INTERVAL 3 DAY)之前的PURGE BINARY LOGS; 从Mysql的命令行。 如果十分钟后仍然挂起,你可能需要closuresMysql,或者如果不能closures,

通常,手动删除日志永远不是一个好主意,但在这种情况下,它可能是您唯一的select。 删除最旧的日志并尝试重新启动Mysql。 它可能会做一些表检查。 密切关注mysql错误日志,直到它正常运行。 然后尝试再次清除日志。

一旦启动并运行,确保expire_logs_days是通过检查showvariables真正设置的; 在Mysql中。 如果你的文件系统很小,你也可以设置max_binlog_size = 100M。 通常情况下,Mysql会以1G的速度旋转日志,这可能不够经常。 Mysql只在当前日志达到最大大小时才转动日志。

这完全取决于你正在运行的MySQL版本

问题在于所有二进制日志的内存映射。

当mysqld启动时,它将mysql二进制日志的索引读入内存。

该内存映射对磁盘上存在二进制日志很敏感。

如果你做的命令如:
1.将二进制日志logging到“<二进制日志文件名>”;
2.在'<date和时间>'之前清理二进制日志;
3. RESET MASTER;

mysqld将使用内存映射而不是二进制日志索引文件。

如果内存映射不能精确匹配磁盘上的二进制日志文件(即,不是sych中的),则带有expire_logs_days的日志循环将失败。

您不能简单地编辑mysql二进制日志索引文件,因为当您为mysqld发出closures时,内存映射将覆盖二进制日志索引文件。

这个问题通常发生在有人删除操作系统中的二进制日志,而不是使用前面提到的三(3)个MySQL命令之一时。 mysqld不会仅仅因为二进制日志的突然消失而崛起。

只能立即更正可能的做法是删除所有二进制日志,删除二进制日志索引文件,并启动mysql备份,或者可以执行以下操作:

  1. closuresmysql
  2. 删除你不想要的二进制日志
  3. 编辑二进制日志索引文件(删除文件中不存在的二进制日志)
  4. 启动mysqld

此后要注意消失的二进制日志,运行SHOW BINARY LOGS; 如果任何二进制日志条目以文件大小0返回,则二进制日志的存储器映射不在sych中。 那么行动的过程就是要做到以下几点:

  1. closuresmysql
  2. 编辑二进制日志索引文件(删除文件中不存在的二进制日志)
  3. 启动mysqld

我的build议是一旦你获得救援,把/ var / lib / mysql和/ var / log / mysql放在自己的LVM卷上。