您现在的位置是:首页 >技术教程 >MySQL学习总结(二)网站首页技术教程
MySQL学习总结(二)
Binary Log
MySQL 的二进制日志(Binary Log)是 MySQL 数据库用于记录数据库的修改操作的一种二进制文件。它记录了所有对数据库的修改操作,包括增、删、改等操作。Binary Log 的主要作用是用于数据恢复和主从复制。
Binary Log 的作用
-
数据恢复:当数据发生错误或丢失时,可以通过 Binary Log 进行数据恢复。Binary Log 记录了所有对数据库的修改操作,包括增、删、改等操作,可以通过回放 Binary Log 中的操作来恢复数据。
-
主从复制:MySQL 支持主从复制(Master-Slave Replication),可以将一个数据库的修改操作同步到其他的数据库上。在主从复制中,主数据库会将自己的 Binary Log 发送给从数据库,从数据库会按照主数据库的顺序执行 Binary Log 中的操作,从而实现数据的同步。
Binary Log 的记录内容
Binary Log 记录了所有对数据库的修改操作,包括增、删、改等操作。它记录的内容包括以下几个部分:
-
事件头(Event Header):每个事件都有一个事件头,用于记录事件的类型、时间戳、服务器 ID 等信息。
-
事件体(Event Body):事件体记录了具体的事件内容,包括对哪个数据库的哪个表进行了什么操作。
-
Checksum:MySQL 5.6 之后的版本支持对 Binary Log 进行校验和验证,保证 Binary Log 的完整性。
-
GTID(Global Transaction ID):MySQL 5.6 之后的版本支持 GTID,可以用于在主从复制中跟踪事务的状态。GTID 包括一个全局事务 ID 和一个服务器 ID。
Binary Log 的工作原理
当 MySQL 接收到一个修改数据库的操作时,会将该操作写入 Binary Log 中。MySQL 使用的是基于语句的复制(Statement-Based Replication),也就是将语句本身写入 Binary Log 中。在主从复制中,主数据库将自己的 Binary Log 发送给从数据库,从数据库会按照主数据库的顺序执行 Binary Log 中的操作,从而实现数据的同步。
在 MySQL 5.6 之后的版本中,Binary Log 支持 GTID,可以用于在主从复制中跟踪事务的状态。当一个事务在主数据库中提交时,主数据库会为该事务生成一个全局事务 ID,然后将该事务的 Binary Log 记录中添加 GTID。在从数据库中执行 Binary Log 中的操作时,MySQL 会将 GTID 记录到 Relay Log 中,以便在主从切换时可以快速地找到同步的位置。
总结
Binary Log 是 MySQL 的一种二进制文件,用于记录数据库的修改操作。它的作用是用于数据恢复和主从复制。Binary Log 记录了所有对数据库的修改操作,包括增、删、改等操作。在主从复制中,主数据库会将自己的 Binary Log 发送给从数据库,从数据库会按照主数据库的顺序执行 Binary Log 中的操作,从而实现数据的同步。Binary Log 支持 GTID,可以用于在主从复制中跟踪事务的状态。
Redo Log
Redo Log 是 MySQL 数据库引擎 InnoDB 用于保证事务持久性的一种机制。在事务提交时,MySQL 会将该事务的 Redo Log 记录到磁盘上,以保证事务的修改操作持久化。Redo Log 的主要作用是用于数据库的崩溃恢复(Crash Recovery)和数据恢复。
Redo Log 的作用
-
数据库的崩溃恢复:当数据库崩溃时,MySQL 可以通过 Redo Log 来恢复已提交的事务的修改操作。MySQL 会先从 Redo Log 中找到最后一个已提交的事务,然后将该事务的 Redo Log 中记录的修改操作应用到数据库中,从而恢复数据库的状态。
-
数据恢复:当数据库出现错误或丢失数据时,可以通过 Redo Log 来恢复数据。MySQL 会根据 Redo Log 中记录的修改操作来恢复数据。
Redo Log 的记录内容
Redo Log 记录了所有的修改操作,包括插入、更新、删除等操作。它记录的内容包括以下几个部分:
-
事务 ID:每个事务都有一个唯一的事务 ID,用于标识该事务。
-
重做日志记录(Redo Log Record):每个修改操作都会记录到 Redo Log Record 中,包括修改的对象、修改前的值和修改后的值等信息。
-
Checkpoint信息:记录了当前数据库的状态,包括哪些页已经写入磁盘等信息。Checkpoint信息可以用于加速数据库的恢复。
Redo Log 的工作原理
当一个事务提交时,MySQL 会先将该事务的 Redo Log 记录到内存中的 Redo Log Buffer 中。随着 Redo Log Buffer 的填满,MySQL 会将 Redo Log Buffer 中的内容刷新到 Redo Log 文件中。Redo Log 文件是一个循环文件,当文件写满时,MySQL 会将最早的 Redo Log 删除,以便继续写入新的 Redo Log。
在数据库崩溃恢复时,MySQL 会先从 Redo Log 中找到最后一个已提交的事务,然后将该事务的 Redo Log 中记录的修改操作应用到数据库中,从而恢复数据库的状态。如果数据库在提交事务之前崩溃,MySQL 可以通过 Redo Log 来恢复已提交的事务的修改操作。
刷盘机制
redo日志
-
先将原始数据从磁盘读入内存(缓冲池 Buffer pool),事务发生时,会修改内存中的拷贝,此时还未写入磁盘
-
生成redo日志,写入redo log buffer
-
当事务commit之后,以一定的频率 (innodb_flush_log_at_trx_commit也就是刷盘策略)写入redo log file(在磁盘中)
-
innodb_flush_log_at_trx_commit
设置 0 不刷盘,操作系统默认每1秒进行同步
1 事务提交就刷盘(其实就是写入PageCache 立即刷盘 写入redo log file )
2 事务提交将redo log buffer写入PageCache 每秒刷新一次到磁盘 -
redo log file里有个checkpoint(之前都写入磁盘),write pos(写入位置)保证事物的持久性
总结
Redo Log 是 MySQL 数据库引擎 InnoDB 用于保证事务持久性的一种机制。它的主要作用是用于数据库的崩溃恢复和数据恢复。Redo Log 记录了所有的修改操作,包括插入、更新、删除等操作。在事务提交时,MySQL 会将该事务的 Redo Log 记录到磁盘上,以保证事务的修改操作持久化。在数据库崩溃恢复时,MySQL 会先从 Redo Log 中找到最后一个已提交的事务,然后将该事务的 Redo Log 中记录的修改操作应用到数据库中,从而恢复数据库的状态。Redo Log 是 MySQL 数据库的重要组成部分,对于数据库的性能和可靠性有重要的影响。
Undo Log
Undo Log 是 MySQL 数据库引擎 InnoDB 用于支持事务的一种机制。在事务执行时,MySQL 会将该事务的 Undo Log 记录到磁盘上,以支持事务的回滚操作。Undo Log 的主要作用是用于数据库的崩溃恢复(Crash Recovery)和事务的回滚操作。
Undo Log 的作用
-
数据库的崩溃恢复:当数据库崩溃时,MySQL 可以通过 Undo Log 来恢复未提交的事务的修改操作。MySQL 会将 Undo Log 中记录的修改操作撤销,从而恢复数据库的状态。
-
事务的回滚:当事务执行失败或需要回滚时,MySQL 可以通过 Undo Log 来撤销事务的修改操作,从而回滚事务。
Undo Log 的记录内容
Undo Log 记录了事务修改操作的相反操作,包括插入、更新、删除等操作的相反操作。它记录的内容包括以下几个部分:
-
事务 ID:每个事务都有一个唯一的事务 ID,用于标识该事务。
-
Undo Log 记录(Undo Log Record):每个修改操作都会记录到 Undo Log Record 中,包括修改的对象、修改前的值和修改后的值等信息,以及该操作的相反操作。
Undo Log 的工作原理
当一个事务执行修改操作时,MySQL 会将该事务的 Undo Log 记录到内存中的 Undo Log Buffer 中。随着 Undo Log Buffer 的填满,MySQL 会将 Undo Log Buffer 中的内容刷新到 Undo Log 文件中。Undo Log 文件是一个循环文件,当文件写满时,MySQL 会将最早的 Undo Log 删除,以便继续写入新的 Undo Log。
在数据库崩溃恢复时,MySQL 会根据 Checkpoint 信息找到所有未提交的事务,并将这些事务的 Undo Log 中记录的修改操作撤销,从而恢复数据库的状态。在事务回滚时,MySQL 会根据 Undo Log 中记录的相反操作来撤销事务的修改操作,从而回滚事务。
总结
Undo Log 是 MySQL 数据库引擎 InnoDB 用于支持事务的一种机制。它的主要作用是用于数据库的崩溃恢复和事务的回滚操作。Undo Log 记录了事务修改操作的相反操作,包括插入、更新、删除等操作的相反操作。在事务执行修改操作时,MySQL 会将该事务的 Undo Log 记录到内存中的 Undo Log Buffer 中,然后将其刷新到 Undo Log 文件中。在数据库崩溃恢复时,MySQL 会将所有未提交的事务的 Undo Log 中记录的修改操作撤销,从而恢复数据库的状态。在事务回滚时,MySQL 会根据 Undo Log 中记录的相反操作来撤销事务的修改操作,从而回滚事务。Undo Log 是 MySQL 数据库的重要组成部分,对于数据库的性能和可靠性有重要的影响。
redo log 中记录了事务修改后的数据,undo log 记录了事务修改的逆向操作
Redo Log 记录了事务在执行过程中对数据所做的修改,而这些修改是直接将数据页从磁盘读入内存进行的修改,因此 Redo Log 中记录的是修改后的数据。在数据库恢复时,MySQL 会根据 Redo Log 中的记录,将已提交的事务所做的修改重新应用到内存中的数据页中,从而恢复数据库的状态。
而 Undo Log 记录了事务修改的逆向操作,也就是事务执行过程中所做的修改的相反操作。当事务需要回滚时,MySQL 会根据 Undo Log 中的记录,将事务所做的修改逆向执行,从而撤销事务的修改操作,回滚事务。Undo Log 的作用是保证事务的原子性和一致性,也用于数据库崩溃恢复。