如何在MySQL中查看日志文件?

223

我读到Mysql服务器创建了一个日志文件用于记录所有的活动,比如查询何时执行以及具体内容。

有谁能告诉我这个日志文件在我的系统中的位置?我该如何阅读它?

基本上,我需要使用不同输入[两个日期之间的备份]备份数据库,因此我认为我需要在这里使用日志文件,这就是我想要做的原因...

我认为这个日志必须以某种方式进行保护,因为敏感信息(例如用户名和密码)可能会被记录[如果任何查询需要这些信息],那么它是否可以得到保护,不容易被看到呢?

我拥有系统的root访问权限,我该如何查看日志?

当我尝试打开/var/log/mysql.log时,它是空的。

这是我的配置文件:

[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
log = /var/log/mysql/mysql.log 
binlog-do-db=zero



user        = mysql
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
skip-external-locking

bind-address        = 127.0.0.1
#
# * Fine Tuning
#
key_buffer      = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
9个回答

216
这里有一种简单的方法来启用它们。在mysql中,我们经常需要查看3个日志,这些日志在任何项目开发期间都是最常用的。
- 错误日志(Error Log)。它包含服务器运行时发生的错误信息(也包括服务器的启动和停止)。 - 一般查询日志(General Query Log)。这是mysqld正在进行的操作的一般记录(连接、断开连接、查询)。 - 慢查询日志(Slow Query Log)。它由“慢”SQL语句组成(如其名称所示)。
默认情况下,MYSQL中未启用任何日志文件。所有错误将显示在syslog中(/var/log/syslog)。
要启用它们,请按照以下步骤操作:
第1步:进入该文件(/etc/mysql/conf.d/mysqld_safe_syslog.cnf),并删除或注释掉那些行。
第2步:进入mysql配置文件 (/etc/mysql/my.cnf), 并添加以下行。
要启用错误日志,请添加以下内容
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log

[mysqld]
log_error=/var/log/mysql/mysql_error.log

要启用通用查询日志,请添加以下内容

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

为启用慢查询日志,请添加以下内容

log_slow_queries       = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes

步骤3:保存文件并使用以下命令重新启动MySQL

service mysql restart

要在运行时启用日志,请登录到mysql客户端(mysql -u root -p),并执行以下操作:

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';

最后我想提一件事,那就是我在一篇博客中看到了这个方法。谢谢。这对我很有用。

点击这里访问该博客


2
我认为您“忘记”写了一些东西。第一步不完整,并且“博客”链接的句子也缺失了。 - Athafoud
3
所提到的博客文章只在启用错误日志时提及修改“/etc/mysql/conf.d/mysqld_safe_syslog.cnf”。然而,当前回答的写法似乎暗示着任何日志都需要进行修改。 - Melebius
2
我的服务器版本是5.6.35。Ross Smith II在这里的回答对我有用。我必须在[mysqld]下设置slow_query_log = 1;slow_query_log_file = /var/log/mysql/mysql-slow-query.loglong_query_time = 60。当我尝试使用您的配置启动时,服务器启动缓慢且出现错误。我真的猜测版本不同,在后来的版本中Oracle想要统一变量名。另外:在我看来,2秒并不算长。 - JackLeEmmerdeur
1
那些文件的权限怎么样?我在许多情况下看到日志文件没有被创建。 - MagePsycho
1
重要提示:log-slow-queries已经被弃用。 请参考http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html和https://dev59.com/GVoU5IYBdhLWcg3w9aai。 - Rakesh Soni
显示剩余6条评论

63

MySQL日志是由全局变量决定的,例如:

要查看这些设置及其位置,请运行此shell命令:

mysql -se "SHOW VARIABLES" | grep -e log_error -e general_log -e slow_query_log

要打印错误日志的值,请在终端中运行此命令:

mysql -e "SELECT @@GLOBAL.log_error"

要实时阅读错误日志文件的内容,请运行:

sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
注意:完成后按Control-C

启用通用日志时,请尝试:

sudo tail -f $(mysql -Nse "SELECT CONCAT(@@datadir, @@general_log_file)")

要使用密码访问mysql,请添加-p-pMYPASS参数。如果想记住密码,您可以在您的~/.my.cnf中进行配置,例如:


[client]
user=root
password=root

这样下次就会记住了。


1
如果需要输入密码,请尝试以下命令:mysql -p -se "SHOW VARIABLES" | grep -e log_error -e general_log -e slow_query_log - Paul Chernoch
回复很好,只是你没有解释如何设置全局变量。 - Luke

45

你需要在mysql中激活查询日志。

  1. 编辑 /etc/my.cnf

    [mysqld]
    log=/tmp/mysql.log
    
  2. 重新启动计算机或 mysqld 服务

    service mysqld restart
    
  3. 打开phpMyAdmin/任何使用mysql/mysql控制台的应用程序并运行查询

  4. cat /tmp/mysql.log (你应该能看到查询)


请运行一条数据库查询语句,具体翻译不重要。 - johnlemon
8
无效的路径。您有/etc/my.cnf应该是/etc/mysql/my.cnf。 - mystic cola

11

来自 MySQL 参考手册:

默认情况下,所有日志文件都会创建在数据目录中。

检查 /var/lib/mysql 文件夹。


1
但是我无法打开MySQL文件夹。我认为日志文件的路径是/var/log/mysql/mysql.log,但我无法打开它,我该怎么办? - Arjun
2
如何将自己设置为root?我认为我是管理员,我安装了服务器并设置了密码,所以我应该是管理员,但仍然无法访问,我该如何打开它? - Arjun
1
我强制进入了这个目录(我不得不创建根用户,但后来删除了它),但当我看到这些文件时,我以为它们是加密的 :) 所以我认为这不是一个好方法。 - Line
使用 sudo -s 命令,然后尝试进入 mysql 文件夹。 - Rashedul Islam
MySQL手册中存在许多不一致之处,无论如何,在Windows上都没有这样的目录。 - user3338098

