Mysql 日志 (转)

时间:2023-03-09 21:59:54
Mysql 日志 (转)

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

错误日志

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

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

错误日志所记录的信息是可以通过log-error和log-warnings来定义的

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

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

1、通过配置文件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

2、执行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日志时。

二进制日志定义方式:

其一、log_bin可以直接定义为文件路径,也可以为ON|OFF。

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

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

Mysql 日志 (转)

查看二进制日志:

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

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服务器之后直接删除因为这样可能会给数据库带来错误的。若非要删除二进制日志需要做如下操作:导出备份数据库和二进制日志文件进行压缩归档存储。删除二进制文件的方法如下:

1、删除所有的二进制日志(不可效仿):

使用RESET MASTER语句可以删除所有的二进制日志。该语句的形式如下:

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

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

其中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'#使用时间来删除二进制日志