MySQL 日志类型
Linux System Environment
[root@master ~]# cat /etc/redhat-release #==》系统版本
CentOS Linux release 7.5.1804 (Core)
[root@master ~]# uname –r #==》系统内核
3.10.0-862.el7.x86_64
[root@master ~]# uname -m #==》系统位数
x86_64
[root@master ~]# echo $LANG #==》系统字符集
en_US.UTF-8
[root@master ~]# mysql –version #==》MySQL版本
mysql Ver 14.14 Distrib 5.7.27, for linux-glibc2.12 (x86_64) using EditLine wrapper
MySQL Log日志类型
标注:MySQL使用源码安装,指定安装路径 /application/mysql/
1、错误日志(error log)
记录MySQL服务进程mysqld在启动/关闭或运行过程中遇到的错误信息
2、查询日志
2.1、普通查询日志
记录客户端连接信息和执行的SQL语句信息
2.2、慢查询日志)
记录执行时间超出指定值的SQL语句
3、二进制日志(binary log)
记录数据被修改的相关信息
一、MySQL错误日志
标注:MySQL错误日志默认开启,默认路径是MySQL程序目录data目录下,以主机名命名,例如 master.err
1、配置错误日志
[root@master ~]# vim /etc/my.cnf
[mysqld_safe]
log-error=/tmp/master_error_log.err
[root@master ~]# systemctl restart mysqld
[root@master ~]# ls -l /tmp/master_error_log.err
-rw-r----- 1 mysql mysql 11201 Aug 22 11:59 /tmp/master_error_log.err
mysql> show variables like 'log_error%';
+---------------------+---------------------------+
| Variable_name | Value |
+---------------------+---------------------------+
| log_error | /tmp/master_error_log.err |
| log_error_verbosity | 3 |
+---------------------+---------------------------+
2 rows in set (0.00 sec)
二、查询日志
1、配置普通查询日志
mysql> show variables like 'general_log%';
+------------------+------------------------------------+
| Variable_name | Value |
+------------------+------------------------------------+
| general_log | OFF |
| general_log_file | /application/mysql/data/master.log |
+------------------+------------------------------------+
mysql> set global general_log = on;
Query OK, 0 rows affected (0.02 sec)
mysql> show variables like 'general_log%';
+------------------+------------------------------------+
| Variable_name | Value |
+------------------+------------------------------------+
| general_log | ON |
| general_log_file | /application/mysql/data/master.log |
+------------------+------------------------------------+
[root@master ~]# systemctl restart mysqld
[root@master ~]# ls -l /application/mysql/data/master.log
-rw-r----- 1 mysql mysql 321 Aug 22 14:07 /application/mysql/data/master.log
2、配置慢查询日志
mysql> show variables like '%slow%';
+---------------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /application/mysql/data/master-slow.log |
+---------------------------+-----------------------------------------+
[root@master data]# vim /etc/my.cnf
[mysqld]
slow_query_log = on
slow_query_log_file = /application/mysql/data/master_slow.log
long_query_time = 1 #==》设置SQL语句执行超过1秒的进行记录
[root@master data]# systemctl restart mysqld
mysql> show variables like '%slow%';
+---------------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /application/mysql/data/master_slow.log |
+---------------------------+-----------------------------------------+
[root@master ~]# ls -l /application/mysql/data/master_slow.log
-rw-r----- 1 mysql mysql 206 Aug 22 14:49 /application/mysql/data/master_slow.log
三、二进制日志binlog(增量日志)
1、binlog日志的三种模式
1.1、Statement Level 模式
每一条会修改数据的sql都会记录到master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。
优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约I0,提高性能,因为他只需要记录在Master上所执行的语句的细节,以及执行语句时候的上下文的信息。。
缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果,另外就是,由于MySQL现在发展比较快,很多的新功能不断的加入,使MySQL的复制遇到了不小的拱战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现,在statement level下,目前已经发现的就有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleepO函数在有些版本中就不能正确复制,在存储过程中使用了last_insertid0函数,可能会使slave和master上得到不一致的id等等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题。
1.2、Row Level模式
日志中会记录成每一行数据被修改的形式,然后在alave 端再对相同的数据进行修改。
优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了,所以row level的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。
缺点:row level下,所有的执行的语句当记录到日志中的时候,部将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update 语句:update product set owner member id=“b' where owner member_id=‘a',执行之后,日志中记录的不是这条update语句所对应的事件(MySQL以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,bin-log日志的量就会很大,尤其是当执行alter table之类的语句的时侯,产生的日志量是惊人的。因为MysQL对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动,实际上就是重建了整个表,那么该表的每一条记录都会被记录到日志中…
1.3、Mixed模式
实际上就是前两种模式的结合,在Mixed模式下,MySQL会根据执行的每一条具体的aq1语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样,仅仅记录执行的语句。而新版本的MySQL中对row leve1模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sq1语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
2、配置binlog日志
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
#==》临时生效,重启MySQL数据库后就会失效
###当前会话在线修改生效
mysql> set session binlog_format = 'STATEMENT';
mysql> set session binlog_format = 'ROW';
mysql> set session binlog_format = 'MIXED';
###全局生效
mysql> set global binlog_format = 'STATEMENT';
mysql> set global binlog_format = 'ROW';
mysql> set global binlog_format = 'MIXED';
#==》永久生效,但需要重启MySQL数据库后才会生效
[root@master ~]# vim /etc/my.cnf
[mysqld]
log-bin = /application/mysql/data/mysql-bin #==》开启binlog日志功能
#binlog_format = "STATEMENT" #==》设置binlog日志模式为STATEMENT
#binlog_format = "ROW" #==》设置binlog日志模式为ROW
binlog_format = "MIXED" #==》设置binlog日志模式为MIXED