MySQL底层概述—2.InnoDB磁盘结构三
ccwgpt 2024-12-15 11:16 65 浏览 0 评论
大纲
7.二进制日志(binlog)
8.新版本结构演变
7.二进制日志(binlog)
(1)binlog的基本概念
(2)binlog日志的三种模式
(3)如何选择binlog的模式
(4)binlog写入机制
(5)redo log和binlog的区别
(6)binlog命令操作
(1)binlog的基本概念
binlog是一个二进制格式的文件,用于记录用户对数据库更新操作。例如更改库和表的SQL语句都会记录到binlog里,但binlog不会记录select和show这类操作。
一.binlog的特点
特点一:binlog在MySQL的Server层实现(存储引擎共用)
特点二:binlog为逻辑日志,记录的是一条SQL语句的原始逻辑
特点三:binlog不限制大小,追加写入,不会覆盖以前的日志
特点四:默认情况下,binlog日志是二进制格式的。不能使用查看文本工具的命令查看,而要使用mysqlbinlog解析查看
二.开启binlog的场景
场景一:主从复制
在主库中开启binlog功能,这样主库就可以把binlog传递给从库,从库拿到binlog后实现数据恢复达到主从数据一致性。
场景二:数据恢复
通过mysqlbinlog工具来恢复数据。
(2)binlog日志的三种模式
一.ROW模式
日志中会记录每一行数据被修改的情况,然后在Slave端对相同的数据进行修改。
优点是可以清楚记录每一个行数据的修改细节,能完全实现主从数据同步和数据的恢复。缺点是批量操作会产生大量日志,尤其是alter table会让日志暴涨。
二.STATMENT模式
日志中会记录每一条修改数据的SQL语句。注意批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句。Slave的SQL进程会解析成和原来Master执行过的相同的SQL再次执行,简称SQL语句复制。
优点是日志量小减少磁盘IO,提升存储和恢复速度。缺点是在某些情况下会导致主从数据不一致,如last_insert_id()、now()。
三.MIXED模式
以上两种模式的混合使用,一般会使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog。MySQL会根据执行的SQL语句选择写入模式。
(3)如何选择binlog的模式
一.如果使用MySQL的特殊功能相对少(存储过程、触发器、函数),可以选择默认的语句模式,Statement模式。
二.如果使用MySQL的特殊功能较多的,可以选择Mixed模式。
三.如果使用MySQL的特殊功能较多,又希望数据最大化一致,此时最好Row模式,但是要注意,该模式的binlog日志量增长非常快。
(4)binlog写入机制
一.binlog文件结构
binlog文件中记录的是对数据库的各种修改操作。binlog中用来表示修改操作的日志记录的数据结构是Log Event,不同的修改操作对应的不同的Log Event。
比较常用的Log Event有:Query Event、Row Event、Xid Event等,binlog文件的内容就是各种Log Event的集合。
二.binlog落盘策略
binlog写入顺序:Binlog Cache -> (write) OS Cache -> (fsync) Disk。其中,write表示写入操作系统缓存,fsync表示持久化到磁盘。
binlog刷盘由参数sync_binlog进行配置:
sync_binlog = 0,表示每次提交事务都只write,不fsync。
sync_binlog = 1,表示每次提交事务都会执行fsync。
sync_binlog = N,表示每次提交事务都write,累积N个事务后才fsync。
注意:不建议将sync_binlog参数设成0。比较常见的是将sync_binlog设置为100 ~ 1000中的某个数值。如果设置成0,主动重启丢失的数据不可控制。如果设置成1,效率低下。如果设置成N,则宕机最多造成N个事务的binlog丢失,可控且性能较高。
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (0.00 sec)
三.binlog写入流程
步骤1:根据记录模式和操作触发Event事件生成Log Event。
步骤2:事务执行过程中,先把日志(Log Event)写到Binlog Cache;事务提交时,再把Binlog Cache写到binlog文件中。
步骤3:系统会为每个线程分配一块Binlog Cache内存,每个线程都有自己的Binlog Cache,共用一份binlog文件。
步骤4:事务提交时,会把Binlog Cache里完整的事务写入binlog文件中,然后清空Binlog Cache。
(5)redo log和binlog的区别
区别一:redo log是InnoDB引擎特有的,binlog是MySQL的Server层实现的,所有引擎都可以使用。
区别二:redo log是物理日志,记录的是"在XXX数据页上做了XXX修改"。binlog是逻辑日志,记录的是原始逻辑,其记录是对应的SQL语句。
区别三:redo log是循环写,空间一定会用完,需要WritePos和CheckPoint搭配;binlog是追加写,写到一定大小会切换到下一个,不会覆盖以前的日志。
区别四:redo log作为服务器异常宕机后事务数据自动恢复使用,binlog可以作为主从复制和数据恢复使用,binlog没有CrashSafe(崩溃恢复)能力。
什么是CrashSafe?CrashSafe指MySQL服务器宕机重启后,能够保证:已提交的事务的数据仍然存在 + 没提交的事务的数据自动回滚。
(6)binlog命令操作
一.启用binlog
$ vim /etc/my.cnf
增加下面几个参数
binlog-format=ROW
log-bin=mysqlbinlog
server-id=1
binlog-format:文件模式。
log-bin:MySQL会根据这个配置自动设置log_bin为on状态,自动设置log_bin_index文件为指定的文件名后跟.index。
server-id=1:随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了。
二.重启mysql
$ systemctl restart mysqld
三.启动成功后登陆查看配置是否起作用
mysql> show variables like '%log_bin%';
+---------------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysqlbinlog |
| log_bin_index | /var/lib/mysql/mysqlbinlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+----------------------------------+
log_bin:是否开启binlog日志;
log_bin_basename:基础文件名;
log_bin_index:binlog文件的索引文件,管理所有binlog文件;
sql_log_bin:表示当前会话是否记录binlog,默认值ON;
当sql_log_bin关闭后,主库上的改动不记录binlog,不会复制到从库;
四.查看binlog文件列表
mysql> show binary logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mysqlbinlog.000001 | 177 |
| mysqlbinlog.000002 | 177 |
| mysqlbinlog.000003 | 154 |
+--------------------+-----------+
五.查看正在写入的binlog文件
mysql> show master status;
六.查看binlog文件信息
使用show binlog events命令查询到的每一行数据就是一个binlog管理事件。
mysql> show binlog events;
+--------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+--------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysqlbinlog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.30-log, Binlog ver: 4 |
| mysqlbinlog.000001 | 123 | Previous_gtids | 1 | 154 | |
| mysqlbinlog.000001 | 154 | Stop | 1 | 177 | |
+--------------------+-----+----------------+-----------+-------------+-----------
Log_name:当前事件所在的binlog文件名称;
Pos:当前事件的开始位置,每个事件都占用固定的字节大小,结束位置End_log_position减去Pos,就是这个事件占用的字节数。第一个事件位置并不是从0开始,而是从4开始。MySQL通过文件中的前4个字节,来判断这是不是一个binlog文件,很多格式文件如pdf、doc等都会用前几个特定字符判断文件是否合法;
Event_type:表示事件的类型;
Server_id:表示产生这个事件的MySQL的server_id,my.cnf中配置;
End_log_position:下一个事件的开始位置;
Info:当前事件的描述信息;
七.查看指定binlog文件内容
mysql> show binlog events in 'mysqlbinlog.000001'\G;
*************************** 1. row ***************************
Log_name: mysqlbinlog.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 123
Info: Server ver: 5.7.30-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysqlbinlog.000001
Pos: 123
Event_type: Previous_gtids
Server_id: 1
End_log_pos: 154
Info:
*************************** 3. row ***************************
Log_name: mysqlbinlog.000001
Pos: 154
Event_type: Stop
Server_id: 1
End_log_pos: 177
Info:
3 rows in set (0.00 sec)
八.使用mysqlbinlog命令查看binlog文件
[root@localhost mysql]# mysqlbinlog mysqlbinlog.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220125 6:40:35 server id 1 end_log_pos 123 CRC32 0x1e570724 Start: binlog v 4, server v 5.7.30-log created 220125 6:40:35 at startup
ROLLBACK/*!*/;
BINLOG '
4wvwYQ8BAAAAdwAAAHsAAAAAAAQANS43LjMwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADjC/BhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ASQHVx4=
'/*!*/;
# at 123
#220125 6:40:35 server id 1 end_log_pos 154 CRC32 0x43fa19f1 Previous-GTIDs
# [empty]
# at 154
#220125 6:41:17 server id 1 end_log_pos 177 CRC32 0x205de899 Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
输出指定position位置的binlog日志:
$ mysqlbinlog --start-position='154' --stop-position='177'
输出指定position位置的binlog日志到指定文件中:
$ mysqlbinlog --start-position='154' --stop-position='177' mysqlbinlog.000001 > test.log
输出指定position位置的binlog日志到压缩文件中:
$ mysqlbinlog --start-position="指定开始位置" --stop-position="指定结束位置" binlog文件|gzip > 压缩文件名
输出指定开始时间的binlog日志:
$ mysqlbinlog --start-datetime="yyyy-MM-dd HH:mm:ss" binlog文件
8.新版本结构演变
(1)MySQL 5.7版本
一.将undo日志表空间从共享表空间ibdata文件中分离出来,但需要在安装MySQL时就要指定文件大小和数量才能分离出来。
二.增加了temporary临时表空间,存储临时表或临时查询结果集的数据。
三.Buffer Pool大小可以动态修改,无需重启数据库实例。
(2)MySQL 8.x版本
一.将InnoDB表的数据字典和undo从共享表空间ibdata中彻底分离出来,以前需要ibdata中数据字典与独立表空间ibd文件中数据字典一致才行,8.x版本就不需要了。
二.temporary临时表空间也可以配置多个物理文件,而且均为InnoDB存储引擎并能创建索引,这样加快了处理的速度。
三.用户可以像Oracle数据库那样设置一些表空间,每个表空间对应多个物理文件,每个表空间可以给多个表使用,但一个表只能存储在一个表空间中。
四.将Double Write Buffer从共享表空间ibdata中也分离出来了。
相关推荐
- 一个基于.Net Core遵循Clean Architecture原则开源架构
-
今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...
- AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%
-
写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...
- OneCode低代码平台的事件驱动设计:架构解析与实践
-
引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...
- 国内大厂AI插件评测:根据UI图生成Vue前端代码
-
在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...
- AI+低代码技术揭秘(二):核心架构
-
本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...
- GitDiagram用AI把代码库变成可视化架构图
-
这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...
- 30天自制操作系统:第六天:代码架构整理与中断处理
-
1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...
- AI写代码越帮越忙?2025年研究揭露惊人真相
-
近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...
- 一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具
-
一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...
- 5分钟掌握 c# 网络通讯架构及代码示例
-
以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...
- 从复杂到优雅:用建造者和责任链重塑代码架构
-
引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...
- 低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈
-
专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...
- 框架设计并不是简单粗暴地写代码,而是要先弄清逻辑
-
3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...
- 大佬用 Avalonia 框架开发的 C# 代码 IDE
-
AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...
- 轻量级框架Lagent 仅需20行代码即可构建自己的智能代理
-
站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)