目录

一、MySQL日志的分类

1、错误日志(必须开启,无法关闭)

2、普通日志(默认关闭)

3、慢查询日志(默认关闭)

4、二进制日志(默认关闭)

5、中继日志

6、事务日志

二、二进制日志的查看

1、show binlog

2、mysqlbinlog


一、MySQL日志的分类

查看MySQL中和日志相关的参数:

mysql> SHOW VARIABLES LIKE '%log%';
+-----------------------------------------+----------------------------------+
| Variable_name                           | Value                            |
+-----------------------------------------+----------------------------------+
| back_log                                | 1024                             |
| binlog_cache_size                       | 32768                            |
| binlog_direct_non_transactional_updates | OFF                              |
| binlog_format                           | MIXED                            |
| binlog_stmt_cache_size                  | 32768                            |
| expire_logs_days                        | 7                                |
| general_log                             | ON                               |
| general_log_file                        | /export/data/mysql/log/mysql.log |
| innodb_flush_log_at_trx_commit          | 2                                |
| innodb_locks_unsafe_for_binlog          | OFF                              |
| innodb_log_buffer_size                  | 8388608                          |
| innodb_log_file_size                    | 536870912                        |
| innodb_log_files_in_group               | 3                                |
| innodb_log_group_home_dir               | /export/data/mysql/data          |
| innodb_mirrored_log_groups              | 1                                |
| log                                     | ON                               |
| log_bin                                 | ON                               |
| log_bin_trust_function_creators         | OFF                              |
| log_error                               | /export/data/mysql/log/error.log |
| log_output                              | FILE                             |
| log_queries_not_using_indexes           | OFF                              |
| log_slave_updates                       | ON                               |
| log_slow_queries                        | ON                               |
| log_warnings                            | 1                                |
| max_binlog_cache_size                   | 18446744073709547520             |
| max_binlog_size                         | 1073741824                       |
| max_binlog_stmt_cache_size              | 18446744073709547520             |
| max_relay_log_size                      | 0                                |
| relay_log                               | relay-log                        |
| relay_log_index                         |                                  |
| relay_log_info_file                     | relay-log.info                   |
| relay_log_purge                         | ON                               |
| relay_log_recovery                      | OFF                              |
| relay_log_space_limit                   | 0                                |
| slow_query_log                          | ON                               |
| slow_query_log_file                     | /export/data/mysql/log/slow.log  |
| sql_log_bin                             | ON                               |
| sql_log_off                             | OFF                              |
| sync_binlog                             | 0                                |
| sync_relay_log                          | 0                                |
| sync_relay_log_info                     | 0                                |
+-----------------------------------------+----------------------------------+

在配置文件my.cnf中的配置

character-set-server    = utf8
lower_case_table_names  = 1
log-output              = FILE                                  # 设置了general log和慢日志内存存储的方式,默认是file
log-error               = /export/data/mysql/log/error.log      # 错误日志
general_log                                                     # 一般查询日志 开启
general_log_file        = /export/data/mysql/log/mysql.log      # 一般查询日志 指定文件
pid-file                = /export/data/mysql/data/mysql.pid
slow-query-log                                                    # 慢查询日志 开启
slow_query_log_file     = /export/data/mysql/log/slow.log       # 慢查询日志 指定文件
tmpdir                  = /export/data/mysql/tmp/
long_query_time         = 0.1                                   # 设置慢查询的时间阀值,默认是10秒
sync_binlog             = 0                                      # 设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次;
#--- REPL ---#
server-id               = 8185
log-bin                 = mysql-bin                             # 二进制日志
binlog_format           = mixed                                 # binlog_format={statement|row|mixed}  指定二进制日志的类型
expire_logs_days        = 7
relay-log               = relay-log
replicate-ignore-db     = test
log_slave_updates
skip-slave-start

日志分类
分类    日志名称
服务器日志    服务错误日志
服务器日志    慢查询日志
服务器日志    综合查询日志
事务日志    存储引擎事务日志
事务日志    二进制日志

服务器日志:记录进程启动运行过程中的特殊事件,帮助分析MySQL服务遇到的问题 根据需求抓取特定的SQL语句,追踪性能可能存在的问题的业务SQL 
事务日志:记录应用程序对数据的所有更改 可用于数据恢复 可用于实例间数据同步

  • 错误日志:通常时指错误日志的相关信息,通常用服务器关闭和启动的日志信息,服务器运行过程中的错误信息,还可以记录警告信息。
  • 一般查询日志:general_log 该日志记录MySQL服务器的启动和关闭信息、客户端的连接信息、更新数据库记录SQL语句和查询数据库记录SQL语句。
  • 慢查询日志:记录执行时间超过指定时间的查询语句,通过工具分析慢查询日志可以定位MySQL服务器性能瓶颈所在;
  • 二进制日志:即,只记录修改数据库记录的操作,而不记录查询操作。二进制日记记录数据库的变化情况,内容报错数据库所有的更新操作,ddl和dml。数据库管理员可以通过二进制日志查看数据库过去某一时刻发生了哪些变化,必要时可以使用二进制日志恢复数据库。二进制文件内容为二进制信息,不可直接查看。 
  • 中继日志:它其实跟复制相关的,与二进制日志几乎相同;
  • 事物日志:随机I/O转换为顺序I/O,一般在两个文件存储,一个存满了就换另外一个存

