MySQL日志详细解析

MySQL日志:
主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;
日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。
错误日志
在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。
下面我们来定义mysql错误日志的功能:
一般而言,日志级别的定义没有回话变量都只是在全局级别下进行定义。

其中,log_error可以直接定义为文件路径,也可以为ON|OFF;log_warings只能使用1|0来定义开关启动。
更改错误日志位置可以使用log_error来设置形式如下:

解析:其中,DIR参数指定错误日志的路径filename参数是错误日志的名称,没有指定该参数时默认为主机��。重启mysql服务器即可生效。
查看mysql错误日志:

删除错误日志:
在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –pflush-logs也可以使用登录mysql数据库中使用FLUSHLOGS语句来开启新的错误日志。
在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的:方式如下:

更多信息请查阅官方文档:http://dev.mysql.com/doc/refman/5.5/en/error-log.html
查询日志:
默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。
查看查询日志是否开启:

mysql> use  mysql;                    #在此数据库中
Database changed
mysql> show  tables;
+---------------------------+
|  Tables_in_mysql          |
+---------------------------+
|  columns_priv              |
| db                        |
| event                    |
| func                      |
| general_log              |      #这个就是查询日志的表输出位置
|  help_category            |
|  help_keyword              |
|  help_relation            |
| help_topic
………………                |
+---------------------------+

慢查询日志:
慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。
查看慢查询日志的定义:

启动和设置慢查询日志:
1、通过配置文件my.cnf中的log-slow-queries选项可以开启慢查询日志;形式如下:

其中,DIR参数指定慢查询日志的存储路径;filename参数指定日志的文件名,生成日志文件的完成名称为filename-slow.log。如果不指定存储路径,慢查询日志默认存储到mysql数据库的数据文件下,如果不指定文件名,默认文件名为hostname-slow.log。
2、通过登录mysql服务器直接定义,方式如下:
首先要有全局权限;然后执行mysql>set global slow_query_log=1;
时间默认超过多少的称为慢查询日志?
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:

mysql> SHOW  GLOBAL VARIABLES LIKE 'long%';
+-----------------+-----------+
|  Variable_name  | Value    |
+-----------------+-----------+
| long_query_time  | 10.000000 |
+-----------------+-----------+
1 row in set (0.04  sec)

二进制日志:
二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。
二进制开启状态:
mysql> showglobal variables like "%log_bin%";
+---------------------------------+-------+
| Variable_name                  | Value |
+---------------------------------+-------+
| log_bin                        | ON    |  #已开启
|log_bin_trust_function_creators | OFF  |
| sql_log_bin                    | ON    |
+---------------------------------+-------+

二进制日志相关的参数:
mysql> showglobal variables like "%log%";
sql_log_bin ={ON|OFF}    #用于控制会话级别二进制日志功能的开启或关闭。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。
binlog_cache_size =32768  #默认值32768 Binlog Cache用于在打开了二进制日志(binlog)记录功能的环境,是MySQL 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域。一般来说,如果我们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。但是如果我们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。
binlog_stmt_cache_size= 32768      #当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句。
log_bin = mysql-bin#指定binlog的位置,默认在数据目录下。
binlog-format= {ROW|STATEMENT|MIXED}    #指定二进制日志的类型,默认为MIXED。如果设定了二进制日志的格式,却没有启用二进制日志,则MySQL启动时会产生警告日志信息并记录于错误日志中。
sync_binlog = 10#设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步
max_binlog_cache_size= {4096 .. 18446744073709547520}      #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存,其上限由max_binlog_stmt_cache_size决定。
max_binlog_stmt_cache_size= {4096 .. 18446744073709547520}    #二进定日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存
expire_log_days ={0..99}    #设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时。

如果说我们向某个表的某个字段插入一个数据而这个数据为当前时间(日期时间型);过段时间将此二进制文件应用到另一台服务器上数据就会变动从而导致数据的不一致性所以说对于这种非确定性的数据使用默认的语句定义并不是可靠的;
二进制日志中常用的定义格式:
1、语句(statement):默认的记录格式;
2、行(row):定义的并非数据本身而是这一行的数据是什么;
3、混合模式(mixed):交替使用行和语句、由mysql服务器自行判断。
其中基于行的定义格式数据量会大一些但是可以保证数据的精确性。
查看二进制日志:
二进制日志的定义方式为二进制格式;使用此格式可以存储更多的信息,并且可以使写入二进制日志的效率更高。但是不能直接使用查看命令打开并查看二进制日志。
mysql> showbinary logs;    #显示当前服务器使用的二进制文件及大小
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001|    13814 |
| mysql-bin.000002|      150 |
| mysql-bin.000003|      150 |
| mysql-bin.000004|      150 |
| mysql-bin.000005|      150 |
| mysql-bin.000006|      126 |
| mysql-bin.000007|      126 |
| mysql-bin.000008|      126 |
| mysql-bin.000009|      107 |
| mysql-bin.000010|      353 |
+------------------+-----------+
10 rows in set (0.07sec)
mysql> showmaster logs;      #显示主服务器使用的二进制文件及大小
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001|    13814 |
| mysql-bin.000002|      150 |
| mysql-bin.000003|      150 |
| mysql-bin.000004|      150 |
| mysql-bin.000005|      150 |
| mysql-bin.000006|      126 |
| mysql-bin.000007|      126 |
| mysql-bin.000008|      126 |
| mysql-bin.000009|      107 |
| mysql-bin.000010|      353 |
+------------------+-----------+
10 rows in set (0.02sec)
mysql> showmaster status;  #当前使用的二进制文件及所处位置
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010|      353 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00sec)

