日志
redo log
基本介绍
重做日志:是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复,用来保证事务的持久性
是记录物理级别上的页操作,比如 xxx 页、yyy 偏移量写入了 zzz 数据。主要是保证数据的可靠性
为什么要有 redo 日志?
没有 redo 日志的话,持久化会有什么问题?
前置知识: Innodb 是以页为单位进行磁盘 IO 的,一个页的大小是 16KB
- 数据修改量和刷盘工作量严重不成比例
解释:如果我们只改了一个字节,就要刷盘 16KB,这个成本就太高了。
- 随机 IO 刷新较慢
一个事务会包含多条 SQL 语句,即使一条 SQL 一句可能会更改许多页面,随机 IO 不同的页面就成本很高。
工作原理
InnoDB 采用和 WAL(Write-Ahead Logging) 技术,这种技术的思想是先写日志,后更新磁盘,只有日志写入成功才算事务提交成功(题外话:Redis 的 AOP 日志就是写后日志),当发生宕机未刷到磁盘就会 redo 来恢复,保证 ACID 的 D。
优点:
- 降低刷盘频率
- 日志占用空间较少
特点:
- 按顺序写入磁盘:每条 sql 语句可能会产生若干条 redo 日志,这些日志是顺序 IO,效率很快
- 事务执行过程中,redo 日志不断记录的,事务提交会一次写到 bin 日志文件中(后面会说 bin log)
undo log
基本介绍
回滚日志:是 Innodb 存储引擎层生成的日志,实现了事务中的原子性、一致性,主要用于事务回滚和 MVCC
我们在执行一条“增删改”语句时,虽然没有输入 begin 和 commit 事务,但是 MySQL 会隐式开启事务来执行,这样就保证了“增删改”之后,我们可以及时看到数据库中更新的结果了。
是逻辑操作日志,如 INSERT 操作,undo 就记录一条相反的 DELETE 操作
为什么要有 undo 日志?
事务回滚:当事务对数据库中的某一行数据进行修改时(例如UPDATE或DELETE操作),InnoDB不会直接覆盖该行的原始数据,而是先在Undo日志中记录修改前的数据。这样,如果事务需要回滚,就可以通过Undo日志恢复到修改前的状态
MVCC: 通过Undo日志,InnoDB可以为每个事务提供一个一致性的视图,即使其他事务正在并发地修改数据。这样,每个事务都能够看到它开始时的数据版本,而不会受到其他事务的干扰
binlog
基本介绍
记录所有更改数据库的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时的无损失恢复。是 Server 层生成的日志,只记录更新操作,主要用于数据备份和主从复制。
如果想查看查询(或所有其他)操作,使用通用查询日志
MySQL 的数据备份、主主、主备、主从都离不开 binlog,需要 binlog 来同步数据,保证数据的一致性。
todo 这个后面设计到 MySQL 高可用部分,还会更新
其他日志
通用查询日志
记录用户的所有操作,包括启动和关闭 MySQL 服务、所有用户的连接开始时间和截止时间、发给 MySQL 数据库服务器的所有指令等。
作用:
- 故障排查:当出现数据库性能问题或异常时,通过查看通用查询日志可以帮助分析问题所在。可以通过日志中的查询语句和执行时间等信息,定位到潜在的性能瓶颈或错误操作。
- 性能优化:通过分析通用查询日志,可以发现哪些查询操作消耗了较多的时间和资源,从而进行优化。通过优化查询语句或索引的设计,可以提升数据库的性能和响应速度。
注:通用查询日志是默认关闭的,为了避免性能损耗不建议长期开启
使用方法
开启方法:在配置文件中设置
-- slow_query_log = 1;
-- 以及
slow_query_log_file = /path/to/slow-query.log;
-- 查看日志开启状态,以及查看指定的日志文件。
SHOW VARIABLES LIKE 'general_log';
错误日志
记录了 MySQL 服务器的启动、停止运行的时间,以及系统启动、运行和停止进程中的诊断信息,包括错误、警告和提示等
作用:
- 通过错误日志可以查看系统的运行状态,便于发现故障、修复故障。如果 MySQL 服务器出现异常,错误日志是发现问题、解决问题的首选。
注:MySQL 错误日志是默认开启的,而且错误日志无法关闭。
查看方法
-- 查询 MySQL 错误日志路径:
SHOW VARIABLES LIKE 'log_error';
-- 使用控制台查看 MySQL 错误日志的命令:
SHOW ERROR LOGS
慢查询日志
具体使用看 MySQL 性能优化那篇博客
记录所有执行时间超过 long_query_time 的所有查询,方便我们对查询进行优化
日志的弊端
- 日志功能会降低 MySQL 数据库的性能。例如,在查询非常频繁的 MySQL 数据库系统中,如果开启了通用查询日志和慢查询日志,MySQL 会花费很长时间来记录日志
- 日志会占用大量的磁盘空间。对于用户量非常大,操作非常频繁的数据库,日志文件的存储空间设置比文件需要的磁盘空间还大。