MySQL 8.0与MySQL 5.7的binlog差异小结

数据库 MySQL
Binlog是MySQL的一个重要特性,它是一个用于记录数据库变更的二进制日志文件,每一条会修改数据的SQL语句都会被记录在binlog中。

MySQL是一个广泛使用的开源关系型数据库管理系统,它提供了许多强大的功能,如事务、存储过程、触发器、视图、全文索引等。但是,MySQL也有一些不足之处,比如数据的安全性和可靠性。如果数据库发生故障或损坏,如何恢复数据?如果数据库需要进行主从复制或读写分离,如何保证数据的一致性?这些问题都需要借助一个特殊的机制来解决,那就是binlog。

1. binlog的主要用途

binlog是MySQL的一个重要特性,它是一个用于记录数据库变更的二进制日志文件,每一条会修改数据的SQL语句都会被记录在binlog中。通过binlog,我们可以实现以下几个目的:

数据恢复:如果数据库发生故障或损坏,我们可以通过binlog来恢复数据,只需要将binlog中的SQL语句按照顺序重新执行一遍,就可以将数据库恢复到故障发生前的状态。

主从复制:如果数据库需要进行主从复制,我们可以通过binlog来实现,只需要将主库的binlog传输到从库,并在从库上执行binlog中的SQL语句,就可以将从库的数据与主库保持一致。

审计:如果数据库需要进行审计,我们可以通过binlog来实现,只需要分析binlog中的SQL语句,就可以了解数据库的变更历史,如何操作,何时操作,操作了哪些数据等。

可以看出,binlog是MySQL的一个非常重要的特性,它对于数据库的安全性和可靠性有着重要的作用。但是,随着MySQL的版本更新,binlog也发生了一些变化,这些变化可能会影响我们对binlog的使用和理解。在本文中,我们将介绍MySQL 8.0版本与MySQL 5.7版本在binlog方面的主要差异,以及这些差异的原因和影响。

2. binlog格式的变化

binlog的格式决定了binlog中记录的内容和形式,MySQL支持三种binlog格式,分别是:

STATEMENT:每一条会修改数据的SQL语句都会记录在binlog中,不记录具体的数据变化,而是记录SQL语句的上下文信息,如执行时间、用户、数据库、表等。

ROW:每一条会修改数据的SQL语句都会记录在binlog中,不记录SQL语句本身,而是记录每一行数据的变化,如插入、更新、删除等。

MIXED:根据SQL语句的类型和特性,自动选择STATEMENT或ROW格式来记录binlog,以达到最佳的效果。

MySQL 8.0版本与MySQL 5.7版本在binlog格式方面的主要差异是:

  • MySQL 8.0版本引入了一个新的系统变量binlog_expire_logs_seconds,用来设置binlog的过期时间,单位是秒。这个变量比MySQL 5.7的expire_logs_days更精确,可以根据需要动态调整。
  • MySQL 8.0版本支持了事务性数据字典,这意味着数据字典的变更也会记录在binlog中,以保证主从复制的一致性。
  • MySQL8.0版本增加了一个新的binlog事件类型TRANSACTION_PAYLOAD_EVENT,用来存储事务的元数据,如事务ID,事务大小,是否只读等。这些信息可以用来优化复制性能和监控事务活动。
  • MySQL8.0版本改进了binlog的压缩算法,使用了zstd压缩库,可以提高压缩比和压缩速度,同时减少CPU的开销。

原因:

  • MySQL 8.0版本引入了binlog_expire_logs_seconds变量,是为了提供更灵活的binlog管理,避免binlog文件过多占用磁盘空间,也避免binlog文件过少导致数据恢复或复制失败。
  • MySQL 8.0版本支持了事务性数据字典,是为了提高数据库的可靠性和一致性,避免数据字典的损坏或不同步导致的问题。
  • MySQL 8.0版本增加了TRANSACTION_PAYLOAD_EVENT事件类型,是为了提高复制的效率和稳定性,避免复制延迟或丢失数据的问题。
  • MySQL 8.0版本改进了binlog的压缩算法,是为了提高binlog的传输和存储性能,节省网络和磁盘资源,降低系统的负载。

影响:

  • MySQL 8.0版本引入了binlog_expire_logs_seconds变量,对于用户来说,可以更灵活地设置binlog的过期时间,根据业务需求和资源情况进行调整,提高binlog的管理效率。
  • MySQL8.0版本支持了事务性数据字典,对于用户来说,可以更放心地使用MySQL,不用担心数据字典的损坏或不同步导致的问题,也可以更方便地查看和修改数据字典的信息。
  • MySQL 8.0版本增加了TRANSACTION_PAYLOAD_EVENT事件类型,对于用户来说,可以更快速地进行主从复制,也可以更清晰地监控事务的活动,提高数据库的性能和可观察性。
  • MySQL8.0版本改进了binlog的压缩算法,对于用户来说,可以更节省网络和磁盘资源,也可以更快地传输和存储binlog,提高数据库的性能和可靠性。

