MySQL如何开启记录从客户端收到的每条SQL查询语句和提交时间的功能? 我可以在phpmyadmin或NaviCat中这样做吗? 如何分析日志?
当前回答
你可能会遇到一组十六进制值,像这样(参数列):
mysql> select * from mysql.general_log LIMIT 1\G
*************************** 1. row ***************************
event_time: 2023-01-27 13:37:20.950778
user_host: root[root] @ localhost []
thread_id: 1434
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D207573657273
1 row in set (0.00 sec)
所以为了让它更具可读性,只需使用:
select a.*, convert(a.argument using utf8) from mysql.general_log a;
返回值是这样的:
mysql> select a.*, convert(a.argument using utf8) from mysql.general_log a LIMIT 1\G
*************************** 1. row ***************************
event_time: 2023-01-27 13:37:20.950778
user_host: root[root] @ localhost []
thread_id: 1434
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D207573657273
convert(a.argument using utf8): select * from users
1 row in set, 1 warning (0.00 sec)
Ps:我在例子中使用了LIMIT 1,因为我的日志表太大了。
其他回答
首先,请记住,这个日志文件在繁忙的服务器上可能会变得非常大。
对于mysql < 5.1.29:
要启用查询日志,请将其放在/etc/my.cnf的[mysqld]部分
log = /path/to/query.log #works for mysql < 5.1.29
另外,从MySQL控制台启用它
SET general_log = 1;
参见http://dev.mysql.com/doc/refman/5.1/en/query-log.html
mysql 5.1.29+
在mysql 5.1.29+中,日志选项已弃用。要指定日志文件并启用日志记录,请在my.cnf的[mysqld]部分中使用这个:
general_log_file = /path/to/query.log
general_log = 1
另外,要从MySQL控制台打开日志记录(还必须以某种方式指定日志文件位置,或者找到默认位置):
SET global general_log = 1;
还要注意,还有其他选项可以只记录慢速查询或不使用索引的查询。
在phpMyAdmin 4.0,你去状态>监视器。在那里,您可以启用慢查询日志和常规日志,查看实时监视器,选择图表的一部分,查看相关查询并分析它们。
你可能会遇到一组十六进制值,像这样(参数列):
mysql> select * from mysql.general_log LIMIT 1\G
*************************** 1. row ***************************
event_time: 2023-01-27 13:37:20.950778
user_host: root[root] @ localhost []
thread_id: 1434
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D207573657273
1 row in set (0.00 sec)
所以为了让它更具可读性,只需使用:
select a.*, convert(a.argument using utf8) from mysql.general_log a;
返回值是这样的:
mysql> select a.*, convert(a.argument using utf8) from mysql.general_log a LIMIT 1\G
*************************** 1. row ***************************
event_time: 2023-01-27 13:37:20.950778
user_host: root[root] @ localhost []
thread_id: 1434
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D207573657273
convert(a.argument using utf8): select * from users
1 row in set, 1 warning (0.00 sec)
Ps:我在例子中使用了LIMIT 1,因为我的日志表太大了。
开启MAC Machine查询日志功能。
打开以下文件:
vi /private/etc/my.cnf
设置'mysqld'节下的查询日志url,如下所示:
[mysqld]
general_log_file=/Users/kumanan/Documents/mysql_query.log
很少有机器不能正确地记录查询,所以你可以从MySQL控制台启用它
mysql> SET global general_log = 1;
可以禁用或启用常规查询日志(记录所有查询)
SET GLOBAL general_log = 1 # (or 0 to disable)
推荐文章
- 在MySQL中检测值是否为number
- MySQL中两个日期之间的差异
- 为什么在MySQL中文本列不能有一个默认值?
- 使用SQL查询查找最近的纬度/经度
- 有nginx access_log和error_log日志的STDOUT和STDERR的主进程
- 如何停止mysqld
- 检查MySQL表是否存在而不使用“select from”语法?
- 从NOW() -1天选择记录
- 从表中选择1是什么意思?
- 在Python Django中运行单元测试时,如何禁用日志记录?
- 数据库性能调优有哪些资源?
- 如何更改表的默认排序规则?
- MySQL foreign_key_checks是否影响整个数据库?
- 哪里是logging.config.dictConfig的完整示例?
- 设置NOW()为datetime数据类型的默认值?