日志表 - xiaoboluo768/mysql-system-schema GitHub Wiki

  • MySQL的日志系统包含:general query log、slow query log、error log(记录MySQL Server启动时、运行中、停止时的错误信息)、binary log(记录MySQL Server运行过程中的数据变更的逻辑日志)、relay log(记录从库IO线程从主库获取的主库数据变更日志)、DDL log(记录DDL语句执行时的元数据变更信息。5.7中只支持写入到文件,8.0中支持写入到innodb_ddl_log表中,注意,ddl log与online ddl的alter log不同,不要搞混了),其中,在MySQL 5.7中,只有general query log、slow query log支持写入到表中(也支持写入到文件中),其他日志类型在MySQL 5.7版本中只支持写入到文件中,所以,本文主要介绍 general query log、slow query log表。
  • 默认情况下,除Windows上的错误日志之外,其他平台的所有日志默认情况下不启用 (DDL日志只在需要时创建,并且无用户可配置选项)
  • 默认情况下,所有日志均写在datadir目录下,但可以使用每种日志对应的路径参数自行更改路径
  • general query log:general_log_file=/home/mysql/data/mysqldata1/mydata/localhost.log
  • error log:log_error=/home/mysql/data/mysqldata1/log/error.log
  • slow query log:slow_query_log_file=/home/mysql/data/mysqldata1/slowlog/slow-query.log
  • binary log:log_bin_basename=/home/mysql/data/mysqldata1/binlog/mysql-bin、log_bin_index=/home/mysql/data/mysqldata1/binlog/mysql-bin.index
  • relay log:relay_log_basename=/home/mysql/data/mysqldata1/relaylog/mysql-relay-bin、relay_log_index=/home/mysql/data/mysqldata1/relaylog/mysql-relay-bin.index
  • 默认情况下,所有的日志都写入到磁盘文件,但general query log和slow query log可以通过log_output=TABLE设置保存到表mysql.general_log和mysql.slow_log表中(DDL log在8.0中可以配置,可打印到错误日志中,也可以保存在表innodb_ddl_log中)
  • 默认情况下,binary log根据max_binlog_size参数设置的大小自动滚动、relay log根据max_relay_log_size或者max_binlog_size自动滚动(如果max_relay_log_size没设置就按照max_binlog_size大小滚动),其他的日志类型不会滚动,总是使用同一个文件,所以其他日志类型增长过大之后,需要自行做切割
  • 一般使用mv file file.bak;然后执行刷新命令,刷新命令可以登录实例使用flush logs命令刷新重新产生新的日志文件,但是该命令是刷新所有的日志类型,要针对具体的日志类型,可以使用:flush binary logs;刷新二进制日志、flush error logs;刷新错误日志、flush general logs;刷新普通查询日志、flush slow logs;刷新慢查询日志、flush relay logs;刷新中继日志、flush engine logs;刷新存储引擎相关的任何可刷新的日志
  • 也可以使用Server的flush tables;语句或者flush table with read lock;语句
  • 刷新操作也可以使用一些命令行工具的选项实现,例如:使用mysqladmin命令的flush-logs选项,或者mysqldump的flush-logs选项与--master-data选项
  • 日志表实现具有以下特征:
  • 通常,日志表的主要目的是为程序提供一个访问接口,以便查看Server内的SQL运行情况,所以,日志记录存放在表中比存放在磁盘文件中会更加方便,因为存储在表中可以远程访问这些日志记录,而不需要登录操作系统去访问磁盘文件
  • 日志表可以使用CREATE TABLE,ALTER TABLE和DROP TABLE语句,但前提是需要先使用对应的开关关闭掉表,不能在使用期间操作(例如:set global general_log=0,然后操作general_log表)
  • general_log和slow_log表默认是CSV引擎,使用逗号分割的格式来存放日志记录,CSV数据文件可以很方便地导入其他程序进行处理,例如:excel电子表格
  • 日志表可以修改引擎为MyISAM,但修改之前必须先停止表的使用。合法的引擎为CSV和MyISAM,其他引擎不支持
  • 要禁用日志记录表以便进行相应的DDL语句操作,可以使用以下步骤(以慢查询表为例进行说明,slow_log和general_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 TABLE语句
  • 不能使用INSERT,DELETE和UPDATE语句,日志表的记录变更由Server内部维护,不能手动操作
  • FLUSH TABLES WITH READ LOCK和read_only系统变量的设置对日志表没有影响。Server内部始终可以写日志表
  • 日志表的数据变更操作不会记录到binlog,因此不会被复制到从库
  • 可以使用FLUSH TABLES或FLUSH LOGS语句来刷新日志表或日志文件
  • 日志表不支持分区表
  • mysqldump转储包含了重新创建这些表的语句,以便在重新加载转储文件后恢复日志表结构,但是日志表中的记录内容不会被转储
  • 参考链接:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html
  • PS:MySQL的查询日志、错误日志等是使用明文记录的,所以,这些日志中有可能会记录用户的明文密码信息,可以使用rewrite插件来使用原始格式记录,详见链接:

上一篇:slave_worker_info表 |下一篇:general_log表

⚠️ **GitHub.com Fallback** ⚠️