文章目录
日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。
默认情况下,所有的MySQL日志以文件的方式存放在数据库根目录下(除过在/etc/my.cnf指定某些日志具体的存放位置):
[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# ls
auto.cnf ca.pem ib_logfile0 mysql.ibd server-key.pem
binlog.000001 client-cert.pem ib_logfile1 performance_schema sys
binlog.000002 client-key.pem ibtmp1 private_key.pem undo_001
binlog.index ib_buffer_pool #innodb_temp public_key.pem undo_002
ca-key.pem ibdata1 mysql server-cert.pem
MySQL的日志类型有以下几种:
- 错误日志(error),MySQL服务实例启动、运行或者停止等相关信息。
- 普通查询日志(general),MySQL服务实例运行的所有SQL语句或者MySQL命令。
- 二进制日志(binary),对数据库执行的所有更新语句,不包括select 和show语句。
- 慢查询日志(slow),执行时间超过long_query_time 设置值的SQL语句,或者没有使用索引的SQL语句。
- 事务日志:InnoDB存储引擎所特有。InnoDB事务日志包括重做(redo)日志,以及回滚(undo)日志
一、MySQL日志缓存
一个高速、稳定、可靠的系统,缓存在其中必定起着至关重要的作用。MySQL日志处理也使用了缓存机制。MySQL日志最初存放在MySQL服务器的内存中,若超过指定的存储容量,内存中的日志则写(或者刷新flush)到外存中,以数据库表或者以文件的方式永远的保存在硬盘中。
二、MySQL错误日志(log_error)
MySQL的错误日志主要记录MySQL服务实例每次启动、停止的详细信息,以及MySQL实例运行过程中产生的警告或者错误信息。和其他的日志不同,MySQL的error日志必须开启,无法关闭。
默认情况下,错误日志的文件名为: 主机名.err。 但error 日志并不会记录所有的错误信息,只有MySQL服务实例运行过程中发声的关键错误(critical)才会被记录下来。
mysql> show variables like 'log_error'\G
*************************** 1. row ***************************
Variable_name: log_error
Value: /var/log/mysql-error.log
1 row in set (0.16 sec)
配置文件中写法:
log_error = /var/log/mysql-error.log
三、MySQL普通查询日志(general_log)
MySQL普通查询日志记录MySQL服务实例所有的操作,如select、update、insert、delete等操作,无论该操作是否成功执行。还有MySQL客户机与MySQL服务端连接及断开的相关信息,无论连接成功还是失败。与MySQL普通查询日志有关的参数有三个。
- general_log
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+
1 row in set (0.05 sec)
# 该日志功能关闭
可以通过 set @@global.general_log = 1
的方式来开启普通查询日志。
mysql> set @@global.general_log =1;
Query OK, 0 rows affected (0.18 sec)
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | ON |
+---------------+-------+
1 row in set (0.07 sec)
但是通过这种方式修改MySQL的变量只会在当前的MySQL实例运行期间生效,一旦MySQL重启,则会重新恢复到默认的状态。
永久生效的方式是修改mysql 的my.cnf 文件。在配置文件后添加:
general_log = 1
general_log_file = /file/path
- general_log_file
普通查询日志一旦开启,MySQL服务实例将自动创建普通查询日志文件,general_log_file参数设置了普通查询日志文件的物理位置。如下:
mysql> show variables like 'general_log_file';
+------------------+-------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------+
| general_log_file | /usr/local/mysql/data/localhost.log |
+------------------+-------------------------------------+
1 row in set (0.05 sec)
注意:由于普通查询日志几乎记录了MySQL的所有操作,对于数据访问频繁的数据库服务器而言,如果开启MySQL的普通查询日志将会大幅度的降低数据库的性能,因此建议关闭普通查询日志。只有在特殊时期,如需要追踪某些特殊的查询日志,可以临时打开普通的查询日志。
- log_output
log_output参数设置了普通查询日志以及慢查询日志的内容存储到数据库表中。 可以使用set @@global.log_output='table'
将普通查询日志及慢查询日志存入mysql系统数据库中的general 表 以及slow_log 表中。值得注意的是这两个表的存储引擎为CSV,此后查看新的普通查询日志内容时便可以使用SQL语句;
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.07 sec)
mysql> set @@global.log_output = 'table';
Query OK, 0 rows affected (0.15 sec)
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set (0.07 sec)
mysql> desc mysql.general_log\G;
*************************** 1. row ***************************
Field: event_time
Type: timestamp(6)
Null: NO
Key:
Default: CURRENT_TIMESTAMP(6)
Extra: DEFAULT_GENERATED on update CURRENT_TIMESTAMP(6)
*************************** 2. row ***************************
……省略以下输出内容……
四、MySQL慢查询日志(slow_query_log)
使用MySQL慢查询日志可以有效的跟踪 执行时间过长 或者 没有使用索引的查询语句。这种包括select 语句,update语句,delete语句,以及insert语句,为优化查询提供帮助。与普通查询日志不同的另一个区别在于,慢查询日志只包含成功执行过的查询语句。与MySQL慢查询日志有关的参数有5个。
- slow_query_log
slow_query_log 设置慢查询日志是否开启。
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.08 sec)
可以通过set @@global.slow_query_log = 1
的方式来开启普通查询日志。
mysql> set @@global.slow_query_log = 1;
Query OK, 0 rows affected (0.19 sec)
以上方式是临时性的,永久配置要在/etc/my.cnf配置文件中设置:
slow_query_log