通用查询日志是 mysqld 操作的常规记录。当客户端连接或断开连接时,服务器会将信息写入此日志,并且会记录从客户端收到的每个 SQL 语句。当您怀疑客户端出现错误并希望确切了解客户端发送给 mysqld 的内容时,通用查询日志非常有用。
每行显示客户端连接时间时,还会包含 使用
,以指示用于建立连接的协议。连接类型
连接类型
是 TCP/IP
(未经 SSL 建立的 TCP/IP 连接)、SSL/TLS
(经 SSL 建立的 TCP/IP 连接)、套接字
(Unix 套接字文件连接)、命名管道
(Windows 命名管道连接)或 共享内存
(Windows 共享内存连接)之一。
mysqld 按接收语句的顺序将语句写入查询日志,这可能与执行语句的顺序不同。此日志记录顺序与二进制日志的顺序相反,对于二进制日志,语句是在执行后但在释放任何锁之前写入的。此外,查询日志可能包含仅选择数据的语句,而这些语句永远不会写入二进制日志。
在复制源服务器上使用基于语句的二进制日志记录时,其副本接收到的语句将写入每个副本的查询日志。如果客户端使用 mysqlbinlog 实用程序读取事件并将其传递给服务器,则语句将写入源的查询日志。
但是,当使用基于行的二进制日志记录时,更新将作为行更改而不是 SQL 语句发送,因此当 binlog_format
为 ROW
时,这些语句永远不会写入查询日志。当此变量设置为 MIXED
时,也可能不会将给定的更新写入查询日志,具体取决于所使用的语句。有关更多信息,请参阅第 19.2.1.1 节“基于语句和基于行的复制的优缺点”。
默认情况下,通用查询日志处于禁用状态。要显式指定初始通用查询日志状态,请使用 --general_log[={0|1}]
。如果没有参数或参数为 1,--general_log
将启用日志。如果参数为 0,则此选项将禁用日志。要指定日志文件名,请使用 --general_log_file=
。要指定日志目标,请使用 文件名
log_output
系统变量(如第 7.4.1 节“选择通用查询日志和慢查询日志输出目标”中所述)。
如果指定 TABLE
日志目标,请参阅日志表和“打开的文件过多”错误。
如果未为通用查询日志文件指定名称,则默认名称为
。服务器将在数据目录中创建该文件,除非给出绝对路径名以指定其他目录。主机名
.log
要在运行时禁用或启用通用查询日志或更改日志文件名,请使用全局 general_log
和 general_log_file
系统变量。将 general_log
设置为 0(或 OFF
)以禁用日志,或设置为 1(或 ON
)以启用日志。设置 general_log_file
以指定日志文件的名称。如果日志文件已打开,则将其关闭并打开新文件。
当启用通用查询日志时,服务器会将输出写入 log_output
系统变量指定的任何目的地。如果您启用了日志,服务器会打开日志文件并将启动消息写入其中。但是,除非选择了 FILE
日志目标,否则不会将查询进一步记录到文件中。如果目标是 NONE
,即使启用了通用日志,服务器也不会写入任何查询。如果日志目标值不包含 FILE
,则设置日志文件名对日志记录没有影响。
服务器重启和日志刷新不会生成新的通用查询日志文件(尽管刷新会关闭并重新打开它)。要重命名文件并创建一个新文件,请使用以下命令
$> mv host_name.log host_name-old.log
$> mysqladmin flush-logs general
$> 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
选项启动服务器来抑制通用查询日志的密码重写。此选项可能对诊断目的有用,可以查看服务器接收到的语句的确切文本,但出于安全原因,不建议在生产环境中使用。另请参阅 第 8.1.2.3 节“密码和日志记录”。
密码重写的一个含义是,无法解析的语句(例如,由于语法错误)不会写入通用查询日志,因为无法知道它们是否没有密码。需要记录所有语句(包括包含错误的语句)的用例应使用 --log-raw
选项,但请记住,这也会绕过密码重写。
仅当预期使用明文密码时,才会进行密码重写。对于语法上需要密码哈希值的语句,不会进行重写。如果为此类语法错误地提供了明文密码,则会按原样记录密码,而不会进行重写。
log_timestamps
系统变量控制写入通用查询日志文件(以及慢查询日志文件和错误日志)的消息中时间戳的时区。它不会影响写入日志表的通用查询日志和慢查询日志消息的时区,但可以从这些表中检索到的行可以使用 CONVERT_TZ()
从本地系统时区转换为任何所需的时区,或通过设置会话 time_zone
系统变量。