常规查询日志是记录mysqld在做什么的常规记录。当客户连接或断联的时候,服务器把信息写入这个日志,它也记录了从客户接收到的每个sql语句。当您怀疑客户端中的错误并且想确切地知道客户端发送到mysqld的内容时,general query log是非常有用的。
客户端连接时的日志,还使用了connection_type指示用于建立连接的协议。connection_type是TCP/IP(没有SSL的TCP/IP连接),SSL/TLS(使用SSL的TCP/IP连接),Socket(Unix socket文件连接),命名管道(windows命名管道连接),或者共享内存(windows共享内存连接)之一。
mysqld以接受语句的顺序来把它们写入到查询日志中,而这可能与执行语句的顺序有所差别。此日志记录顺序与binary log中的相反,其内容是语句在被执行后和锁释放前写入的。另外,查询日志可能会有仅选择数据的语句,而这些语句从不会写入二进制日志。
在复制源服务器上使用基于语句的binary log记录时,其副本接收的语句将写入每个副本的查询日志中。如果客户端使用mysqlbinlog utility程序读取事件并将其传递给服务器,则将语句写入源的查询日志。
但是,当使用基于行的binary log记录时,更新将作为行的更改而不是SQL语句发送,因此,当binlog_format为ROW时,这些语句永远不会写入查询日志。当此变量设置为MIXED时,取决于所使用的语句,给定的更新也可能不会写入查询日志。更多的信息,参见17.2.1节,” 基于语句和基于行的复制的优缺点”。
默认的,general query log是被禁用的。为显示指定初始general query log状态,请使用–general-log={0|1}.如果没有参数或参数为1,则–general_log启用日志。若参数为0,则禁用general log。为指定一个日志文件名,请使用–general_log_file=file_name。为确定日志输出目标,请使用log_output系统变量(如在5.4.1节中所描述,”选择常规查询日志和慢查询日志输出目标”)
注意
如果你指定日志输出目标为表,参见” Log Tables and “Too many open files” Errors”
如果你没有为general query log指定文件名,则默认文件名为host_name.log。除非给出绝对路径名以指定其他目录,否则服务器将在data目录中创建文件。
为了在运行时禁用或者启用general log或者改变文件名,请使用全局系统变量general_log和general_log_file。如果启用日志,服务器将打开日志文件并向其中写入启动消息。但是,除非选择了FILE为日志输出目标,否则不会进一步记录查询日志到文件中。如果输出目标为NONE,则即使启用了常规日志,服务器也不会写入查询。如果日志目标值不包含FILE,则设置日志文件名对日志记录没有作用。
服务器重启和日志刷新不会产生新的general log文件(即使刷新动作关闭并重新打开了日志文件)。为了重命名1和创建一个新文件,使用下面的命令:
在windows上,请使用rename而不是mv
你也可以通过禁用日志来在运行时重命名general log文件:
SET GLOBAL general_log = ‘OFF’;
在禁用日志的情况下,从外部重命名日志文件(例如从命令行)。然后再次启用日志:
SET GLOBAL general_log = ‘ON’;
该方法可以在任何平台工作并且不需要重启服务器。
要为当前会话禁用或启用常规查询日志记录,请将会话sql_log_off变量设置为ON或OFF。(假定常规查询日志本身已启用。)
服务器将重写写在一般查询日志中的语句中的密码,以使它们不会以纯文本形式出现。通过使用–log-raw选项启动服务器,可以抑制常规查询日志的密码重写。此选项对于排查可能有用,以查看服务器接收到的语句的确切文本,但是出于安全原因,不建议将其用于生产。另请参见第6.1.2.3节“密码和日志记录”。
日志重写的含义是,那些无法解析的语句(例如语法错误)不会写入general query log,因为不知道它们有没有密码。那些要把所有语句包括错误的日志都记录下来的场景,则需要使用–log-row选项,请记住,这也绕过了密码重写。
仅当需要纯文本密码时才进行密码重写。对于具有期望密码哈希值的语法的语句,不会进行重写。如果错误地为这种语法提供了纯文本密码,则将按给定的密码记录密码,而不进行重写。
log_timestamps系统变量控制写入一般查询日志文件(以及慢速查询日志文件和错误日志)的消息中时间戳的时区。但它不会影响写入日志表的general query log和slow query log的时区,但是可以使用CONVERT_TZ()或通过设置会话级别的time_zone系统变量,将这些从表中检索的行从本地系统时区转换为任何所需时区。