Mysql 日志 (转)

MySQL日志: 主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;mysql

错误日志sql

在mysql数据库中,错误日志功能是默认开启的。而且,错误日志没法被禁止。默认状况下,错误日志存储在mysql数据库的数据文件中。数据库

日志文件一般的名称为hostname.err。其中,hostname表示服务器主机名。vim

错误日志所记录的信息是能够经过log-error和log-warnings来定义的缓存

log-err是定义是否启用错误日志的功能和错误日志的存储位置bash

log-warnings是定义是否将警告信息也定义至错误日志中服务器

默认状况下错误日志大概记录如下几个方面的信息:服务器启动和关闭过程当中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化本身的存储引擎的等等)、服务器运行过程当中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。并发

SHOW  GLOBAL VARIABLES LIKE '%log%';性能

删除错误日志:优化

在mysql5.5.7以前:数据库管理员能够删除很长时间以前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法以下:mysqladmin –u root –pflush-logs也可使用登陆mysql数据库中使用FLUSHLOGS语句来开启新的错误日志。

在mysql5.5.7以后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志建立一个新的:方式以下:

[root@stu18 data]# mv stu18.magedu.com.err  stu18.magedu.com.err.old

[root@stu18 data]#  mysqladmin flush-logs

查询日志:

默认状况下查询日志是关闭的。因为查询日志会记录用户的全部操做,其中还包含增删查改等信息,在并发操做大的环境下会产生大量的信息从而致使没必要要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。

查看查询日志是否开启:

|general_log                          | OFF        #定义查询日志是否开启                    

|general_log_file                     | /mydata/data/stu18.log   #定义查询日志的文件地址名称 

慢查询日志:

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

查看慢查询日志的定义:

| slow_query_log | OFF #定义慢查询日志的
| slow_query_log_file |/mydata/data/stu18-slow.log #输出方式为file(文件)时定义慢查询日志的位置

启动和设置慢查询日志: 默认文件名为hostname-slow.log

一、经过配置文件my.cnf中的log-slow-queries选项能够开启慢查询日志;形式以下:

[root@stu18 data]# vim /etc/my.cnf
slow_query_log=1
log-slow-queries = /usr/local/mysql/data/ip-172-168-6-198-slow.log

二、执行mysql>set global slow_query_log=1;

时间默认超过多少的称为慢查询日志?通常都是经过long_query_time选项来设置这个时间值,时间以秒为单位,能够精确到微秒。若是查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式以下:

SHOW  GLOBAL VARIABLES LIKE 'long%';

注释:其中这个慢查询时间并非只表示语句自身执行超过10秒还包含因为其余资源被征用形成阻塞的查询执行时间或其余缘由等都被记录到慢查询中。因此这个慢查的时长表示从查询开始到查询结束中间包含可能的任何缘由所经历的全部时间

show global variables like "%slow%";

事务日志:

事务日志(InnoDB特有的日志)能够帮助提升事务的效率。使用事务日志,存储引擎在修改表的数据时只须要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据自己持久到磁盘。事务日志采用追加的方式,所以写日志的操做是磁盘上一小块区域内的顺序I/O,而不像随机I/O须要在磁盘的多个地方移动磁头,因此采用事务日志的方式相对来讲要快得多。事务日志持久之后,内存中被修改的数据在后台能够慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,咱们一般称之为预写式日志,修改数据须要写两次磁盘。

若是数据的修改已经记录到事务日志并持久化,但数据自己尚未写回磁盘,此时系统崩溃,存储引擎在重启时可以自动恢复这部分修改的数据。具备的恢复方式则视存储引擎而定。

查看事务日志的定义:

mysql> SHOWGLOBAL VARIABLES LIKE '%log%';
+-----------------------------------------+-----------------------------------+
| Variable_name                           | Value                             |
+-----------------------------------------+-----------------------------------+
| innodb_flush_log_at_trx_commit          | 1                                 |
|innodb_locks_unsafe_for_binlog           | OFF                               |
| innodb_log_buffer_size                  | 8388608                           |
|innodb_log_file_size                     | 5242880                           |
| innodb_log_files_in_group               | 2      #至少有两个                |
|innodb_log_group_home_dir                |.#定义innodb事务日志组的位置       |
|innodb_mirrored_log_groups               | 1    #表示对日志组作镜像          |
每一个事务日志都是大小为5兆的文件:
[root@stu18 data]#ls -lh
-rw-rw---- 1 mysqlmysql 5.0M Oct  7 23:36 ib_logfile0
-rw-rw---- 1 mysqlmysql 5.0M Aug 12 01:06 ib_logfile1
 innodb_flush_log_at_trx_commit #在事务提交时innodb是否同步日志从缓冲到文件中1表示事务以提交就同步不提交每隔一秒同步一次,性能会不好形成大量的磁盘I/O;定义为2表示只有在事务提交时才会同步可是可能会丢失整个事务  

