场景:
redo log
假设现在我们想对数据库的数据进行修改操作,现在一条 update 语句过来,一般 update 操作都伴随着查询的操作,得先找到这条数据,然后再进行更新操作对吧。
如果我有好几十条 update 语句先后更新呢?这样想的话,你就能想到,就这些操作,成本就高的不行,那能不能降低一下这些成本呢?
但是此时,它并没有更新到磁盘上去对吧?别担心, InnoDB 会在恰当的时候,把这条及记录更新到磁盘上去,
而这个更新往往是在系统比较空闲的时候做。
这样的思想或者技术,有个专有名词: WAL 技术
,也就是WriteAheadLogging
,核心就是先写日志,再写磁盘
。
redo log 的大小是固定的,前面的内容会被覆盖,一旦写满,就会触发 redo log 到磁盘的同步,以便腾出空间记录后面的修改。
bin log
binlog
记录了所有数据库【表结构】变更(例如CREATE、ALTER TABLE…
)以及【表数据】修改(INSERT、UPDATE、DELETE…
)的二进制日志
。不会记录SELECT和SHOW
这类操作,因为这类操作对数据本身并没有修改,但可以通过查询通用日志来查看MySQL执行过的所有语句。
binlog是mysql server
层维护的,跟采用何种引擎没有关系,记录的是所有的更新操作的日志记录。binlog
是在事务最终commit
前写入的。我们执行SELECT
等不涉及数据更新的语句是不会记binlog
的,而涉及到数据更新则会记录。要注意的是,对支持事务的引擎如innodb而言,必须要提交了事务才会记录binlog
。
binlog 文件写满后,会自动切换到下一个日志文件继续写,而不会覆盖以前的日志,这个也区别于 redo log,redo log 是循环写入的,即后面写入的可能会覆盖前面写入的。
mysql中binlog和redolog的区别
- MySQL中的binlog和redolog都是用于数据恢复或复制的日志文件,但它们的作用不同。
- binlog (binary log)
binlog是MySQL的二进制日志文件,记录了所有数据库的修改操作。它包含了在数据库中执行的所有语句,例如INSERT、UPDATE和DELETE等等。binlog可以用于以下用途:
- 数据恢复:在发生故障的情况下,可以使用binlog将数据还原到故障发生之前的状态。
- 数据复制:可以使用binlog将数据库更改操作复制到其他MySQL服务器上,通常用于备份、负载均衡、高可用等。
- 数据库故障调试:可以使用binlog来查找数据库操作历史记录,查找错误的原因。
- redolog (redo log)
redolog是MySQL的重做日志文件,记录了当事务进行修改操作时所进行的一系列物理操作,例如页的创建、修改和删除等等。redolog可以用于以下用途:
- 数据恢复:在发生崩溃的情况下,可以使用redolog将数据库恢复到崩溃之前的状态。
- 数据库性能优化:redolog是在内存中缓存的,可以快速记录磁盘中的所有修改操作,提高数据库性能。通常建议将redolog文件放在快速磁盘上,如SSD等。
总的来说,binlog和redolog的功能不同,但它们都可以用于数据库数据的恢复和复制。在实际的应用场景中,我们可以根据需求来选择使用哪种日志。
使用场景是怎么样的呢
- binlog的使用场景:
- 数据恢复:可以使用binlog来恢复数据库到特定时间点的状态,也可以将数据库从备份还原后使用binlog来恢复数据到备份生成后的某个时间点。
- 数据复制:可以使用binlog将主数据库的更改复制到从数据库,从而实现数据备份、负载均衡、高可用集群等。
- redolog的使用场景:
- 数据恢复:redolog记录了事务执行的过程中,所进行的修改操作,当MySQL服务器宕机或者崩溃时,会使用redo log来将它们重新执行,从而将数据库回滚到宕机前的状态。
- 提高数据库性能:当事务执行过程中,MySQL需要频繁地将数据写入磁盘,这样会消耗大量的时间和I/O资源。为了提高MySQL的性能,MySQL会将redo log暂存在内存中,最终再将其写入磁盘。此时,如果将redo log文件放在SSD等快速存储设备上,可以更快地将其写入磁盘,从而提升MySQL的性能。
综上所述,binlog主要用于数据恢复和数据复制,而redo log主要用于提高MySQL的性能和数据恢复。在实际应用中,应根据具体需求来选择使用哪种日志。
评论区