深入理解 MySQL 中的日志类型及其应用场景
目录标题
- MySQL 中的日志类型这么多,它们都有哪些作用?
- 1.错误日志(Error Log)
- 2.事务日志
- 2.1 InnoDB Redo Log(重做日志)
- 2.2 InnoDB Undo Log (撤消日志)
- 3.查询日志(General Query Log)
- 4.慢查询日志 (Slow Query Log)
- 5.二进制日志(Binary Log)
- 6.中继日志 (Relay Log)
- 总结一下
MySQL 中的日志类型这么多,它们都有哪些作用?
我经常在面试别人的时候,特别喜欢问一些生产性的问题。例如:如果数据库偶发性地变慢,你该如何排查?再例如,数据库主从复制突然延时增加,你又怎么排查呢?
问这种问题最主要的原因是想考验一下面试者在工作中处理问题的能力,这种能力只能够是在足够了解一个事物原理的基础上才能拥有。并且在日常的工作当中或者在面试大厂的时候,也经常会遇到类似的问题。
那么遇到类似的问题该怎么解决呢?今天我们就来聊一聊这个话题。
通常,遇到一些未知的问题(类似于上述的两个问题)时,我们的第一反应是查看日志。那么这个时候问题又来了:该看什么日志呢?
在 MySQL 数据库当中,有很多种日志,每一种日志的作用都不尽相同。
1.错误日志(Error Log)
首先,我们介绍一下 MySQL 数据库中的错误日志,顾名思义主要是用来记录 MySQL 数据库中出现的错误或者警告的,下面我们来看一下它的位置。
mysql> show variables like '%log_error%';
+---------------------+---------------------+
| Variable_name | Value |
+---------------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------------+---------------------+
3 rows in set (0.13 sec)
其中,/var/log/mysqld.log
就是 MySQL 数据库错误日志的路径。
如果,要想将错误信息写入到错误日志中,还受 MySQL 数据库中 log_warnings
参数的影响,该参数有三个参数,分别是 0、1 和大于 1 三个参数。下面我们将来证明这三个参数的作用,分别如下。
- 当
log_warnings
的结果为 0 时,不记录警告日志。
— 设置为0
mysql> set GLOBAL log_warnings=0;
Query OK, 0 rows affected, 1 warning (0.00 sec)
— 查看设置结果
mysql> show variables like ‘%log_warnings%’;+———————-+———-+ | Variable_name | Value |+———————-+———-+ | log_warnings | 0 |+———————-+———-+ 1 row in set (0.00 sec)
— 使用明文密码,制造一个警告日志
[root@dxd ~]# mysql -uroot -pTest123! -h172.17.16.2
— 查看错误日志
[root@dxd ~]# cat /var/log/mysqld.log [root@dxd ~]#
我们可以看到,没有记录警告日志。
- 当
log_warnings
的结果为 1 时,记录错误日志,并且将警告日志也记录到错误日志之中。
— 设置为 1
[root@dxd ~]# vim /etc/my.cnf log_warnings=1
— 查看设置结果
mysql> show variables like ‘%log_warnings%’;
+———————-+———-+ | Variable_name | Value |
+———————-+———-+ | log_warnings | 1 |
+———————