二进制日志:

二进制日志也叫做变动日志,主要用于记录修改数据或有可能引发数据改变的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> show global 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、log_bin能够直接定义为文件路径,也能够为ON|OFF。

其2、经过编辑my.cnf中的log-bin选项能够开启二进制日志;形式以下:

log-bin [=DIR \ [filename]
每次重启mysql服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增。除了生成上述的文件外还会生成一个名为filename.index的文件。这个文件中存储全部二进制日志文件的清单又称为二进制文件的索引。

查看二进制日志:

二进制日志的定义方式为二进制格式;使用此格式能够存储更多的信息,而且可使写入二进制日志的效率更高。可是不能直接使用查看命令打开并查看二进制日志。

mysql> show binary logs;     #显示当前服务器使用的二进制文件及大小
mysql> show master logs;      #显示主服务器使用的二进制文件及大小
mysql> show master status;   #当前使用的二进制文件及所处位置
小扩展:二进制日志的记录位置:一般为上一个事件执行结束时间的位置,每个日志文件自己也有本身的元数据因此说对于当前版本的mysql来讲二进制的开始位置一般为107;
mysql> flush logs; #flush logs通常只会滚动中继日志和二进制日志。
查看二进制日志信息的命令:
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
mysql> show binlog events\G         #查看全部的二进制信息
mysql> show binlog 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 */                         |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
mysql> show binlog events in 'mysql-bin.000011' from 190; #从指定的事件位置开始
mysql> showbinlog events in 'mysql-bin.000011' from 190 limit 3;  #指定偏移量(不是语句,是事件)
 

命令行下查看二进制日志:

因为没法使用cat等方式直接打开并查看二进制日志;因此必须使用mysqlbinlog命令。可是当正在执行mysql读写操做时建议不要使用此打开正在使用的二进制日志文件;若非要打开可flush logs。mysqlbinlog命令的使用方式:

[root@stu18 data]#mysqlbinlog mysql-bin.000017        #必须在数据目录下
[root@stu18 data]#mysqlbinlog mysql-bin.000017 > /tmp/a.sql  #导出:
[root@stu18 data]#mysql < a.sql  #导入
 删除二进制日志信息:

二进制日志会记录大量的信息(其中包含一些无用的信息)。若是很长时间不清理二进制日志,将会浪费不少的磁盘空间。可是,删除以后可能致使数据库崩溃时没法进行恢复,因此若要删除二进制日志首先将其和数据库备份一份,其中也只能删除备份前的二进制日志,新产生的日志信息不可删(能够作即时点还原)。也不可在关闭mysql服务器以后直接删除由于这样可能会给数据库带来错误的。若非要删除二进制日志须要作以下操做:导出备份数据库和二进制日志文件进行压缩归档存储。删除二进制文件的方法以下:

一、删除全部的二进制日志(不可效仿):

使用RESET MASTER语句能够删除全部的二进制日志。该语句的形式以下:

mysql> reset master;           
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001|       107 |
+------------------+-----------+
解析:首先不建议在生产环境下使用此操做;删除全部的二进制日志后,Mysql将会从新建立新的二进制日志。新二进制日志的编号从000001开始。

二、根据文件或时间点来删除二进制日志:

其中TO'log_name'表示把这个文件以前的其余文件都删除掉,也可以使用BEFORE datetime_expr指定把哪一个时间以前的二进制文件删除了。
mysql> PURGEBINARY LOGS TO 'mysql-bin.000007';
Query OK, 0 rowsaffected (0.11 sec)
mysql> showbinary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000007|       150 |
| mysql-bin.000008|       150 |
由此能够看出这种清理二进制日志文件的方式是很是合理的,不会致使数据库的错误发生。
mysql> PURGEBINARY LOGS BEFORE '13-10-19 10:26:36'#使用时间来删除二进制日志
相关文章
相关标签/搜索