普通查询日志是记录mysqld所做的所有操作的日志。当客户端连接或断开连接时,服务器将信息写入该日志,并记录来自客户端的每个 SQL 语句。如果您怀疑客户端出现错误并想知道客户端发送给mysqld的确切内容,该日志非常有用。
每行显示客户端连接的信息还包括 using
,以指示用于建立连接的协议。connection_type
connection_type
可以是 TCP/IP
(使用 SSL/TLS 的 TCP/IP 连接)、SSL/TLS
(使用 SSL/TLS 的 TCP/IP 连接)、Socket
(Unix 套接字文件连接)、Named Pipe
(Windows 命名管道连接)或 Shared Memory
(Windows 共享内存连接)。
mysqld 按照收到的顺序将语句写入查询日志,这可能与执行顺序不同。这与二进制日志的记录顺序不同,二进制日志是在语句执行后但在释放锁之前记录的。此外,查询日志可能包含仅选择数据的语句,而这些语句从不写入二进制日志。
当在复制源服务器上使用基于语句的二进制日志时,来自其副本的语句将被写入每个副本的查询日志。如果客户端使用 mysqlbinlog 实用程序读取事件并将其传递给服务器,则语句将被写入源服务器的查询日志。
然而,当使用基于行的二进制日志时,更新将作为行更改而不是 SQL 语句发送,因此这些语句在 binlog_format
设置为 ROW
时从不写入查询日志。当该变量设置为 MIXED
时,给定的更新也可能不会被写入查询日志,具体取决于使用的语句。请参阅 第 19.2.1.1 节,“基于语句和基于行的复制的优缺点”,以获取更多信息。
默认情况下,普通查询日志是禁用的。要明确指定普通查询日志的初始状态,请使用 --general_log[={0|1}]
。如果没有参数或参数为 1,则 --general_log
启用日志。如果参数为 0,则禁用日志。要指定日志文件名,请使用 --general_log_file=
。要指定日志目标,请使用 file_name
log_output
系统变量(如 第 7.4.1 节,“选择普通查询日志和慢查询日志输出目标” 中所述)。
如果您指定了 TABLE
日志目标,请参阅 日志表和“打开文件太多”错误。
如果您没有指定普通查询日志文件的名称,默认名称为
。服务器将文件创建在数据目录中,除非指定了绝对路径名以指定不同的目录。host_name
.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
系统变量将行从本地系统时区转换为任何所需的时区。