小扩展:二进制日志的记录位置:通常为上一个事件执行结束时间的位置,每一个日志文件本身也有自己的元数据所以说对于当前版本的mysql来说二进制的开始位置通常为107;
mysql> flushlogs;
Query OK, 0 rowsaffected (0.23 sec)
注意:flush logs一般只会滚动中继日志和二进制日志。
mysql> showmaster status;
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011|      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00sec)

查看当前二进制文件的信息:
mysql> createdatabase yong;
Query OK, 1 rowaffected (0.12 sec)
mysql> createtable yong.tb1 (id int,name char(20));
Query OK, 0 rowsaffected (0.44 sec)
mysql> insertinto yong.tb1 values(1,'tom');
Query OK, 1 rowaffected (0.14 sec)
mysql> showmaster status;
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011|      479 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00sec)

查看二进制日志信息的命令:
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
mysql> showbinlog events\G        #查看所有的二进制信息
***************************87. row ***************************
  Log_name: mysql-bin.000001
        Pos: 13580
 Event_type: Query
  Server_id: 1
End_log_pos: 13688
      Info: use `hellodb`; /*!40000 ALTERTABLE `toc` DISABLE KEYS */
***************************88. row ***************************
  Log_name: mysql-bin.000001
        Pos: 13688
 Event_type: Query
  Server_id: 1
End_log_pos: 13795
      Info: use `hellodb`; /*!40000 ALTERTABLE `toc` ENABLE KEYS */
***************************89. row ***************************
  Log_name: mysql-bin.000001
        Pos: 13795
 Event_type: Stop
  Server_id: 1
End_log_pos: 13814
      Info:
89 rows in set (0.00sec)
mysql> showbinlog events in 'mysql-bin.000011';    #查看指定日志的二进制信息
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
| Log_name        | Pos | Event_type  | Server_id | End_log_pos | Info                                        |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000011|  4 | Format_desc |        1 |        107 | Server ver: 5.5.33-log, Binlogver: 4        |
| mysql-bin.000011 |107 | Query      |        1 |        190 | create database yong                        |
| mysql-bin.000011 |190 | Query      |        1 |        293 | create table yong.tb1 (idint,name char(20)) |
| mysql-bin.000011 |293 | Query      |        1 |        357 | BEGIN                                        |
| mysql-bin.000011 |357 | Query      |        1 |        452 | insert into yong.tb1values(1,'tom')        |
| mysql-bin.000011 |452 | Xid        |        1 |        479 | COMMIT /* xid=103 */                        |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
6 rows in set (0.00sec)
mysql> showbinlog events in 'mysql-bin.000011' from 190; #从指定的事件位置开始
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| Log_name        | Pos | Event_type | Server_id |End_log_pos | Info                                        |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000011 |190 | Query      |        1 |        293 | create table yong.tb1 (idint,name char(20)) |
| mysql-bin.000011 |293 | Query      |        1 |        357 | BEGIN                                        |
| mysql-bin.000011 |357 | Query      |        1 |        452 | insert into yong.tb1values(1,'tom')        |
| mysql-bin.000011 |452 | Xid        |        1 |        479 | COMMIT /* xid=103 */                        |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
4 rows in set (0.00sec)
mysql> showbinlog events in 'mysql-bin.000011' from 190 limit 3;  #指定偏移量(不是语句,是事件)
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| Log_name        | Pos | Event_type | Server_id |End_log_pos | Info                                        |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000011 |190 | Query      |        1 |        293 | create table yong.tb1 (idint,name char(20)) |
| mysql-bin.000011 |293 | Query      |        1 |        357 | BEGIN                                        |
| mysql-bin.000011 |357 | Query      |        1 |        452 | insert into yong.tb1values(1,'tom')        |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
3 rows in set (0.00sec)

删除二进制日志信息:
二进制日志会记录大量的信息(其中包含一些无用的信息)。如果很长时间不清理二进制日志,将会浪费很多的磁盘空间。但是,删除之后可能导致数据库崩溃时无法进行恢复,所以若要删除二进制日志首先将其和数据库备份一份,其中也只能删除备份前的二进制日志,新产生的日志信息不可删(可以做即时点还原)。也不可在关闭mysql服务器之后直接删除因为这样可能会给数据库带来错误的。若非要删除二进制日志需要做如下操作:导出备份数据库和二进制日志文件进行压缩归档存储。删除二进制文件的方法如下:
1、删除所有的二进制日志(不可效仿):
使用RESET MASTER语句可以删除所有的二进制日志。该语句的形式如下:
mysql> resetmaster;           
Query OK, 0 rowsaffected (0.17 sec)
mysql> showbinary logs;
+------------------+-----------+
| Log_name        | File_size |
+------------------+-----------+
| mysql-bin.000001|      107 |
+------------------+-----------+
1 row in set (0.04sec)

解析:首先不建议在生产环境下使用此操作;删除所有的二进制日志后,Mysql将会重新创建新的二进制日志。新二进制日志的编号从000001开始。

2、根据文件或时间点来删除二进制日志:
语法形式:
mysql> PURGE { BINARY | MASTER } LOGS {TO 'log_name' | BEFORE datetime_expr }

由此可以看出这种清理二进制日志文件的方式是非常合理的,不会导致数据库的错误发生。
mysql> PURGEBINARY LOGS BEFORE '13-10-19 10:26:36'; #使用时间来删除二进制日志
Query OK, 0 rowsaffected (0.05 sec)

到此关于二进制的知识就解析完了,其中若有错误不足之处请指出!谢谢!注意二进制日志和错误日志很重要重点学之!!

猜你喜欢

转载自www.linuxidc.com/Linux/2017-02/140157.htm