【发布时间】:2010-10-13 14:37:02
【问题描述】:
是否有任何查询/方式可以显示在所有服务器上执行的最后查询?
【问题讨论】:
是否有任何查询/方式可以显示在所有服务器上执行的最后查询?
【问题讨论】:
对于那些拥有 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 文件并可能永久开启日志记录/var/log /var/data/log/opt /home/mysql_savior/var
有关详细信息,请参阅 MySQL 5.1 Reference Manual - Server System Variables - general_log
【讨论】:
您可以启用general query log 进行此类诊断。通常,您不会在生产服务器上记录所有 SELECT 查询,这是性能杀手。
编辑您的 MySQL 配置,例如/etc/mysql/my.cnf - 查找或添加这样的行
[mysqld]
log = /var/log/mysql/mysql.log
重启 mysql 以获取更改,现在可以
tail -f /var/log/mysql/mysql.log
嘿,presto,您可以在查询进入时查看它们。
【讨论】:
SELECT * FROM mysql.general_log WHERE command_type ='Query' LIMIT total;
【讨论】:
你可以做流动的事情来监控 mysql 查询日志。
打开mysql配置文件my.cnf
sudo nano /etc/mysql/my.cnf
在 [mysqld] 标题下搜索以下行并取消注释这些行以启用日志
general_log_file = /var/log/mysql/mysql.log
general_log = 1
重启你的mysql服务器以反映变化
sudo service mysql start
在终端中使用以下命令监控 mysql 服务器日志
tail -f /var/log/mysql/mysql.log
【讨论】:
1) 如果启用了通用 mysql 日志记录,那么我们可以根据我们在配置中提到的内容检查日志文件或表中的查询。 使用以下命令检查启用了什么
mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';
如果我们需要表中的查询历史记录,那么
Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';
看看表mysql.general_log
如果您喜欢输出到文件:
SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';
2) 我们还可以检查 .mysql_history 文件中的查询 猫~/.mysql_history
【讨论】:
也许您可以通过查看query log 来发现这一点。
【讨论】:
如果您不想更改 MySQL 配置,可以使用 SQL 分析器,例如“Neor Profile SQL”http://www.profilesql.com。
【讨论】:
如果 mysql binlog 已启用,您可以通过执行检查用户运行的命令 通过浏览到 mysql binlog 目录在 linux 控制台中执行以下命令
mysqlbinlog binlog.000001 > /tmp/statements.sql
启用
[mysqld]
log = /var/log/mysql/mysql.log
或者一般日志会影响mysql的性能
【讨论】:
阅读保罗的回答后,我继续挖掘https://dev.mysql.com/doc/refman/5.7/en/query-log.html的更多信息
我发现一个人的一个非常有用的代码。这是上下文的摘要。
(注意:以下代码不是我的)
此脚本是保持表格清洁的示例,可帮助您减小表格大小。一天后,将有大约 180k 的日志查询。 (在一个文件中,每天 30MB)
您需要添加一个额外的列 (event_unix),然后您可以使用此脚本来保持日志干净...它将时间戳更新为 Unix 时间戳,删除超过 1 天的日志,然后更新从 event_unix 将 event_time 转换为 Timestamp... 听起来有点混乱,但效果很好。
新列的命令:
SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';
清理脚本:
SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';
感谢 Sebastian Kaiser(代码的原始作者)。
希望有人会像我一样发现它有用。
【讨论】:
在linux下可以看下面的
cd /root
ls -al
vi .mysql_history可能有帮助
【讨论】: