1. 日志内容及作用
常规查询日志是对mysqld正在做的事情的常规记录。当客户端连接或断开连接时,服务器会将信息写入此日志,并记录从客户端收到的每个SQL语句。当您怀疑客户端中的错误并且想确切地知道客户端发送给mysqld的内容时,常规查询日志非常有用。
2. 日志记录格式
每行展示的信息包括
- 客户端的连接时间
- 使用的连接类型 (用来建立连接的协议)
连接类型 | 描述 |
---|---|
TCP/IP | TCP/IP connection established without SSL |
SSL/TLS | TCP/IP connection established with SSL |
Socket | Unix socket file connection |
Named Pipe | Windows named pipe connection |
Shared Memory | Windows shared memory connection |
mysqld按照接收语句的顺序将语句写入查询日志,这可能与它们执行的顺序不同。此日志记录顺序与二进制日志相反,二进制日志的执行顺序是在语句执行之后但释放任何锁之前。此外,查询日志可能包含仅查询数据的语句,而这些语句从未写入二进制日志。
在复制源服务器上使用基于语句的二进制日志记录时,其副本接收的语句将写入每个副本的查询日志中。如果客户端使用mysqlbinlog实用程序读取事件并将其传递给服务器,则将语句写入源的查询日志 。
但是,当使用基于行的二进制日志记录时,更新将作为行更改而不是SQL语句发送,因此,当binlog_format
是ROW
时,这些语句永远不会写入查询日志 。当此变量设置为时MIXED
,取决于所使用的语句,给定的更新也可能不会写入查询日志。
3. 日志状态及设置
默认情况下,常规查询日志处于禁用状态。要明确指定初始常规查询日志状态,请使用 --general_log[={0|1}\]
。
- 不带参数或参数为1时,
--general_log
启用日志。 - 参数为0时,此选项禁用日志。
- 要指定日志文件名,请使用
--general_log_file=file_name
。 - 要指定日志目标,请使用系统变量
log_output
注意
如果指定TABLE
日志目标,请参阅 日志表和“打开的文件太多”错误。
如果您没有为常规查询日志文件指定名称,则默认名称为 host_name
.log。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中创建文件。
要在运行时禁用或启用常规查询日志或更改日志文件名,请使用全局 变量general_log
和 general_log_file
系统变量。
- 设置
general_log
为0(或OFF
)可禁用日志,设置为1(或ON
)可启用日志 。 - 设置
general_log_file
以指定日志文件的名称。如果已经打开了日志文件,则将其关闭并打开新文件。
启用常规查询日志后,服务器会将输出写入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
您还可以在运行时通过禁用日志来重命名常规查询日志文件:
SET GLOBAL general_log = 'OFF';
在禁用日志的情况下,从外部重命名日志文件(例如,从命令行)。然后再次启用日志:
SET GLOBAL general_log = 'ON';
此方法可在任何平台上使用,并且不需要重新启动服务器。
要禁用或启用当前会话的常规查询日志记录,请将会话sql_log_off
变量设置 为 ON
或OFF
。(这假定常规查询日志本身已启用。)
4. 密码重写
服务器将重写写在一般查询日志中的语句中的密码,以使它们不会以纯文本形式出现。通过使用--log-raw
选项启动服务器来抑 制常规查询日志的密码重写 。此选项对于诊断目的可能有用,以查看服务器接收到的语句的确切文本,但是出于安全原因,不建议将其用于生产。
密码重写的含义是,无法解析的语句(例如由于语法错误)不会写入通用查询日志,因为无法知道它们没有密码。(这句话不是特别理解)需要记录所有语句(包括出错语句)的用例应使用该 --log-raw
选项,请牢记这也绕过了密码重写。
仅当需要纯文本密码时才进行密码重写。对于语法要求密码哈希值的语句,不会进行重写。如果错误地为这种语法提供了纯文本密码,则将按给定的密码记录密码,而不进行重写。例如,由于需要输入密码哈希值,因此记录了以下语句,如下所示:
CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';
所述log_timestamps
系统变量控制在写入到通用查询日志文件消息的时间戳的时区(以及慢查询日志文件和错误日志)。它不影响写入日志表的常规查询日志和慢速查询日志消息的时区,但是CONVERT_TZ()
通过设置会话time_zone
系统变量或通过设置会话系统变量,可以将从这些表中检索的行从本地系统时区转换为任何所需时区 。