1、错误日志(必须开启,无法关闭)

通过命令:
show global variables like 'log_error';
查看log_error设置的错误日志文件的物理位置。

mysql> show global variables like 'log_error';
+---------------+----------------------------------+
| Variable_name | Value                            |
+---------------+----------------------------------+
| log_error     | /export/data/mysql/log/error.log |
+---------------+----------------------------------+
1 row in set (0.00 sec)

log_error = /path/to/error_log_file # 定义错误日志文件
log_warnnings = {1|0} # 是否记录警告信息于错误日志中

2、普通日志(默认关闭)

通过命令:
show global variables like 'general_log';
查看是否开启

mysql> show global variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
1 row in set (0.00 sec)

通过下面的命令可以开启和关闭:
set @@global.general_log = 0;     关闭
set @@global.general_log = 0;     开启

注意:我们同样可以采用my.cnf中添加general_log=on/off;此时我们使用set方式修改会不起作用。 
general_log_file:general_log开启后,数据库将自动创建日志文件,次参数设置了general_log文件存放的物理位置。
show global variables like 'general_log_file';

mysql> show global variables like 'general_log_file';
+------------------+----------------------------------+
| Variable_name    | Value                            |
+------------------+----------------------------------+
| general_log_file | /export/data/mysql/log/mysql.log |
+------------------+----------------------------------+
1 row in set (0.00 sec)

log={ON|OFF} # 是否记录所有语句的日志信息于一般查询日志文件(general_log)中;
log_output={TABLE | FILE | NONE} # 定义log保存形式,none表示不保存日志;table和file可以同时出现,用逗号分隔即可;
general_log={ON|OFF} # 是否启动查询日志;
general_log_file # 定义一般查询日志保存的文件;
mysql > SET GOLBAL general_log ={OFF|ON};启用或关闭一般查询日志
mysql > SET GLOGAL log_output=’TABLE’;选项可以控制log的存放方法,table表示以表格的方式存放。

3、慢查询日志(默认关闭)

通过命令:
show global variables like 'slow_query_log';
查看是否开启

mysql> show global variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | ON    |
+----------------+-------+
1 row in set (0.00 sec)

通过下面的命令可以开启和关闭:
set @@global.slow_query_log = 1;
set @@global.slow_query_log = 0;

slow_query_log_file:设置慢日志的文件地址

mysql> show global variables like 'slow_query_log_file';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_query_log_file |/export/data/mysql/log/slow.log  |
+---------------------+----------------------------------+
1 row in set (0.01 sec)

long_query_time:设置慢查询的时间阀值,默认是10秒。

mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.00 sec)

log_queries_not_using_indexes:设置没有使用索引的查询语句是否记录在慢日志文件中。

mysql> show global variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF   |
+-------------------------------+-------+
1 row in set (0.00 sec)

慢日志查看 
慢日志地查询分为两种情形,慢查询日志的数据形式设置为table以及数据方式设置为file. 
table: 采用mysql.slow_log进行查询。 
file: 可以执行查看原文本文件
次数最多的语句或慢查询时间最长的语句,对应的工具为:mysqldumpslow.pl,参数如下:-s 分析慢查询时指定排序参数,可选的有:al 表示平均锁定时间,ar 表示平均返回记录数,at 表示平均查询时间。-t 参数表示只显示指定的行数。

long_query_time # 定义慢查询的时长;
slow_query_log {ON|OFF} # 全局参数,设定是否启用慢查询日志;它的输出位置也取决于log_output的值;
slow_query_log_file # 定义日志文件路径及名称;
log_slow_filter # 慢查询日志过滤类型;
log_slow_queries # 是否启用慢查询日志,会话级别的;
log_rate_limit=1 # 定义其日志记录速率;
log_slow_verbosity # 是否记录详细格式的日志信息;

4、二进制日志(默认关闭)

记录了对MySQL数据库进行的修改操作,影响数据潜在的内容的信息,select的是不会被记录到二进制日志的,二进制日志也叫复制日志,默认在数据目录下,专门查看日志的命令是:mysqlbinlog

功能:1、做时间点恢复,要想从哪个时间点恢复我们可以手动调的,所以这是一个备份恢复的重要工具
    2、 mysql主从复制架构中使用;

binlog有三种格式:Statement、Row以及Mixed。

  • 基于SQL语句的复制(statement-based replication,SBR), 
  • 基于行的复制(row-based replication,RBR), 
  • 混合模式复制(mixed-based replication,MBR)。

1)、Statement 

每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,
以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。

ps:相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,
但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,
其所产生的日志量会增加多少,以及带来的IO性能问题。