9
在我(我已经安装了LAMP)/etc/mysql/my.cnf文件中,我在[mysqld]部分发现以下被注释的行:
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

我必须以超级用户身份在终端中打开此文件:

sudo geany /etc/mysql/my.cnf

我更喜欢使用Geany而不是gedit或VI,它们都无关紧要。
我只需将它们取消注释并保存文件,然后重新启动MySQL即可。
sudo service MySQL restart

运行几个查询,打开上面的文件(/var/log/mysql/mysql.log),日志就在那里 :)


尽管它可能适用于您,但对我来说并不适用,即使像“索引损坏”这样的重大异常也没有被记录。仅启动和关闭问题得到记录。 - user3338098

7

以root用户身份进入MySQL/MariaDB服务器命令行工具

  1. 设置文件路径(你可以将general.log替换为你选择的文件名)。

SET GLOBAL general_log_file='/var/log/mysql/general.log';

  1. 设置日志文件格式

SET GLOBAL log_output = 'FILE';

  1. 启用服务器通用日志记录

SET GLOBAL general_log = 'ON';

  1. 检查全局配置变量中的配置。

SHOW VARIABLES LIKE "general_log%";

This will give results as this

  1. 输入 exit 退出MySQL命令行并使用以下命令追踪查询:

tail -f /var/log/mysql/general.log

或者

less /var/log/mysql/general.log

  1. 禁用通用服务器日志记录

SET GLOBAL general_log = 'OFF';


4
为了补充loyola的回答,值得一提的是,从MySQL 5.1开始,log_slow_queries已被弃用,并被slow-query-log所取代。
使用log_slow_queries会导致您的service mysql restartservice mysql start失败。

3

除了上面的答案,您还可以通过命令行参数来传递日志选项给mysqld进程,而不是手动编辑配置文件。例如,启用一般日志记录并指定一个文件:

mysqld --general-log --general-log-file=/var/log/mysql.general.log

确认以上其他答案,mysqld --help --verbose会给出来自配置文件的值(因此使用命令行选项general-log为FALSE); 而mysql -se "SHOW VARIABLES" | grep -e log_error -e general_log则给出以下内容:
general_log     ON
general_log_file        /var/log/mysql.general.log

使用更紧凑的语法记录错误日志:
mysqld --general-log --general-log-file=/var/log/mysql.general.log --log-error=/var/log/mysql.error.log

1
shell> mysqladmin flush-logs


shell> mv host_name.err-old backup-directory

7
欢迎来到stackoverflow。请考虑更详细地解释一下你的答案中的代码与提问者的问题有何关联。此外,为了得到正确的格式,请将代码缩进4个空格。 - Politank-Z

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