默认情况下,除Windows系统下的错误日志外,没有启用任何日志(DDL日志始终在需要时创建,并且没有用户可配置的选项);所有已启用日志的文件将被写入MySQL数据目录中,可以通过刷新日志来强制服务器关闭并重新打开日志文件(或在某些情况下切换到新的日志文件)。
可以在运行时控制常规查询日志和慢速查询日志,可以启用或禁用日志记录,或更改日志文件名;可以告诉服务器将常规查询条目和慢速查询条目写入日志表和/或日志文件,中继日志仅用于数据复制中,以保存来自复制源服务器的数据更改,这些更改也必须在备库上进行。
![](https://i-blog.csdnimg.cn/blog_migrate/ce2b47a07e0325a4f899a521b0ebe5a9.png)
如果启用了MySQL日志,则MySQL Server可以灵活控制写入普通查询日志和慢速查询日志的输出目标,具体日志的可能输出目标是日志文件或系统数据库MySQL中的general_log和slow_log表,可以选择文件输出,表输出或两者兼具。
| 服务器启动时的日志控制
log_output系统变量指定日志输出路径,设置该变量本身并不会启用日志,必须分别启用它们。如果log_output在启动时未指定,则默认日志记录目标为FILE;如果log_output在启动时指定,则其值为一个或多个逗号分隔的单词的列表,这些单词选自TABLE(写入到表),FILE(写入到文件)或NONE(不写入到表或文件),NONE(如果存在)优先于任何其他说明符。
- general_log与slow_query_log变量设置一般查询日志和慢查询日志是否已启用(ON)或禁用(OFF),可以在运行时设置这些变量,以控制是否启用日志。
- general_log_file与slow_query_log_file变量设置一般查询日志和慢查询日志文件的名称,可以在服务器启动时或在运行时设置这些变量,以更改日志文件的名称,要禁用或启用当前会话的常规查询日志记录,请将会话sql_log_off变量设置为ON或OFF;如果启用了任一日志,则服务器将打开相应的日志文件并向其中写入启动消息;另外,如果设置了FILE,那么进一步的查询日志记录会写入FILE。
- 要将常规查询日志写入日志表和日志文件,使用 --log_output=TABLE,FILE同时设置两个日志输出目标,使用 --log_output=TABLE选择表作为日志输出目标;要将慢速查询日志仅写入日志文件,同时设置 --log_output=FILE和 --slow_query_log启用慢速查询日志,在这种情况下,由于默认的日志目标是FILE,可以省略该log_output设置。
| 日志表的优点和特征
使用表进行日志输出具有以下好处:
- 日志具有标准格式,可以通过mysql.general_log、mysql.slow_log要显示日志表的当前结构;
- 日志内容可通过SQL语句访问,这样可以使用仅选择满足特定条件的日志的查询,例如,要选择与特定客户端关联的日志内容(这对于识别来自该客户端的有问题的查询很有用),使用日志表比使用日志文件更容易做到这一点。
- 可以通过可以连接到服务器并发出查询的任何客户端远程访问日志(如果客户端具有适当的日志表特权),无需登录到服务器主机并直接访问文件系统。
日志表实现具有以下特征:
-
通常,日志表的主要目的是为用户提供一个界面,以观察服务器的运行时执行情况,而不干扰服务器的运行时执行情况。
-
CREATE TABLE,ALTER TABLE和DROP TABLE是对日志表的有效操作,对于ALTER TABLE和DROP TABLE,日志表无法使用,必须禁用。
-
默认情况下,日志表使用CSV存储引擎以逗号分隔值格式写入数据,对于有权访问包含日志表数据的.CSV文件的用户,这些文件很容易导入到其他程序中,例如可以处理CSV输入的电子表格;可以更改日志表使用MyISAM存储引擎,不能使用ALTER TABLE更改正在使用的日志表,必须先禁用日志,只有CSV或者MyISAM引擎下的日志表才是合法的。
日志表和“打开的文件太多”错误,如果选择TABLE作为日志存储目标并且日志表使用CSV存储引擎,则可能会发现在运行时重复禁用和启用常规查询日志或慢速查询日志会导致打开许多.CSV文件描述符,可能会导致“打开的文件太多” 错误,要解决此问题,执行FLUSH TABLES或确保open_files_limit值大于table_open_cache_instances值。
- 要禁用日志记录,以便可以更改(或删除)日志表,可以使用以下策略,该示例使用常规查询日志,慢查询日志的过程类似,但是使用slow_log表和slow_query_log系统变量。
SET @old_log_state = @@GLOBAL.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
SET GLOBAL general_log = @old_log_state;
-
TRUNCATE TABLE是对日志表的有效操作,它可用于使日志条目过期。
-
RENAME TABLE是对日志表的有效操作,可以使用以下策略自动重命名日志表:
USE mysql;
DROP TABLE IF EXISTS general_log2;
CREATE TABLE general_log2 LIKE general_log;
RENAME TABLE general_log TO general_log_backup, general_log2 TO general_log;
-
CHECK TABLE是对日志表的有效操作。
-
LOCK TABLES不能在日志表上使用。
-
INSERT,DELETE和UPDATE不能在日志表上使用,这些操作仅在服务器内部允许。
-
FLUSH TABLES WITH READ LOCK和read_only系统变量的状态对日志表没有影响,服务器始终可以写入日志表。
-
写入日志表的记录不会写入二进制日志,因此不会复制到副本。
-
要刷新日志表或日志文件,请分别使用FLUSH TABLES或FLUSH LOGS。
-
不允许对日志表进行分区。
-
一个mysqldump的转储包括报表中重新创建这些表,以便它们不会在重新加载转储文件后丢失,日志表的内容不转储。
2020年07月21日
这是一篇带着羞耻心的稍加润色的在线翻译笔记。
推荐指数:❤(给Google Translate)