Mysql的几种日志

目录

 

redo log

bin log

relay log

slow query log

general query log

error log


redo log

redo log属于MySQL中InnoDB存储引擎的事务日志。一般情况下宕机重启后redo log可以恢复Buffer缓存中没有持久化到磁盘的数据。

由于MySQL的数据是存放在磁盘中的,每次读写数据都需做磁盘IO操作,如果并发场景下性能就会很差。所以MySQL中提供了一个优化手段,引入缓存Buffer Pool。缓存中包含了磁盘中部分数据页(page)的映射,以此来缓解数据库的磁盘压力。

所以其实我们执行查询sql时,mysql服务首先从缓存中读取,如果缓存中没有,则从磁盘读取后放入缓存;当向数据库写入数据时,先向缓存写入,此时缓存中的数据页数据变更,这个数据页称为脏页,Buffer Pool中修改完数据后会按照设定的更新策略,定期刷到磁盘中,这个过程称为刷脏页。当Mysql服务宕机重启时,Buffer Pool中修改的数据可能还没有及时的刷到磁盘中,就会导致数据丢失,无法保证事务的持久性。而redo log可以用来恢复提交后的物理数据页。redo log用到了WAL(Write-Ahead Logging)技术,这个技术的核心就在于修改记录前,一定要先写日志,并保证日志先落盘,才能算事务提交完成。有了redo log再修改数据时,InnoDB引擎会把更新记录先写在redo log中,在修改Buffer Pool中的数据,当提交事务时,调用fsync把redo log刷入磁盘。至于缓存中更新的数据文件何时刷入磁盘,则由后台线程异步处理。

bin log

bin log是一种数据库Server层(和什么引擎无关),又叫归档日志,以二进制形式存储在磁盘中的逻辑日志。bin log用来记录数据库所有DDL和DML操作(不包含 SELECT 和 SHOW等命令,因为这类操作对数据本身并没有修改)。bin log主要应用于MySQL主从模式(master-slave)中,主从节点间的数据同步。主从复制过程大概描述:从库slave的I/O线程连接上Master,并请求读取指定位置position的日志内容;Master收到从库slave请求后,将指定位置position之后的日志内容,和主库bin log文件的名称以及在日志中的位置推送给从库;slave的I/O线程接收到数据后,将接收到的日志内容依次写入到relay log文件最末端,并将读取到的主库bin log文件名和位置position记录到master-info文件中,以便在下一次读取用;slave的SQL线程检测到relay log中内容更新后,读取日志并解析成可执行的SQL语句,这样就实现了主从库的数据一致。

一个bin log日志文件默认最大容量1G(也可以通过max_binlog_size参数修改),单个日志超过最大值,则会新创建一个文件继续写。bin log日志的内容格式其实就是执行SQL命令的反向逻辑,这点和undo log有点类似。一般来说开启bin log都会给日志文件设置过期时间(expire_logs_days参数,默认永久保存)。默认情况下,二进制日志功能是关闭的。可以通过以下命令查看二进制日志是否开启

SHOW VARIABLES LIKE 'log_bin';

relay log

relay log日志文件具有与bin log日志文件相同的格式,从上边MySQL主从复制的流程可以看出,relay log起到一个中转的作用,slave先从主库master读取二进制日志数据,写入从库本地,后续再异步由SQL线程读取解析relay log为对应的SQL命令执行。


slow query log

用来记录在 MySQL 中执行时间超过指定时间的查询语句,在 SQL 优化过程中会经常使用到。通过慢查询日志,我们可以查找出哪些查询语句的执行效率低,耗时严重。出于性能方面的考虑,一般只有在排查慢SQL、调试参数时才会开启,默认情况下,慢查询日志功能是关闭的。通过如下命令开启慢查询日志

SET GLOBAL slow_query_log=ON;

通过查看long_query_time参数可以看到 默认超过10秒的sql会被记录到slow query log日志中。

SHOW VARIABLES LIKE 'long_query_time';

可以自定义修改慢查询SQL日志的时间

SET GLOBAL long_query_time=3;

general query log

记录用户的所有操作,包括客户端何时连接了服务器、客户端发送的所有SQL以及其他事件,比如 MySQL 服务启动和关闭等等。MySQL服务器会按照它接收到语句的先后顺序写入日志文件。默认情况下,该日志功能是关闭的,通常会在排查故障需获得详细日志的时候才会临时开启。通过以下命令查看一般查询日志是否开启

show variables like 'general_log';

开启一般查询日志

SET GLOBAL general_log=on;

 查看日志存放的位置

show variables like 'general_log_file';

error log

记录 MySQL 服务器每次启动和停止的时间以及诊断和出错信息。默认情况下,该日志功能是开启的。

查看错误日志文件的存放路径

SHOW VARIABLES LIKE 'log_error';

猜你喜欢

转载自blog.csdn.net/qq_29569183/article/details/112367858