2)、Row
5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。
而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题.

缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。

ps:新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,
如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

3)、 Mixed
从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,
MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

通过命令:show global variables like 'log_bin';
查看是否开启

mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

log_bin_index:记录二进制文件的清单
show variables like 'log_bin_index';
这两个参数都是静态变量,无法使用set命令对其进行修改赋值。只能通过my.cnf文件设置。 
log_bin=/mysql/data/mysql-bin-log;但是设置时需要设置server-id,否则无法启动mysql
server-id参数用于在复制中,为主库和备库提供一个独立的ID,以区分主库和备库;开启二进制文件的时候,需要设置这个参数。

查看当前的二进制写入文件

mysql> SHOW MASTER STATUS;
+------------------+-----------+--------------+------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.001151 | 220558401 |              |                  |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)

查看二进制日志列表

mysql> SHOW BINARY LOGS;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.001144 | 1123973398 |
| mysql-bin.001145 | 1127377275 |
| mysql-bin.001146 | 1114898757 |
| mysql-bin.001147 | 1600890313 |
| mysql-bin.001148 | 1649695399 |
| mysql-bin.001149 | 1368255728 |
| mysql-bin.001150 | 1550672610 |
| mysql-bin.001151 |  220558401 |
+------------------+------------+
8 rows in set (0.00 sec)

记录方式:binlog_format={STATEMENT|ROW|MIXED}
参数
STATEMENT:语句;
ROW:行(语句影响到的行内容);
MIXED:混编;
相关命令
☉查看二进制日志文件列表:SHOW MASTER|BINARY LOGS;
☉查看当前正在使用的二进制日志文件:SHOW MASTER STATUS;
☉查看二进制日志文件中的事件:SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

服务器变量:
log_bin=/PATH/TO/BIN_LOG_FILE
指明记录二进制文件的路径,为了数据安全,建议放在不同的存储设备中

sql_log_bin={ON|OFF} 
指明是否记录日志于二进制文件中

max_binlog_size=1073741824
 二进制日志文件大小的上限值,超过会自动滚动
sync_binlog={1|0}
一旦有事件提交,就立刻从内存中同步到文件中去,建议启用

5、中继日志

它其实跟复制相关的,与二进制日志几乎相同,只不过它不是用于记录事件的,而是作为读取数据的源并且在本地执行的,当然中继日志是在从服务器上。

设定参数:
  
  MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE '%relay%';查看中继日志的相关参数信息
relay_log=file_name # 设定中继日志的文件名称
relay_log_index=file_name # 设定中继日志的索引文件名,默认为为数据目录中的host_name-relay-bin.index
relay_log_purge={ON|OFF} # 是否自动清理不再需要的中继日志
relay_log_space_limit= # 设定用于存储所有中继日志文件的可用空间大小,0表示不限制
relay_log_recovery:跟中继日志自动恢复相关的
relay_log={空}:是否启用中继日志的

6、事务日志

暂存事务提交的数据,实现将随机I/O转换成顺序I/O;
事务数据提交流程:innodb_buffer-->事务日志-->数据文件;
事务日志文件组,至少应该有2个日志文件,一般保存在数据目录下,为ib_logfile0和ib_logfile1;

注意事项:
尽可能使用小事务以提升事务引擎的性能;因为事务越大,回滚开销越大;
崩溃恢复:将提交的事务从事务日志中同步至数据文件,将未提交的事务执行回滚操作,以保证数据一致性;
避免磁盘故障导致事务文件丢失:对事务日志所在的磁盘做数据镜像;
事务日志文件和数据文件应分离存放:防止对同一磁盘过于频繁的I/O操作;

二、二进制日志的查看

一般步骤:
1、登录mysql安装的那台机器,找到my.cnf.我的my.cnf文件在etc地下,所有执行 cat /etc/my.cnf ,看到如图所示的binlogs存放位置 
2、进入日志所在目录 cd /home/mysql/logs/binlogs, 输入ls -al 查看需要查看的binlogs产生的时间。
3、如果需要查询2017-09-17 07:21:09到2017-09-19 07:59:50 数据库为geeRunner 的操作日志,输入如下命令将数据写入到一个备用的txt即可。
mysqlbinlog --no-defaults --database=geeRunner --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlogs.000080 > sanjiaomao.txt
4、如果本地查询,输入命令
 mysqlbinlog --no-defaults --database=geeRunner --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlogs.000080 | more
5、如果取下来查询,使用winscp工具,登录到db所在机器,将数据取出来。
6、如果需要过滤,只查询insert,update,delete的语句,可以这样写:
mysqlbinlog --no-defaults --database=raceEnroll  binlogs.000078 |grep update |more

查看binlog内容

1、show binlog

show binlog events in 'mysql-bin.000011';
show binlog events in 'mysql-bin.000011' from 60 limit 3;

2、mysqlbinlog

mysqlbinlog c:/tmp/mylog/mysql-bin.000001
--start-datetime | --stop-datetime
--start-position | --stop-position