MySQL 通用查询日志

通用查询日志是mysqld所生成的记录。当客户端连接或断开时和从客户端接收到每个SQL语句时服务器会写信息到通用查询日志。当怀疑客户端有错误并且想了解客户端发送给mysqld的信息时通用查询日志非常有用。

当一个客户端连接时显示的每一行也包括using connection_type来指示建立连接的协议。connection_type是TCP/IP(不使用SSL的TCP/IP连接),SSL/TLS(使用SSL的TCP/IP连接),Socket(Unix socket file连接),Named Pipe(Windows命名管道连接),或Shared Memory(Windows共享内存连接)。

mysqld以它所接收到的语句顺序将它们写入通用查询日志,这可能不同于语句被执行的顺序。这个日志顺序与二进制日志顺序相反,语句会在执行之后但在任何锁被释放之前被写入通用查询日志。另外查询日志可能包含那些只查询数据但从没被写入二进制日志的语句。

当在一个复制主服务器上使用基于语句的二进制日志时,通过从服务器所接收到的语句会被写入每个从服务器的查询日志中。如果客户端使用mysqlbinlog工具读取事件并将它们传递给服务器,那么语句会被写入主服务器的查询日志中。

然而当使用基于行记录的二进制日志时,更新会被当作行改变被发送而不是SQL语句,并且当binlog_format为ROW时这些语句从来不会被写入查询日志。当这个变量设置为MIXED时依赖于语句的使用,指定的更新也可能不会被写入查询日志。

默认情况下,通用查询日志是被禁用的。为了显式指定初始化通用查询日志状态,使用–general_log[={0|1}]。没有参数或者参数为1,–general_log启用日志。当这个参数为0,这个选项将禁用日志。为了指定一个日志文件名,使用–general_log_file=file_name。为了指定日志目录,使用–log-output。

如果对通用查询日志文件没有指定文件名,默认名字为host_name.log。除非指定一个绝对路径来指定不同的目录否则服务器将在数据目录中创建日志文件名。

为了在运行时禁用或启用通用查询日志或改变日志文件名,使用全局general_log和general_log_file系统变量。设置general_log为0(或OFF)来禁用日志或1(或ON)来启用日志。设置general_log_file指定日志文件名。如果一个日志文件已经被opne,将会关闭它并打开新文件。

当通用查询日志被启用时,服务器将输出写入到由–log-output选项或log_output系统变量所指定的任何目录。如果启用日志,服务器将打开日志文件并将启动信息写入日志文件。然而除非FILE日志目录被选定否则更多的查询日志不会写入日志文件。如果日志目录为NONE,即使通用查询日志被启用服务器也不会将查询写入日志文件。如果日志目录值不包括FILE,设置日志文件名不会影响日志记录。

服务器重启和日志刷新不会导致生成新的通用查询日志文件(虽然刷新会关闭和重新打开日志文件)。为了重命名文件并创建新文件,使用以下命令:

shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> mv host_name-old.log backup-directory

在Windows上,使用rename而不是mv

通过禁用日志也可以在运行时重命名通用查询日志

set global general_log='OFF';

当禁用日志后,在外部重命名日志文件,例如,通过命令行。然后再次启用日志:

set global general_log='ON';

这种方法可以在任何平台上工作并且不需要重启服务器。

对于当前连接会话级变量sql_log_off可以被设置为ON或OFF来启用或禁用通用查询日志。

写入通用查询日志的语句中的密码由服务器重写,不会以明文形式出现。密码重写对于通用查询日志来说是可以禁上的通过在服务器启动时使用–log-raw选项。这个选项对于诊断来说非常有用,为了查看服务器所接收到的精确语句文本,但由于安全原因不建议在生产环境中使用。

密码重写的一个含义是,不能被解析的语句(例如,由于语法错误)不会被写入通用查询日志,因为它们不能被认为是没有密码的。需要记录所有语句(包括有错误的语句)的用例应该使用——log-raw选项,记住这也可以绕过密码重写。

只有在预期使用纯文本密码时才会发生密码重写。对于具有期望密码散列值的语法的语句,不发生重写。如果为这种语法错误地提供了纯文本密码,则按给定的方式记录密码,而不进行重写。例如,如下所示记录下的语句,因为需要密码散列值

CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';

log_timestamps系统变量控制首写入通用查询日志中信息的时区(对慢查询日志文件和错误日志也一样)。它不会影响写入日志表中的通用查询日志和慢查询日志信息的时区,但从这些表中检索行记录使用convert_tz()或设置会话变量time_zone系统变量可以将本地系统时区转换为任何你所期待的时区。

发表评论

电子邮件地址不会被公开。