常规查询日志和慢查询日志可以动态调整,并且可以写入日志表 ( mysql.general_log 和 mysql.slow_log) 或日志文件。
系统变量
输出目标
- log_output
- 指定日志输出目标。
-
设置此变量并不会启用日志
-
变量值
- 空
- 如果未指定此变量,则默认记录目标为文件
- 列表值
--log_output=TABLE,FILE --general_log --log_output=TABLE --general_log --slow_query_log --log_output=FILE --slow_query_log
- 可以为 TABLE,FILE,NONE
- 空
常规查询日志
- general_log
- 控制开启/禁用常规查询日志
-
会话级变量
常规查询日志开启的情况下,还可以为会话启用或禁用常规查询日志。
- sql_log_off
- general_log_file
- 常规查询日志的文件名
慢查询日志
- slow_query_log
- 控制开启/禁用慢查询日志
- slow_query_log_file
- 慢查询日志的文件名
日志表的优点和特征
如果 –log-output 中包含 TABLE,则会使常规查询日志和慢查询日志输出到表中。日志表的目的是为用户提供一个查询界面,而不干扰服务器的运行。
优点
- 日志条目具有标准格式
- 日志内容可以使用 SQL 语句查询,便于筛选
- 可以通过客户端查询,无需登录主机和文件系统
特征
- 日志表默认使用 CSV 存储引擎
- CSV 格式便于导入其他程序,如 Excel
- 日志表也支持 MyISM 存储引擎,更换存储引擎之前要先禁用日志表
Too many open files
的报错- 错误原因
- 服务运行时,重复禁用和启用日志表会导致这个错误
- 解决方法
- flush tables
- 或调整参数,使 open_files_limit 大于 table_open_cache_instances
- 错误原因
- 有效操作
- create/alter/drop table
- alter/drop table 时,日志表必须禁用
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;
- alter/drop table 时,日志表必须禁用
- 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
- 检查表
- flush tables,flush logs
- 刷新日志表或日志文件
- create/alter/drop table
- 不能用于日志表的操作
- lock tables
- insert/delete/update
- 只允许服务器内部操作,不允许手动操作
- 日志表不允许分区
-
无影响的操作
- flush tables with lock 和系统变量 read only
- 日志表的内容不会被 mysqldump 导出
- 写入日志表的条目不会写入二进制日志,所以也不会被复制到从节点