在MySQL中截断慢查询日志

13

在 MySQL 运行时,如何最安全地截断 MySQL 慢查询日志(主要是在 Linux 下,但知道 Windows 的方法会更方便)?

所谓安全,指的是:

  • 不应该引起任何权限问题
  • 下次追加内容时不应该跳回到原来的大小
4个回答

23

为了截断一个文件,无论它是否被正在运行的应用程序打开,请执行以下操作:

> /var/logs/your.log

在您的命令提示符下。


我没有深入调查过,但这种方法不会在日志条目中间截断,从而导致日志文件出现错误吗?我喜欢这个解决方案(特别是为了增加我的Linux知识),但从我所看到的来看,@tjanofsky的解决方案更加健壮。 - rinogo
@rinogo:好问题。我得检查一下单个的write()系统调用是否可以与另一个交错使用。另一方面,我不认为记录器会使用多个write()来写入日志行。 - vartec
没错!但需要记住的是,在MySQL的慢查询日志中,每个“条目”实际上由多行组成。因此,在最坏的情况下,每个“条目”实际上可能由多个write()调用组成,这将呈现出更容易受到此问题影响的情况。 - rinogo
这将文件指针推回到开头,mysql正在写入(或未写入)的位置并不重要。 - Glenn Plas

18

来源于这里

你可以移动打开的文件,然后告诉mysqld刷新日志,这将打开一个新的日志。

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs

5
如果这是一个持续的问题,你应该看一下 logrotate,因为它可以帮助你解决这个问题。
我不知道echo > file.log,但它很有道理。我一直使用cat /dev/null > file.log
此外,需要注意的是,绝对不能删除正在被写入的日志文件,因为打开它的程序将继续向文件中写入数据。很难找出为什么硬盘空间会消失!

在Linux的情况下,这是最好、最简单的方法和答案。 - shgnInc

1
请记住,仅删除(rm)或移动(mv)文件不会释放空间,直到mysql重启。
在Ubuntu和MariaDB上,我使用了这个方法来清空mysql-slow.log使用的磁盘空间,而无需重新启动。
echo > /var/lib/mysql/mysql-slow.log

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接