How to show the last queries executed on MySQL?
是否有任何查询/方法显示在所有服务器上执行的最后一个查询?
对于那些拥有mysql>=5.1.12的用户,可以在运行时全局控制此选项:
执行SET GLOBAL log_output = 'TABLE';。
执行SET GLOBAL general_log = 'ON';。
看一下表mysql.general_log。
如果希望输出到文件而不是表:
SET GLOBAL log_output ="FILE";违约。
SET GLOBAL general_log_file ="/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';
我更喜欢这种方法来编辑.cnf文件,因为:
您没有编辑my.cnf文件,可能会永久打开日志记录。
您不会在文件系统中到处寻找查询日志——或者更糟的是,您会因为需要完美的目标而分心。江户十一〔7〕江户十一〔8〕号
您不必重新启动服务器并中断与它的任何当前连接。
重新启动服务器将使您离开启动位置(默认情况下,日志仍处于关闭状态)
有关详细信息,请参阅mysql 5.1参考手册-服务器系统变量-常规日志
- 很棒的用户界面设计。总之,MySQL日志表实际上使用的是csv引擎,所以您可以按照FlipMCF在关于启用登录到通用日志表的答案中所说的那样做,并像下面这样使用通用日志的tail-f:tail-f/var/lib/mysql/mysql/general_log.csv
- 该死的,mysql文档甚至都没有触发table参数。谢谢。
- @万格尔,看这里。就在那里。但是是的,在5.5版中没有看到它是令人沮丧的,尽管它在5.1版中显示。
- 有没有办法列出所有已设置的变量?
- @jeach:stackoverflow.com/questions/1493722/…
- 我们可以做这个数据库基础吗?MySQL上的每个数据库都有自己的查询日志表?这会让我的生活更轻松!
- 完成后请记住清除常规日志表:"truncate table mysql.general_log"
- @FlipMCF,顺便说一句,我们需要做这些的一些用例是什么?
- 我是这样得到结果的,但是参数是由问号表示的,例如,从x=处的条中选择foo。.如何获得完整的查询?
- 停用日志SET GLOBAL general_log = 0;,可以安全地截断表TRUNCATE table mysql.general_log。
- 注意,这只会显示所有查询的运行时间,而不是每个查询花费的时间,这有一个不同的机制:|
- @罗杰帕克:不同的机制是什么?
- @Samgoldberg我记不清了,也许是"慢查询"选项或者类似的东西。
- dev.mysql.com/doc/refman/5.7/en/slow-query-log.html谢谢谷歌
- @Okwap使用long_query_time = 0和slow_query_log = 1:serverfault.com/a/814716
- 这个答案是九岁。我们现在没有MySQL8了吗?
您可以为这类诊断启用常规查询日志。一般来说,您不会在生产服务器上记录所有的选择查询,但这是一个性能杀手。
编辑您的mysql配置,例如/etc/mysql/my.cnf-查找或添加这样的行
重新启动MySQL以获取更改,现在可以
1
| tail -f /var /log/mysql /mysql. log |
嘿,普雷斯托,你可以在他们进来的时候观察他们。
- General_Log_文件和General_登录my.cnf
- 如果你想知道重启mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-serv‌&8203;er,这是可行的。
- 较新版本的Mac OS X(至少在Mac OS X上)需要常规的"日志"文件和常规的"日志"选项,而不仅仅是"日志"。否则,会出现这样的错误:error/usr/local/mysql/bin/mysqld:dimmous option'--log=/tmp/mysqlu querys.log'(log bin,logu slaveu updates)
- @Jaysheth,我在Mariadb10.2上发现了这个错误,所以我不确定它是否与Mac OS相关。
您可以执行流式操作来监视MySQL查询日志。
打开mysql配置文件my.cnf
1
| sudo nano /etc/mysql/my.cnf |
在[mysqld]标题下搜索以下行并取消这些行的注释以启用日志
1 2
| general_log_file = /var /log/mysql /mysql. log
general_log = 1 |
重新启动MySQL服务器以反映更改
在终端中使用以下命令监视mysql服务器日志
1
| tail -f /var /log/mysql /mysql. log |
1)如果启用了一般的MySQL日志记录,那么我们可以根据配置中提到的内容检查日志文件或表中的查询。使用以下命令检查启用的内容
1 2
| mysql > show variables like 'general_log%';
mysql > show variables like 'log_output%'; |
如果我们需要表中的查询历史,那么
查看mysql.general_log表
如果希望输出到文件:
2)我们还可以检查.mysql_历史文件中的查询。cat~/.mysql_历史
如果启用了mysql binlog,可以通过执行来检查用户运行的命令在Linux控制台中通过浏览mysql binlog目录执行命令
1
| mysqlbinlog binlog.000001 > /tmp/statements.sql |
有可能
或者常规日志会影响MySQL的性能
- 可能,但很痛苦。如果你想看看过去发生了什么,那就更有用了。
也许您可以通过查看查询日志来发现这一点。
在阅读了保罗的答案之后,我继续在https://dev.mysql.com/doc/refman/5.7/en/query-log.html上寻找更多信息。
我找到了一个非常有用的代码。这里是上下文的摘要。
(注:以下代码不是我的)
这个脚本是一个保持表干净的示例,它将帮助您减少表的大小。一天后,将有大约180k个日志查询。(在一个文件中,每天30 MB)
您需要添加一个额外的列(event_unix),然后您可以使用此脚本来保持日志的整洁…它将把时间戳更新为unix时间戳,删除超过1天的日志,然后从event-unix将事件时间更新为时间戳…听起来有点困惑,但效果很好。
新列的命令:
清除脚本:
荣誉归于塞巴斯蒂安·凯撒(代码的原始作者)。
希望有人能像我一样发现它的用处。
- 有趣。除非先锁定所有数据库,否则在清理过程中会丢失查询。这里还可能出现其他问题。如果我们现在是"连续"日志记录,我会使用文件日志或箱日志和现成的日志旋转器。
如果您不想更改MySQL配置,可以使用SQL事件探查器,如"neor profile sql"http://www.profile sql.com。
在Linux中可以看到以下内容
vi .mysql_history可能有帮助
- 这看起来只适用于官方命令行mysql客户机,并且只适用于根用户执行的查询。
- 问题是"所有服务器",这使得这个答案不正确。这将显示由单个客户机执行的所有查询。
- 如果启用了mysql binlog,可以通过浏览mysql binlog目录mysqlbinlog binlog.000001>/tmp/statements.sql来检查用户运行的命令,启用[mysqld]log=/var/log/mysql/mysql.log或genral log会影响mysql的性能。
- 默认情况下,此中的某些条目将被抑制,例如,包含"密码"的字符串。