mysql 查询日志介绍 刺骨的言语ヽ痛彻心扉 2021-07-28 14:18 328阅读 0赞 ### MySQL查询日志介绍 ### MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。生产环境,如果开启MySQL查询日志,对性能还是有蛮大的影响的。另外很多时候,MySQL慢查询日志基本可以定位那些出现性能问题的SQL,所以MySQL查询日志应用的场景其实不多,有点鸡肋的感觉,它跟SQL Server中的profiler有点类似,但是这个不能跟踪某个会话、用户、客户端。它只能对整个数据库进行跟踪。MySQL查询日志本身比较简单,网上介绍的不多,官方资料也就那么短短一篇。 ### MySQL查询日志配置 ### MySQL中的参数general\_log用来控制开启、关闭MySQL查询日志,参数general\_log\_file用来控制查询日志的位置。所以如果你要判断MySQL数据库是否开启了查询日志,可以使用下面命令。general\_log为ON表示开启查询日志,OFF表示关闭查询日志。 mysql> show variables like '%general_log%'; +------------------+------------------------------+ | Variable_name | Value | +------------------+------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/DB-Server.log | +------------------+------------------------------+ 2 rows in set (0.00 sec) mysql> 另外,MySQL的查询日志支持写入文件或写入数据表两种形式,这个由参数log\_output控制,如下所示: mysql> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ 1 row in set (0.00 sec) mysql> 这三个参数general\_log、 general\_log\_file、 log\_output都是动态参数,可以随时动态修改。 1、开启MySQL查询日志 mysql> set global general_log = on; Query OK, 0 rows affected (0.11 sec) mysql> show variables like 'general_log'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | ON | +---------------+-------+ 1 row in set (0.02 sec) mysql> 2:关闭MySQL查询日志 mysql> show variables like 'general_log'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | ON | +---------------+-------+ 1 row in set (0.01 sec) mysql> set global general_log=off; Query OK, 0 rows affected (0.01 sec) mysql> show variables like 'general_log'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | OFF | +---------------+-------+ 1 row in set (0.00 sec) mysql> 3:设置日志输出方式为表(如果设置log\_output=table的话,则日志结果会记录到名为gengera\_log的表中,这表的默认引擎是CSV): mysql> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ 1 row in set (0.00 sec) mysql> set global log_output='table'; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | TABLE | +---------------+-------+ 1 row in set (0.01 sec) mysql> 查看查询日志信息。 mysql> select * from mysql.general_log; +---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+ | event_time | user_host | thread_id | server_id | command_type | argument | +---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+ | 2017-07-06 12:32:05 | root[root] @ localhost [] | 1 | 1 | Query | show variables like 'general%' | | 2017-07-06 12:32:28 | root[root] @ localhost [] | 1 | 1 | Query | show variables like 'log_output' | | 2017-07-06 12:32:41 | root[root] @ localhost [] | 1 | 1 | Query | select * from MyDB.test | | 2017-07-06 12:34:36 | [root] @ localhost [] | 3 | 1 | Connect | root@localhost on | | 2017-07-06 12:34:36 | root[root] @ localhost [] | 3 | 1 | Query | KILL QUERY 1 | | 2017-07-06 12:34:36 | root[root] @ localhost [] | 3 | 1 | Quit | | | 2017-07-06 12:34:51 | root[root] @ localhost [] | 1 | 1 | Query | select * from mysql.general_log | +---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+ 7 rows in set (0.02 sec) mysql> 4: 查询日志归档 mysql> system mv /var/lib/mysql/DB-Server.log /var/lib/mysql/DB-Server.log.20170706 mysql> system mysqladmin flush-logs -p Enter password: 或者你在shell中执行下面命令 [root@DB-Server mysql]# mv /var/lib/mysql/DB-Server.log /var/lib/mysql/DB-Server.log.20170706 [root@DB-Server mysql]# mysqladmin flush-logs -p Enter password: 5: 修改查询日志名称或位置 mysql> show variables like 'general_log%'; +------------------+------------------------------+ | Variable_name | Value | +------------------+------------------------------+ | general_log | ON | | general_log_file | /var/lib/mysql/DB-Server.log | +------------------+------------------------------+ 2 rows in set (0.00 sec) mysql> set global general_log='OFF'; Query OK, 0 rows affected (0.00 sec) mysql> set global general_log_file='/u02/mysql_log.log'; Query OK, 0 rows affected (0.00 sec) mysql> set global general_log='ON'; Query OK, 0 rows affected (0.02 sec) 如果你遇到下面类似问题,这个是因为权限问题导致。 mysql> set global general_log_file='/u02/mysql_log.log'; ERROR 1231 (42000): Variable 'general_log_file' can't be set to the value of '/u02/mysql_log.log' 将对应目录的owner修改为mysql即可解决问题。如下所示: [root@DB-Server u02]# chown -R mysql:mysql /u02 另外,MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。这个就是即使我查询一个不存在的表的SQL,查询日志依然会记录。如下测试所示: mysql> select * from MyDB.test1; ERROR 1146 (42S02): Table 'MyDB.test1' doesn't exist mysql> select * from MyDB.test2; +-------+------+ | id | sex | +-------+------+ | 10001 | | | 10002 | | | 10003 | | +-------+------+ 3 rows in set (0.07 sec) mysql> select * from MyDB.kkk; ERROR 1146 (42S02): Table 'MyDB.kkk' doesn't exist mysql> ![20191103104651519.jpg][] ### MySQL查询日志的应用场景 ### 存在即是合理,既然MySQL提供了查询日志,那么肯定有其应用的地方。比如,我就遇到这样一个例子,前阵子碰到别人问mysqlslap压力测试工具中参数的问题,问题如下: -c, --concurrency=name Number of clients to simulate for query to run. --number-of-queries=\# Limit each client to this number of queries (this is not exact). 比如我指定:--concurrency=50 --number-of-queries=100, 那么这次测试总的sql执行次数是=100 还是 50\*100=5000 ? 我们不知道--number-of-queries这个参数代表所有客户端的执行次数还是每一个客户端的执行次数,这些英文如果看得不是太明白,那么我们就动手测试一下,这个时候MySQL查询日志就能发挥其用武之地了。 [root@DB-Server u02]# mysqlslap -u root -p --concurrency=50 --create-schema='MyDB' --query='select * from MyDB.test2' --number-of-queries=100; Enter password: Benchmark Average number of seconds to run all queries: 0.023 seconds Minimum number of seconds to run all queries: 0.023 seconds Maximum number of seconds to run all queries: 0.023 seconds Number of clients running queries: 50 Average number of queries per client: 2 如下所示,我们可以查到这个SQL总共执行了100次,也就是说number-of-queries代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。--concurrency 表示并发量,也就是模拟多少个客户端同时执行select。 如果你指定 --number-of-queries=100, --concurrency=50 测试总的SQL执行应该是100 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doYXRkYXk_size_16_color_FFFFFF_t_70][] 参考资料: [https://dev.mysql.com/doc/refman/5.6/en/query-log.html][https_dev.mysql.com_doc_refman_5.6_en_query-log.html] [20191103104651519.jpg]: /images/20210728/f014c74d92974686a5d69d546a1dd235.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doYXRkYXk_size_16_color_FFFFFF_t_70]: /images/20210728/eb0a572623994b99abc8f5dff92e6644.png [https_dev.mysql.com_doc_refman_5.6_en_query-log.html]: https://dev.mysql.com/doc/refman/5.6/en/query-log.html
还没有评论,来说两句吧...