转载来自 骏马金龙 https://www.junmajinlong.com
ProxySQL可以将所有途经ProxySQL的查询记录日志。它们的日志是通过查询规则进行配置的,所以可以记录的粒度可以很大、也可以很细。
Setup
首先启用全局日志配置:
SET mysql-eventslog_filename='queries.log';
然后将其加载到RUNTIME,并持久化保存到磁盘:(译注:注意,是mysql变量,不是admin变量)
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
再然后,创建查询规则来匹配想要记录的日志。如果要记录所有查询,很简单的一个设置即可:
INSERT INTO mysql_query_rules (rule_id, active, match_digest, log,apply) VALUES (1,1,'.',1,0);
如果你不信任Bob,你可以将Bob的查询过程全部记录下来:
INSERT INTO mysql_query_rules (rule_id, active, username, match_pattern, log,apply) VALUES (1, 1, 'Bob', '.', 1, 0);
最后,将修改后的配置加载到RUNTIME,并持久化到磁盘:
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
读取查询日志
查询日志的文件是二进制格式的。ProxySQL官方源码中提供了一个简单的小程序(译注:官方没有将该工具打包到rpm包),可以将这个二进制格式的日志以文本的格式输出出来。
$ ./tools/eventslog_reader_sample /var/lib/proxysql/file1.log.00001258
ProxySQL LOG QUERY: thread_id="2" username="root" schemaname=information_schema" client="127.0.0.1:58307" HID=0 server="127.0.0.1:3306" starttime="2016-10-23 12:34:37.132509" endtime="2016-10-23 12:34:38.347527" duration=1215018us digest="0xC5C3C490CA0825C1"
select sleep(1)
ProxySQL LOG QUERY: thread_id="2" username="root" schemaname=information_schema" client="127.0.0.1:58307" HID=0 server="127.0.0.1:3306" starttime="2016-10-23 12:41:38.604244" endtime="2016-10-23 12:41:38.813587" duration=209343us digest="0xE9D6D71A620B328F"
SELECT DATABASE()
ProxySQL LOG QUERY: thread_id="2" username="root" schemaname=test" client="127.0.0.1:58307" HID=0 server="127.0.0.1:3306" starttime="2016-10-23 12:42:38.511849" endtime="2016-10-23 12:42:38.712609" duration=200760us digest="0x524DB8D7A9B4C132"
select aaaaaaa
https://github.com/sysown/proxysql/tree/v1.4.4/tools
要构建该简单小程序,按照以下步骤操作:
- 克隆或下载ProxySQL源码;
- 切换到tools目录;
- 执行
make
该功能的相关探讨
下面列出了几个和该特性有关的探讨:
Issue #561 -- Logging all queries.
Feature Request #871 -- Logging in JSON format for Splunk/ElasticStack, etc.
Feature Request #1184 -- Logging to Embedded Database.
网友评论