mysql一共包含如下几种日志:
错误日志:包含启动信息、错误信息
通用查询日志:包含普通查询
慢查询日志:查询时间大于指定值的日志
二进制日志:用于灾备,恢复数据
如果启用了这些日志,MySQL Server可以灵活地控制写入常规查询日志和慢查询日志的输出目标。 输出目标可能是日志文件或mysql系统数据库中的general_log和slow_log表。 可以选择文件输出,表格输出或两者。
Property | Value |
---|---|
命令行格式 | --log-output=name |
系统变量 | log_output |
范围 | Global |
动态 | Yes |
类型 | Set |
默认值 | FILE |
有效值 |
|
log_output系统变量指定日志输出的目标。 设置此变量本身不会启用日志; 必须单独启用它们。
如果在启动时未指定log_output,则默认日志记录目标为FILE。
如果在启动时指定了log_output,则其值是一个列表,其中包含从TABLE(日志到表),FILE(日志到文件)或NONE(不记录到表或文件)中选择的一个或多个逗号分隔的单词。 NONE(如果存在)优先于任何其他说明符。
错误日志包含mysqld启动和关闭时间的记录。它还包含诊断消息,例如在服务器启动和关闭期间以及服务器运行时发生的错误,警告和注释。例如,如果mysqld注意到需要自动检查或修复表,它会将消息写入错误日志。
在某些操作系统上,如果mysqld异常退出,则错误日志包含堆栈跟踪。跟踪可用于确定mysqld退出的位置。
--log-error[=
file_name
]
Property | Value |
---|---|
命令行格式 | --log-error[=file_name] |
系统变量 | log_error |
范围 | Global |
动态 | No |
类型 | 文件名称 |
错误日志输出文件目的地
log_error_verbosity
Property | Value |
---|---|
命令行格式 | --log-error-verbosity=# |
系统变量 | log_error_verbosity |
范围 | Global |
动态 | Yes |
类型 | Integer |
默认值 | 3 |
最小值 | 1 |
最大值 | 3 |
服务器在向错误日志写入错误,警告和注释消息时的详细程度
Desired Log Filtering | log_error_verbosity Value |
---|---|
错误消息 | 1 |
错误和警告消息 | 2 |
错误、警告、信息消息 | 3 |
在Windows上,mysqld使用--log-error, - pid-file和--console选项来确定mysqld是将错误日志写入控制台还是文件,如果是文件,则确定文件名:
如果给出--console,mysqld会将错误日志写入控制台。 ( - 如果给出两者,则--console优先于--log-error,并且以下关于--log-error的项目不适用。在MySQL 5.7之前,这是相反的: - log-error优先于 - 安慰。)
如果未给出--log-error,或者在没有命名文件的情况下给出,则mysqld会将错误日志写入数据目录中名为host_name.err的文件,除非指定了--pid-file选项。在这种情况下,文件名是PID文件基本名称,数据目录中的后缀为.err。
如果给出了命名文件的--log-error,mysqld会将错误日志写入该文件(如果名称没有后缀,则添加.err后缀),位于数据目录下,除非给出指定的绝对路径名不同的位置。
如果服务器将错误日志写入控制台,则会将log_error系统变量设置为stderr。否则,服务器将错误日志写入文件并将log_error设置为文件名。
此外,服务器默认将事件和错误消息写入应用程序日志中的Windows事件日志:
标记为“错误”,“警告”和“注释”的条目将写入事件日志,但不会写入各个存储引擎的信息语句等消息。
事件日志条目具有MySQL源。
写入事件日志的信息是使用log_syslog系统变量控制的,该变量在Windows上默认启用。
在Unix和类Unix系统上,mysqld使用--log-error选项来确定mysqld是将错误日志写入控制台还是文件,如果是文件,则确定文件名:
如果未给出--log-error,mysqld会将错误日志写入控制台。
如果在没有命名文件的情况下给出了--log-error,mysqld会将错误日志写入数据目录中名为host_name.err的文件。
如果给出了命名文件的--log-error,mysqld会将错误日志写入该文件(如果名称没有后缀,则添加.err后缀),位于数据目录下,除非给出指定的绝对路径名不同的位置。
如果在[mysqld],[server]或[mysqld_safe]部分的选项文件中给出了--log-error,mysqld_safe会找到并使用该选项,并将其传递给mysqld。
注意
Yum或APT软件包安装通常在/ var / log下使用服务器配置文件中的log-error = / var / log / mysqld.log选项配置错误日志文件位置。从选项中删除文件名会导致使用数据目录中的host_name.err文件。
如果服务器将错误日志写入控制台,则会将log_error系统变量设置为stderr。否则,服务器将错误日志写入文件并将log_error设置为文件名。
mysqld可以将错误日志写入系统日志(Windows上的事件日志,Unix和类Unix系统上的syslog)。为此,请使用以下系统变量:
log_syslog:启用此变量以将错误日志发送到系统日志。 (在Windows上,默认情况下启用log_syslog。)
如果启用了log_syslog,则以下系统变量也可用于更精细的控制。
log_syslog_facility:syslog消息的默认设施是守护进程。设置此变量以指定其他工具。
log_syslog_include_pid:是否在每行syslog输出中包含服务器进程ID。
log_syslog_tag:此变量定义要添加到syslog消息中的服务器标识符(mysqld)的标记。如果已定义,则标记将附加到带有前导连字符的标识符。
注意
记录到系统日志时出错可能需要额外的系统配置。请参阅所用平台的系统日志文档。
在Unix和类Unix系统上,使用mysqld_safe也可以控制输出到syslog,它可以捕获服务器错误输出并将其传递给syslog。
注意
不建议使用mysqld_safe进行syslog错误记录;您应该使用服务器系统变量。
mysqld_safe有三个错误记录选项, - syslog, - skip-syslog和--log-error。没有日志记录选项或使用--skip-syslog的默认值是使用默认日志文件。要明确指定错误日志文件的使用,请将--log-error = file_name指定为mysqld_safe,然后安排mysqld将消息写入日志文件。要使用syslog,请指定--syslog选项。对于syslog输出,可以使用--syslog-tag = tag_val指定标记;这将附加到带有前导连字符的mysqld服务器标识符。
log_error_verbosity系统变量控制服务器详细程度,以便将错误,警告和注释消息写入错误日志。
允许的值为1(仅错误),2(错误和警告),3(错误,警告和注释),默认值为3.如果该值大于2,则服务器记录中止的连接和访问被拒绝的错误 用于新的连接尝试。
错误日志消息中包含的ID是mysqld中负责编写消息的线程的ID。 这表示服务器的哪个部分生成了消息,并且与通用查询日志和慢查询日志消息(包括连接线程ID)一致。
log_timestamps系统变量控制写入错误日志的消息中的时间戳的时区(以及常规查询日志和慢查询日志文件)。 允许的值为UTC(默认值)和SYSTEM(本地系统时区)。
如果使用FLUSH ERROR LOGS,FLUSH LOGS或mysqladmin flush-logs刷新日志,服务器将关闭并重新打开它正在写入的任何错误日志文件。要重命名错误日志文件,请在刷新之前手动执行此操作。刷新日志然后打开一个包含原始文件名的新文件。例如,假设日志文件名为host_name.err,要重命名该文件并创建新文件,请使用以下命令:
mv host_name.err host_name.err-old
mysqladmin flush-logs
mv host_name.err-old backup-directory
在Windows上,使用重命名而不是mv。
如果服务器无法写入错误文件的位置,则日志刷新操作将无法创建新的日志文件。例如,在Linux上,服务器可能会将错误日志写为/var/log/mysqld.log,其中/ var / log由root拥有,而不能由mysqld写入。有关处理此案例的信息,请参见第5.4.7节“服务器日志维护”。
如果服务器未写入命名的错误日志文件,则刷新日志时不会发生错误日志文件重命名。
general_log
Property | Value |
---|---|
命令行格式 | --general-log[={OFF|ON}] |
系统变量 | general_log |
范围 | Global |
动态 | Yes |
类型 | Boolean |
默认值 | OFF |
是否启用常规查询日志。 该值可以是0(或OFF)以禁用日志,或者1(或ON)以启用日志。 默认值取决于是否给出了--general_log选项。
general_log_file
Property | Value |
---|---|
命令行格式 | --general-log-file=file_name |
系统变量 | general_log_file |
范围 | Global |
动态 | Yes |
类型 | File name |
默认值 | host_name.log |
常规查询日志文件的名称。 默认值为hosthost.log
log_timestamps
Property | Value |
---|---|
命令行格式 | --log-timestamps=# |
系统变量 | log_timestamps |
范围 | Global |
动态 | Yes |
类型 | Enumeration |
默认值 | UTC |
有效值 |
|
此变量控制写入错误日志的消息中的时间戳的时区,以及写入文件的一般查询日志和慢查询日志消息。 它不会影响一般查询日志的时区和写入表的慢查询日志消息(mysql.general_log,mysql.slow_log)。 从这些表中检索的行可以使用CONVERT_TZ()或通过设置会话time_zone系统变量从本地系统时区转换为任何所需的时区。
允许的log_timestamps值是UTC(默认值)和SYSTEM(本地系统时区)。
通用查询日志是mysqld正在执行的操作的一般记录。 当客户端连接或断开连接时,服务器会将信息写入此日志,并记录从客户端收到的每个SQL语句。 当您怀疑客户端中存在错误并想要确切知道客户端发送给mysqld的内容时,通用查询日志非常有用。
mysqld按照接收它们的顺序将语句写入查询日志,这可能与它们的执行顺序不同。此日志记录顺序与二进制日志的日志顺序形成对比,二进制日志的语句在执行后但在释放任何锁之前写入。此外,查询日志可能包含仅选择数据的语句,而这些语句永远不会写入二进制日志。
在复制主服务器上使用基于语句的二进制日志记录时,其从属接收的语句将写入每个从属服务器的查询日志中。如果客户端使用mysqlbinlog实用程序读取事件并将它们传递给服务器,则会将语句写入主服务器的查询日志。
但是,使用基于行的二进制日志记录时,更新将作为行更改而不是SQL语句发送,因此当binlog_format为ROW时,这些语句永远不会写入查询日志。当此变量设置为MIXED时,也可能不会将给定更新写入查询日志,具体取决于所使用的语句。
默认情况下,禁用常规查询日志。要显式指定初始常规查询日志状态,请使用--general_log [= {0 | 1}]。如果没有参数或参数为1,则--general_log启用日志。如果参数为0,则此选项会禁用日志。要指定日志文件名,请使用--general_log_file = file_name。要指定日志目标,请使用log_output系统变量
log_timestamps系统变量控制写入通用查询日志文件(以及慢查询日志文件和错误日志)的消息中的时间戳的时区。 它不会影响一般查询日志的时区和写入日志表的慢查询日志消息,但从这些表中检索的行可以使用CONVERT_TZ()或通过设置会话从本地系统时区转换到任何所需的时区 time_zone系统变量。
MySQL, Version: 5.7.26-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time Id Command Argument
2019-06-18T06:36:37.742187Z 2 Connect root@localhost on using TCP/IP
2019-06-18T06:36:37.742187Z 2 Query set autocommit=1
2019-06-18T06:36:37.742187Z 2 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2019-06-18T06:36:37.742187Z 2 Query SHOW SESSION VARIABLES LIKE 'lower_case_table_names'
2019-06-18T06:36:37.742187Z 2 Query SELECT current_user()
2019-06-18T06:36:37.742187Z 2 Query SET CHARACTER SET utf8
2019-06-18T06:36:37.742187Z 2 Query SET NAMES utf8
2019-06-18T06:36:37.742187Z 2 Query SELECT CONNECTION_ID()
2019-06-18T06:36:37.742187Z 2 Query SHOW SESSION STATUS LIKE 'Ssl_cipher'
2019-06-18T06:36:37.742187Z 2 Query set autocommit=1
2019-06-18T06:36:37.757812Z 2 Query SHOW CREATE TABLE mysql.slow_log
'CREATE TABLE `general_log` (
`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log''
二进制日志包含描述数据库更改的“事件”,例如表创建操作或对表数据的更改。它还包含可能已进行更改的语句的事件(例如,不匹配任何行的DELETE),除非使用基于行的日志记录。二进制日志还包含有关每个语句获取更新数据的时间长度的信息。
二进制日志的目的:
主从复制:主复制服务器上的二进制日志提供要发送到从属服务器的数据更改的记录。主服务器将其二进制日志中包含的事件发送到其从属服务器,这些服务器执行这些事件以对主服务器上的数据进行相同的更改。
数据恢复:某些数据恢复操作需要使用二进制日志。还原备份后,将重新执行备份后记录的二进制日志中的事件。这些事件使数据库从备份点更新。
二进制日志不用于不修改数据的SELECT或SHOW等语句。 要记录所有语句(例如,标识问题查询),请使用常规查询日志。
运行启用了二进制日志记录的服务器会使性能稍慢。 但是,二进制日志使您能够设置复制和还原操作的好处通常会超过此次要性能下降。
二进制日志通常对意外暂停具有弹性,因为只记录或回读完整的事务。
写入二进制日志的语句中的密码由服务器重写,不会以纯文本形式出现。
要启用二进制日志,请使用--log-bin [= base_name]选项启动服务器。 如果没有给出base_name值,则默认名称是pid-file选项的值(默认情况下是主机的名称),后跟-bin。 如果给出了基本名称,则服务器会将该文件写入数据目录
mysqld将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名。 每次服务器创建新日志文件时,该数字都会增加,从而创建一系列有序的文件。 每次启动或刷新日志时,服务器都会在系列中创建一个新文件。 在当前日志的大小达到max_binlog_size后,服务器还会自动创建新的二进制日志文件。 如果您使用大型事务,则二进制日志文件可能会变得比max_binlog_size大,因为事务是以一个部分写入文件,而不是在文件之间分割。
为了跟踪已使用的二进制日志文件,mysqld还创建了一个二进制日志索引文件,其中包含二进制日志文件的名称。 默认情况下,它具有与二进制日志文件相同的基本名称,扩展名为“.index”。 您可以使用--log-bin-index [= file_name]选项更改二进制日志索引文件的名称。
默认情况下,服务器记录事件的长度以及事件本身,并使用它来验证事件是否正确写入。您还可以通过设置binlog_checksum系统变量使服务器为事件编写校验和。从二进制日志中读回时,主服务器默认使用事件长度,但如果可用,则可以通过启用master_verify_checksum系统变量来使用校验和。从I / O线程还验证从主站接收的事件。通过启用slave_sql_verify_checksum系统变量,从中继日志读取时,可以使从属SQL线程使用校验和(如果可用)。
二进制日志中记录的事件格式取决于二进制日志记录格式。支持三种格式类型,基于行的日志记录,基于语句的日志记录和基于混合的日志记录。
服务器以与--replicate-do-db和--replicate-ignore-db选项相同的方式评估--binlog-do-db和--binlog-ignore-db选项。
在语句或事务完成之后但在释放任何锁定或完成任何提交之前立即执行二进制日志记录。 这可确保以提交顺序记录日志。
非事务性表的更新在执行后立即存储在二进制日志中。
在未提交的事务中,更改事务表(如InnoDB表)的所有更新(UPDATE,DELETE或INSERT)都将被缓存,直到服务器收到COMMIT语句为止。 此时,mysqld在执行COMMIT之前将整个事务写入二进制日志。
--log-bin[=
base_name
]
Property | Value |
---|---|
命令行格式 | --log-bin=file_name |
类型 | 文件名 |
二进制日志基本名称
max_binlog_size
Property | Value |
---|---|
命令行格式 | --max-binlog-size=# |
系统变量 | max_binlog_size |
范围 | Global |
动态 | Yes |
类型 | Integer |
默认值 | 1073741824 |
最小值 | 4096 |
最大值 | 1073741824 |
如果对二进制日志的写入导致当前日志文件大小超过此变量的值,则服务器将轮换二进制日志(关闭当前文件并打开下一个文件)。 最小值为4096字节。 最大值和默认值为1GB。
事务在一个块中写入二进制日志,因此它永远不会在几个二进制日志之间拆分。 因此,如果您有大事务,您可能会看到大于max_binlog_size的二进制日志文件。
--log-bin-index[=
file_name
]
Property | Value |
---|---|
命令行格式 | --log-bin-index=file_name |
系统变量 | log_bin_index |
范围 | Global |
动态 | No |
类型 | 文件名称 |
二进制日志索引文件的名称,其中包含二进制日志文件的名称。 默认情况下,它具有与使用--log-bin选项为二进制日志文件指定的值相同的位置和基本名称,以及扩展名.index。
--binlog-do-db=
db_name
Property | Value |
---|---|
命令行格式 | --binlog-do-db=name |
类型 | String |
二进制日志应用的数据库名称
--binlog-ignore-db=
db_name
Property | Value |
---|---|
Command-Line Format | --binlog-ignore-db=name |
Type | String |
二进制日志忽略的数据库名称
binlog_cache_size
Property | Value |
---|---|
命令行格式 | --binlog-cache-size=# |
系统变量 | binlog_cache_size |
范围 | Global |
动态 | Yes |
类型 | Integer |
默认值 | 32768 |
最小值 | 4096 |
最大值(64位平台) | 18446744073709551615 |
最大值(32位平台) | 4294967295 |
用于在事务期间保留对二进制日志的更改的缓存大小。
binlog_checksum
Property | Value |
---|---|
命令行格式 | --binlog-checksum=name |
系统变量 | binlog_checksum |
范围 | Global |
动态 | Yes |
类型 | String |
默认值 | CRC32 |
有效值 |
|
启用后,此变量会使主服务器为二进制日志中的每个事件写入校验和