JeeStudy 发表于 2020-4-17 19:41:41

MySQL8.0大师之路:第11章:MySQL服务器管理-11.4 MySQL 普通查询日志和慢查询日志

如果启用了MySQL日志,MySQL Server可以灵活控制写入普通查询日志和慢查询日志的输出目标。日志条目的可能目标是日志文件或mysql 数据库中的general_log和slow_log表。可以选择文件输出,表输出或两者兼顾。


服务器启动时配置日志
系统变量 log_output 指定日志输出的目标。设置此变量本身并不会启用日志。必须分别启用它们。
•如果在启动时未指定log_output,则默认日志记录目标为FILE。
•如果在启动时指定了log_output,则它的值是一个列表,该列表从TABLE(记录到表),FILE(记录到文件)或NONE(不记录到表或文件)中选择一个或多个逗号分隔的单词。如果存在,则NONE优先级最高(即配置了NONE后不记录日志)。


系统变量 general_log 控制针对所选日志目标的日志记录到常规查询日志。如果在服务器启动时指定,则general_log采用1或0的可选参数来启用或禁用日志。要指定文件记录的默认名称以外的其他文件名,请设置general_log_file变量。类似地,系统变量slow_query_log 控制着将日志记录到所选目标的慢查询日志中,而设置slow_query_log_file则指定了用于文件日志记录的文件名。如果启用了任何一个日志,则服务器将打开相应的日志文件并向其中写入启动消息。但是,除非选择了文件日志目的地,否则不会对文件的查询进行进一步的日志记录。


示例:
•要将常规查询日志条目写入日志表和日志文件,请使用--log_output = TABLE,FILE选择日志目标,并使用--general_log启用常规查询日志。
•要将常规查询日志和慢查询日志条目仅写入日志表,请使用--log_output = TABLE选择表作为日志目标,并使用--general_log和--slow_query_log启用这两个日志。
•要将慢速查询日志条目仅写入日志文件,请使用--log_output = FILE选择文件作为日志目标,并使用--slow_query_log启用慢速查询日志。在这种情况下,由于默认的日志目标是FILE,因此您可以省略log_output设置。




运行时的日志控制
通过与日志表和文件关联的系统变量,可以对日志进行运行时控制:
•log_output变量指示当前的日志目标。可以在运行时对其进行修改以更改目标。
•general_log和slow_query_log变量指示启用(ON)还是禁用(OFF)常规查询日志和慢速查询日志。您可以在运行时设置这些变量,以控制是否启用日志。
•general_log_file和slow_query_log_file变量指示常规查询日志和慢速查询日志文件的名称。您可以在服务器启动时或在运行时设置这些变量,以更改日志文件的名称。
•要禁用或启用当前会话的常规查询日志记录,请将会话sql_log_off变量设置为ON或OFF。 (这假定常规查询日志本身已启用。)




日志表的优点和特征
使用表进行日志输出具有以下优点:
•日志条目具有标准格式。要显示日志表的当前结构,请使用以下语句:
mysql> SHOW CREATE TABLE mysql.general_log;
mysql> 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 unsigned NOT NULL,
`server_id` int unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumblob NOT NULL

) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'




CREATE TABLE `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) NOT NULL,
`rows_sent` int NOT NULL,
`rows_examined` int NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int NOT NULL,
`insert_id` int NOT NULL,
`server_id` int unsigned NOT NULL,
`sql_text` mediumblob NOT NULL,
`thread_id` bigint unsigned NOT NULL

) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'


•日志内容可通过SQL语句访问。这样可以使用仅选择满足特定条件的日志条目的查询。例如,要选择与特定客户端关联的日志内容(这对于从该客户端识别有问题的查询很有用),使用日志表比使用日志文件更容易做到这一点。
•可以通过任何可以连接到服务器并发出查询的客户端远程访问日志(如果客户端具有适当的日志表特权)。无需登录到服务器主机并直接访问文件系统。


日志表实现 具有以下特征:
•通常,日志表的主要目的是为用户提供一个界面,以观察服务器的运行时执行情况,而不干扰服务器的运行时执行情况。
•CREATE TABLE,ALTER TABLE和DROP TABLE是对日志表的有效操作。对于ALTER TABLE和DROP TABLE,日志表无法使用,必须禁用。
•默认情况下,日志表使用CSV存储引擎,该存储引擎以逗号分隔的值格式写入数据。对于有权访问包含日志表数据的.CSV文件的用户,这些文件很容易导入到其他程序中,例如可以处理CSV输入的电子表格。
可以更改日志表以使用MyISAM存储引擎。您不能使用ALTER TABLE更改正在使用的日志表。必须先禁用日志。除CSV或MyISAM之外,没有其他引擎可用于日志表。
Log Tables and “Too many open files” Errors.
如果您选择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。这些操作仅在服务器内部允许。
•带读取锁定的刷新表和read_only系统变量的状态对日志表没有影响。服务器始终可以写入日志表。
•写入日志表的条目不会写入二进制日志,因此不会复制到从属服务器。
•要刷新日志表或日志文件,请分别使用FLUSH TABLES或FLUSH LOGS。
•不允许对日志表进行分区。
•mysqldump dump包含用于重新创建这些表的语句,以便在重新加载转储文件后不会丢失这些表。日志表的内容不转储。
















































页: [1]
查看完整版本: MySQL8.0大师之路:第11章:MySQL服务器管理-11.4 MySQL 普通查询日志和慢查询日志