Myql几种日志

133 阅读2分钟

你知道Mysql有几种日志,这几种日志分别有什么用处呢?

Mysql有以下几种日志

 redo log、undo log、bin log、relay log、error log、slow query log、general log

重点讨论一下redo log、undo log、bin log、relay log

redo log(重做日志)用来实现事物持久性。MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。  MySQL中数据的读取是以页为单位,当你查询数据的时候,它会从硬盘把一页(16KB)的数据加载出来,放入到Buffer Pool中。 后续的查询都是先从Buffer Pool中找,没有命中再去硬盘加载,减少硬盘IO开销,提升性能。 更新表数据的时候,也是如此,发现Buffer Pool里存在要更新的数据,就直接在Buffer Pool里更新。 然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。然后才更新到磁盘上。这里大家应该很容易想到,如果在数据写入到磁盘之前数据库挂了那么岂不是数据就丢失了,那么redo log就是为了解决这个问题。

undo log(回滚日志)用来实现事物原子性。它可以用于回滚事务和实现MVCC。在执行事务的过程中,将回滚所需的信息都记录在undolog中,回滚时根据undolog中的数据做相反的操作。

bin log(二进制日志),relay log(中继日志),用来实现主从复制从而达到备份恢复或者数据库读写分离

主从复制的原理

1、主库的写操作(update、insert、delete)被记录binlog

2、从库发起连接,连接到主库。 

3、主库创建一个 binlog dump thread,把 bin log 的内容发送到从库。

4、 从库创建一个 I/O 线程,读取主库传过来的 bin log 内容并写到 relay log 

5、从库创建一个SQL线程,从 relay log 里面读取内容,将更新内容写入到 数据里

Mysql的binlog的几种格式

有三种statement、row、mixed

statement:每一条修改数据的sql都会记录在binlog中,不需要记录每一行的变化,减少binlog的日志量节约io,提升了性能,由于sql执行是有上下文的,因此还要保存相关信息。

row:不记录sql语句上下文相关信息,记录单元为每一行的改动,导致日志量大。

mixed:statement和row的组合mysql自行决定使用哪一种。