mysql创建⽇志表_⽇志信息记录表全⽅位认识mysql系统库原标题:⽇志信息记录表|全⽅位认识 mysql 系统库
在上⼀期《复制信息记录表|全⽅位认识 mysql 系统库》中,我们详细介绍了mysql系统库中的复制信息记录表,本期我们将为⼤家带来系列第⼋篇《⽇志记录等混杂表|全⽅位认识 mysql 系统库》,下⾯请跟随我们⼀起开始 mysql 系统库的系统学习之旅吧!
⽇志信息记录表
01
1.1. ⽇志信息概述
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、
android项目开发实战入门pdflog_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设置保存到表
默认情况下,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;语句。
mysql语句顺序刷新操作也可以使⽤⼀些命令⾏⼯具的选项实现,例如:使⽤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表操作⽅式类似)。
microsoft updateSET@old_log_state = @@ al_log;
SETGLOBALgeneral_log = 'OFF';
SETGLOBALgeneral_log = @old_log_state;
可以使⽤TRUNCATE TABLE来清空⽇志记录。
可以使⽤RENAME TABLE来实现⽇志表的归档,新旧表做⼀个原⼦的名称互换操作,如下:
usemysql;
DROPTABLEIFEXISTSgeneral_log2;
CREATETABLEgeneral_log2 LIKEgeneral_log;
RENAMETABLEgeneral_log TOgeneral_log_backup,general_log2 TOgeneral_log;
注意事项
可以使⽤CHECK TABLE语句。
不能使⽤LOCK TABLE语句。
不能使⽤INSERT,DELETE和UPDATE语句,⽇志表的记录变更由Server内部维护,不能⼿动操作。
FLUSH TABLES WITH READ LOCK和read_only系统变量的设置对⽇志表没有影响。Server内部始终可以写⽇志表。
⽇志表的数据变更操作不会记录到binlog,因此不会被复制到从库。
可以使⽤FLUSH TABLES或FLUSH LOGS语句来刷新⽇志表或⽇志⽂件。
⽇志表不⽀持分区表。
mysqldump转储包含了重新创建这些表的语句,以便在重新加载转储⽂件后恢复⽇志表结构,但是⽇志表中的记录内容不会被转储。
PS:MySQL的查询⽇志、错误⽇志等是使⽤明⽂记录的,所以,这些⽇志中有可能会记录⽤户的明⽂密码信息,可以使⽤rewrite插件来使⽤原始格式记录,详见链接:
1.2. ⽇志表详解
1.2.1. general_log
该表提供查询普通SQL语句的执⾏记录信息,⽤于查客户端到底在服务端上执⾏了什么SQL(当然,还可以使⽤企业版的audit log审计插件记录,本⽂不做赘述,有兴趣的童鞋⾃⾏研究)。
该表中的信息在SQL开始执⾏时就会进⾏记录,⽽不是等待SQL执⾏结束才记录。
root@localhost : (none) 07:25:50> set global log_output= 'TABLE';
Query OK, 0rows affected ( 0. 00sec)
root@localhost : (none) 07:26:20> set global general_log= 1;
Query OK, 0rows affected ( 0. 01sec)
root@localhost : (none) 07:26:32> select * al_log;
+----------------------------+---------------------------+-----------+-----------+--------------+---------------------------------+
| event_time |user_host | thread_id |server_id | command_type |argument |
+----------------------------+---------------------------+-----------+-----------+--------------+---------------------------------+
| 2018- 06- 1919:26:32.891371| root[root] @ localhost [] |3| 3306102 |Query | show databases |
| 2018-06-19 19:26:42.012064 |root[root] @ localhost [] | 3 |3306102| Query |select * al_log |
+----------------------------+---------------------------+-----------+-----------+--------------+---------------------------------+
2 rows inset (0.00 sec)
root@localhost : (none) 07:26:42> select connection_id;
+-----------------+
| connection_id |
+-----------------+
家里挂一个玳瑁犯法吗| 3|
+-----------------+
1 row inset (0.00 sec)
event_time:查询⽇志记录到表的那⼀刻的log_timestamps系统变量值,⽤于标记查询⽇志记录何时⼊库。
user_host: 表⽰该查询⽇志记录的来源,其中有⽤户名和主机名信息。
thread_id:表⽰该查询⽇志记录执⾏时的process_id。
server_id:表⽰执⾏该查询的数据库实例ID。
command_type:表⽰该查询的command类型,通常都为query。
argument:表⽰执⾏查询的SQL语句⽂本。
mysqld按照接收请求的顺序将语句写⼊查询⽇志中(这可能与它们的执⾏顺序不同)。
在主从复制架构中。
主库上在使⽤基于语句的⽇志格式时,从库在在重放这些语句之后,会把这些语句记录⾃⼰的查询⽇志中(需要从库启⽤了查询⽇志记录功能),使⽤语句格式记录的binlog在使⽤mysqlbinlog命令解析之后导⼊数据库中时,如果实例开启了查询⽇志记录功能,则这些解析语句也会被记录到查询⽇志中。
主库上使⽤基于row⽇志格式时,从库重放这些数据变更之后,这些语句不会被计⼊从库的查询⽇志中。
在主库上使⽤基于mixed⽇志格式时,如果主库是以语句格式记录的,则从库重放这些数据变更之后会把语句记录到⾃⼰的查询⽇志中(需要从库启⽤了查询⽇志记录功能),如果主库在记录binlog时被转换为了row格式,则也跟row格式复制⼀样,从库重放这些数据变更之后不会把这些语句记录到⾃⼰的查询⽇志中。
查询⽇志可以使⽤系统变量sql_log_off变量动态关闭当前会话或者所有会话的查询⽇志记录功能(与sql_log_bin系统变量的作⽤类似)。
查询⽇志开关general_log变量和查询磁盘⽇志⽂件路径general_log_file变量都可以动态修改(如果已经有查询⽇志处于打开状态,则使⽤general_log_file变量修改查询⽇志路径时关闭旧的查询⽇志,打开新的查询⽇志),当启⽤查询⽇志时,查询⽇志将保持到系统变量
log_output指定的⽬的地。
如果启⽤了查询⽇志,则Server重新启动的时候会重新打开查询⽇志⽂件,如果查询⽇志存在,则直接重新打开,如果查询⽇志不存在,则重新创建,如果需要再Server运⾏时动态归档查询⽇志,则可以按照如下命令操作(linux或者unix平台)。
shell>mv host_name.log host_name-old.log
shell>mysqladmin flush-logs
shell>mv host_name-old.log backup-directory
#在Windows上,请直接使⽤重命名,⽽不是mv命令
也可以在Server运⾏时通过语句先关闭查询⽇志功能,然后使⽤外部命令来归档,然后再重新启⽤查询⽇志,这样就不需要使⽤flush-logs 命令来刷新⽇志⽂件了,此⽅法适⽤于任何平台,命令如下:
SETGLOBALgeneral_log = 'OFF';
# 在禁⽤⽇志的情况下,从外部重命名⽇志⽂件;例如,从命令⾏。然后再次启⽤⽇志:SETGLOBALgeneral_log ='ON';# 此⽅法适⽤于任何平台,不需要重新启动服务器。
默认情况下,在Server中执⾏的语句如果带了⽤户密码,会被Server重写该语句之后再写⼊到查询⽇志中,如果需要记录明⽂密码,则需要使⽤--low-raw选项启动Server(使⽤该选项会绕过密码重写功能),通常不建议记录密码明⽂信息到查询⽇志中,因为不安全,但如果有必要,⾃⾏判断(例如:需要查询原始的语句信息来排查问题时)。
如果带密码的语句中,指定了密码是⼀个hash值时,则密码字符串不会被重写,例如:CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';就会被原本原因地记录下来,但是如果去掉PASSWORD关键字CREATE USER 'user1'@'localhost' IDENTIFIED BY 'not-so-secret';,则在查询⽇志中就会被重写为:CREATE USER 'user1'@'localhost' IDENTIFIED WITH
'mysql_native_password' AS ''。
⼀些语法错误的SQL默认情况下也不会被记录到查询⽇志中,使⽤--low-raw选项启动Server会记录所有的原始SQL语句。
查询⽇志表中的时间戳信息来源于系统变量log_timestamps(包括慢查询⽇志⽂件和错误⽇志⽂件中的时间戳都来⾃此系统变量的值),该时间戳值在查询时可以使⽤CONVERT_TZ函数或通过设置会话将从这些表中的时间戳信息从本地系统时区转换为任何所需时区(修改会话级别的time_zone变量值)。
1.2.2. slow_log
该表提供查询执⾏时间超过long_query_time设置值的SQL,或者未使⽤索引的(需要开启参数log_queries_not_using_indexes=ON)或者管理语句(需要开启参数log_slow_admin_statements=ON)。
root@localhost : test 08 :46:04> set global long_query_time= 0;
Query OK, 0rows affected ( 0. 01sec)
root@localhost : test 08 :55:14> set global slow_query_log= 1;
Query OK, 0rows affected ( 0. 01sec)
# 断开会话重新连接
root@localhost : (none) 08 :56:12> use test
Database changed
root@localhost : test 08 :56:13> show tables;
+----------------+
| Tables_in_test |
+----------------+
| customer |
| product |
| shares |
| test |
| transreq |
+----------------+
5rows inset ( 0. 01sec)
root@localhost : test 08 :56:16> select * from test;
+---+---+------+------+------+------+
| a |b | c |d | e |f |
+---+---+------+------+------+------+
| 1| 1 |1| 1 |1| 1 |
| 2 |2| 2 |2| 2 |2|
| 3| 3 |3| 3 |3| 3 |
| 4 |4| 4 |4| 4 |4|
| 5| 5 |4| 4 |5| 5 |
+---+---+------+------+------+------+
5rows inset ( 0. 01sec)
root@localhost : test 08 :56:18> select * from mysql.slow_log;
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
| start_time |user_host | query_time |lock_time | rows_sent |rows_examined | db |last_insert_id | insert_id |server_id |
sql_text |thread_id |
有关二郎神的神话传说+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+------+----------------+-----------+-----------+----------------------------------+-----------+
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论