MySQL 日志文件有一下几种:
- 错误日志(error log):It contains information about errors that occur while the server is running (also server start and stop)
- 一般日志(general log):This is a general record of what mysqld is doing (connect, disconnect, queries)
- 慢查询日志(slow query log):Ιt consists of “slow” SQL statements (as indicated by its name).
- 二进制日志 binlog
- 重做日志 redo.log
- 回滚日志 undo.log
Error Log
查看 Error Log 目录
1 | MariaDB [(none)]> show variables like "log_error"; |
Enable Error Log
Go to mysql conf file (/etc/mysql/my.cnf
) and add following lines
1 | [mysqld_safe] |
如果想修改 Error Log 的路径,也可以直接修改 /etc/mysql/my.cnf
。
General Log
General Log 记录了服务器接收到的每一个查询或是命令。
无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument}。
也正因为 mysql 服务器需要不断地记录日志,开启 General log 会产生不小的系统开销。 因此,MySQL 默认是把 General log 关闭的。 我们可以通过修改 MySQL 全局变量来开启 General log 功能或是更改日志存放路径。
查看 General Log 是否打开
查看 MySQL 是否启用了查询日志: show global variables like “%genera%”;
1 | mysql> show global variables like "%genera%"; |
我这里是配置了日志输出文件:/tmp/mysql_query.log,并且日志功能关闭
Enable General Log
Go to mysql conf file (/etc/mysql/my.cnf
) and add following lines
1 | general_log_file = /var/log/mysql/mysql.log |
MySQL 打开 general log 日志后,所有的查询语句都可以在 general log 文件中输出,如果打开,文件会非常大,建议调试的时候打开,平时关闭。
开启方法
查看当前状态
1 | mysql> show variables like 'general%'; |
开启方法 1
可以设置变量那样更改,1 开启(0 关闭),即时生效,不用重启,首选当然是通过这样的方式了。
1 | log = /log/mysql_query.log路径 |
开启方法 2
也可以在 my.cnf 里添加,1 开启(0 关闭),当然了,这样要重启才能生效。
1 | general-log = 1 |
查看 log
当执行 sql 语句时,你可以在 log 文件中实时看到记录:
1 | $ tail -f /usr/local/mysql/data/weishi-mac.log |
Slow Query Log
Enable Slow Query Log
Go to mysql conf file (/etc/mysql/my.cnf
) and add following lines
1 | log_slow_queries = /var/log/mysql/mysql-slow.log |
查看一下与慢日志相关的全局变量:
1 | mysql> show global variables like '%slow%'; |
变量 slow_launch_time 的值代表着捕获所有执行时间超过 2 秒的查询。
slow log 可以记录没有使用索引的查询。开启 log_queries_not_using_indexes,将会记录没有使用索引的查询到 slow 日志里。
1 | mysql> show global variables like '%not_using%'; |
Bin Log(二进制日志)
二进制日志,包含一些事件,这些事件描述了数据库的改动,如建表、数据改动等,主要用于备份恢复、回滚操作等
作用
- 包含了所有更新了数据或者已经潜在更新了数据 (比如没有匹配任何行的一个 DELETE)
- 包含关于每个更新数据库 (DML) 的语句的执行时间信息
- 不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能
- 主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新
- 用于在主复制服务器上记录所有将发送给从服务器的语句
- 启用该选项数据库性能降低 1%,但保障数据库完整性,对于重要数据库值得以性能换完整
格式
Binlog 有 3 种格式
- STATMENT:每一条会修改数据的 sql 都会记录到 master 的 binlog 中,slave 在复制的时候 sql 进程会解析成和原来 master 端执行多相同的 sql 再执行。
有点:在 statement 模式下首先就是解决了 row 模式的缺点,不需要记录每一行数据的变化减少了 binlog 日志量,节省了 I/O 以及存储资源,提高性能。因为他只需要激励在 master 上所执行的语句的细节一届执行语句时候的上下的信息。
缺点:在 statement 模式下,由于他是记录的执行语句,所以,为了让这些语句在 slave 端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在 slave 端被执行的时候能够得到和在 master 端执行时候相同的结果。另外就是,由于 mysql 现在发展比较快,很多的新功能不断的加入,使 mysql 的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug 也就越容易出现。在 statement 中,目前已经发现不少情况会造成 Mysql 的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep () 函数在有些版本中就不能被正确复制,在存储过程中使用了 last_insert_id () 函数,可能会使 slave 和 master 上得到不一致的 id 等等。 - ROW:日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改,只记录要修改的数据,只有 value,不会有 sql 多表关联的情况。
优点:在 row 模式下,bin-log 中可以不记录执行的 sql 语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了,所以 row 的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程和 function,以及 trigger 的调用和出发无法被正确复制问题。
缺点:在 row 模式下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。 - MIXED:MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种
配置
查看 MySQL 中二进制日志的配置情况:show variables like “% log_bin%”;
1 | mysql> show variables like "%log_bin%"; |
log_bin : 用于设定是否启用二进制日志,由此看是未开启。
配置文件仍然是在 /etc/my.cnf 中, 修改 /etc/my.cnf, 增加日志文件目录:
1 | log_bin = /tmp/mysql-bin.log |
事务日志
事务日志(InnoDB 特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序 I/O,而不像随机 I/O 需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
Reference
- https://dev.mysql.com/doc/refman/8.0/en/query-log.html
- https://dev.mysql.com/doc/refman/5.7/en/log-destinations.html
- https://blog.51cto.com/arthur376/1853924
- https://blog.csdn.net/yumushui/article/details/40820763
- https://stackoverflow.com/questions/5441972/how-to-see-log-files-in-mysql
- https://blog.51cto.com/pangge/1319304
- https://www.jianshu.com/p/db19a1d384bc