3. binlog管理的变化

binlog的管理主要涉及到binlog的生成、传输、存储、删除等操作,MySQL提供了一些命令和变量来进行binlog的管理,如:

  • show master logs:查看所有binlog的日志列表。
  • show master status:查看binlog日志状态。
  • flush logs:刷新binlog日志文件,刷新之后会创建一个新的binlog日志文件。
  • reset master:清空所有的binlog日志文件。
  • mysqlbinlog:查看或解析binlog日志文件的内容。
  • log_bin:binlog的开关。
  • binlog_format:binlog日志的格式。
  • expire_logs_days:binlog日志的过期天数。
  • sync_binlog:binlog日志的同步策略。

MySQL 8.0版本与MySQL 5.7版本在binlog管理方面的主要差异是:

  • MySQL 8.0版本引入了一个新的系统变量binlog_expire_logs_seconds,用来设置binlog的过期时间,单位是秒。这个变量比MySQL 5.7的expire_logs_days更精确,可以根据需要动态调整
  • MySQL8.0版本引入了一个新的系统变量binlog_rotate_encryption_master_key_at_startup,用来设置是否在启动时旋转加密的binlog主键。如果这个变量设置为ON,那么每次服务器重启时,都会生成一个新的binlog加密密钥,并用作新的binlog主键。这样可以增强binlog的安全性,防止密钥泄露或被破解
  • MySQL 8.0版本支持使用ALTER INSTANCE ROTATE BINLOG MASTER KEY语句手动旋转binlog主键。当使用这个语句时,服务器会执行以下操作:生成一个新的binlog加密密钥并存储在密钥环上,用作新的binlog主键;旋转所有通道上的binlog和中继日志文件;使用新的binlog主键加密新的和现有的binlog和中继日志文件的文件密码;删除不再使用的binlog加密密钥
  • MySQL8.0版本支持使用binlog_row_event_max_size系统变量设置row格式的binlog事件的最大大小,单位是字节。这个变量是一个软限制,尽可能地将binlog中的行分组到不超过这个值的事件中。如果一个事件无法分割,那么最大大小可以超过。这个变量的值必须是(或者会被向下取整到)256的倍数。默认值是8192字节

4. 小结

MySQL 8.0和MySQL 5.7之间的二进制日志(binlog)主要的变化如下:

默认的binlog格式:MySQL 8.0默认使用ROW格式,ROW格式记录每行数据的变化,而STATEMENT格式记录SQL语句的执行

新的binlog缓冲机制:MySQL 8.0引入了一种新的binlog缓冲机制,可以提高性能并减少磁盘I/O。在MySQL 5.7中,使用了基于磁盘的binlog缓冲

binlog加密:MySQL 8.0引入了二进制日志的加密功能,可以在传输过程中对binlog进行加密。MySQL 5.7没有原生支持二进制日志的加密

在线binlog重置:MySQL 8.0支持在线重置二进制日志,而MySQL 5.7需要停止和启动MySQL服务进行重置

新的事务描述事件:MySQL 8.0引入了新的ANONYMOUS_GTID_EVENT事务描述事件,用于记录匿名GTID的信息。MySQL 5.7中没有这个事件

GTID的一些改进:MySQL 8.0对GTID的处理进行了一些改进,提高了复制的可靠性和易用性其他性能和安全性的改进:

MySQL 8.0包含许多其他性能和安全性的改进,包括更好的并行复制支持、更好的崩溃安全性等

责任编辑:姜华 来源: 数据库干货铺
相关推荐

2020-12-31 05:35:53

MySQL 8.0MySQL 5.7JSON

2019-09-24 13:53:19

MySQLMySQL 8.0数据库

2024-04-18 09:00:00

MySQL数据库

2020-07-31 13:55:57

MySQL数据库DBA

2020-11-03 14:30:02

MySQL5.7MyS8.0数据库

2019-07-19 15:53:45

MySQL 5.7MySQL 8.0MySQL

2023-11-02 08:44:58

2024-08-08 07:38:42

2023-10-25 07:59:40

2010-05-18 11:28:57

MySQL binlo

2023-06-27 07:29:30

dba+开源工具Binlog

2022-09-23 13:24:21

MySQL数据库

2010-05-18 12:24:16

MySQL binlo

2022-06-20 12:00:43

MySQL数据库升级

2021-06-03 19:13:06

MySQLJson数据

2024-03-25 07:30:03

MySQL数据库SQL日志

2023-06-08 07:37:35

MySQLbinlog机制

2021-07-12 08:06:32

Java

2010-06-04 14:10:09

MySQL_fetch

2022-09-20 10:44:06

MySQL 8.0数据库DDL
点赞
收藏

51CTO技术栈公众号