wshawk's blog

wshawk's blog

MySQL之主从复制
发表于2023-03-12|数据库
MySQL之主从复制小白都能懂的Mysql主从复制原理(原理+实操) (qq.com) MySQL 主从复制原理不再难 - rickiyang - 博客园 (cnblogs.com) 概念MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。 MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。 作用主从复制是MySQL高可用集群的基石,可以实现实时灾备、读写分离、高可用。 原理MySQL的主从复制是基于binlog来实现的,因为binlog记录了数据库中所有数据的改动。 根据binlog的记录的数据格式不同,复制的数据也有区别,目前主要有以下三种: 基于行的复制:binlog为ROW格式,把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持 基于语句的复制:binlog为STATEMENT格式,在主服务器执行SQL语句,在从服务器执行同样语句。 混合类型的复制:binlog为MIX...
MySQL之Undo Log
发表于2023-03-02|数据库
MySQL之Undo Log简介Undo Log是InnoDB存储引擎生成的逻辑日志,实现了事务ACID特性中的原子性,主要作用于**事务回滚和MVCC**。 详细分析MySQL事务日志(redo log和undo log) - 骏马金龙 - 博客园 (cnblogs.com)MySQL · 引擎特性 · 庖丁解InnoDB之UNDO LOG (taobao.org)MySQL · 引擎特性 · InnoDB undo log 漫游 (taobao.org) 基本概念在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。 undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。 当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。有时候应用到行版本控制的时候,也是通过undo log来实现的:当读取...
MySQL之InnoDB Buffer Pool
发表于2022-11-14|数据库
MySQL之InnoDB Buffer Pool简介在MySQL 服务器启动的时候向操作系统申请了一片连续的内存,这块内存就叫做 Buffer Pool 。 默认情况下 Buffer Pool 只有 128M 大小。 可以在启动服务器的时候配置 innodb_buffer_pool_size 参数的值,来设置Buffer Pool的大小,单位是字节。需要注意的是, Buffer Pool 也不能太小,最小值为 5M (当小于该值时会自动设置成 5M )。 本文内容均来自《MySQL是怎样运行的:从根儿上理解MySQL》 内部组成Buffer Pool 中默认的缓存页大小和在磁盘上默认的页大小是一样的,都是 16KB 。 为了更好的管理这些在 Buffer Pool 中的缓存页,衍生了控制信息,主要包括该页所属的表空间编号、页号、缓存页在 Buffer Pool 中的地址、链表节点信息、一些锁信息以及 LSN 信息。 每个页对应的控制信息占用的一块内存可以称为一个控制块,控制块和缓存页是一 一对应的。 每个缓存页的控制信息的长度是固定大小的,在MySQL5.7.21这个版本中,每个...
MySQL之MVCC
发表于2022-11-14|数据库
MySQL之MVCC背景 在前面的MySQL锁文章中有提到过,MyISAM表的读操作与写操作,以及写操作之间是串行的。 并且默认情况下写操作命令的执行优先于读操作执行,即使读请求早于写请求到达,写锁也会插队到读请求前面,因为MySQL认为写请求一般比读请求要重要。 在InnoDB中,就是通过多版本并发控制(MVCC)来解决读请求和写请求的并发问题,提高数据库的并发能力。并且在InnoDB中是默认读不加锁,读写不冲突的。 两个概念快照读 不加锁的select操作就是快照读,即不加锁的非阻塞读。当我们执行select xxx from table_name where xxx=yyy语句时,就是快照读。 不是所有的隔离级别下都支持快照读。 读未提交: 不支持,未提交读总是读取最新的数据行,而不是符合当前事务版本的数据行 读已提交:支持,每次select都生成一个快照读 可重复读:支持,开启事务后执行第一个select语句才生成快照读,而不是一开启事务就生成快照读, 并且整个事务只生成一个快照读 串行化:不支持,在此隔离级别下,读请求都是当前读。 当前读 读取的是最新版本,...
MySQL之InnoDB数据页
发表于2022-11-14|数据库
MySQL之InnoDB数据页页是InnoDB管理存储空间的基本单位,一个页的大小一般是 16KB 。 InnoDB 为了不同的目的而设计了许多种不同类型的页 ,下文主要讲述存储数据行的页,官方称之为索引页。 页 一般由以下七个部分组成。 File Header (38字节) : 文件头,存放页的一些通用信息 Page Header (56字节):页面头,存放数据页专有的一些信息 Infimum + Superemum (26字节):两个虚拟的行记录,分别指向当前页的最小记录和最大记录 User Records (大小不确定,数据行信息): 实际存储的行记录内容 Free Space (大小不确定):空闲空间,页中尚未使用的空间 Page Directory (大小不确定):页面目录,页中某些记录的相对位置 File Tailer (8字节):文件尾部,校验页是否完整 Infimum、Superemum Infimum记录(也就是最小记录)的下一条记录就是 本页中主键值最小的用户记录, 本页中主键值最大的用户记录的下一条记录就是 Supremum记录(也就是最大记录) Pag...
MySQL之日志写入顺序
发表于2022-11-13|数据库
MySQL之日志写入顺序当MySQL执行一条UPDATE语句时,InnoDB存储引擎和Server层会协同工作,按照严格的顺序写入undo log、redo log和binlog,并通过两阶段提交保证数据一致性和崩溃恢复能力。以下是详细的执行流程和日志写入顺序: 1. 更新语句执行前的准备 客户端发送UPDATE语句,MySQL Server通过连接器、分析器、优化器后,调用InnoDB的接口执行更新。 如果更新的数据页不在内存的缓冲池中,InnoDB会先将该页从磁盘读入缓冲池。 2. 记录 undo log(回滚日志) 顺序:第1步写入在修改数据之前,InnoDB会先将修改前的旧值写入**undo log**,记录到undo log buffer中。 例如:将“修改前”的整行数据或主键信息保存下来,用于事务回滚或MVCC。 undo log本身也是物理修改(因为undo页也需要持久化),因此对undo页的修改也会在稍后被redo log保护。 3. 修改缓冲池中的数据页 顺序:第2步(内存操作)在内存中更新缓冲池里的数据页,将新值写入,此时该页变为“脏页”(内存...
MySQL之InnoDB行记录
发表于2022-11-10|数据库
MySQL之InnoDB行记录MySQL 不同的存储引擎中真实数据存放的格式一般是不同的,下文简单介绍InnoDB中的行记录格式。 InnoDB存储引擎目前共支持四种行格式,如下表: 行格式 紧凑存储 增强的可变长度列存储 大索引键前缀支持 支持压缩 REDUNDANT 否 否 否 否 COMPACT 是 否 否 否 DYNAMIC 是 是 是 否 COMPRESSED 是 是 是 是 MySQL 5.0之后的默认行格式为Compact ,MySQL5.7之后的默认行格式为Dynamic。 Compact示意图如下。 记录的额外信息变长字段长度列表 varchar(M) 、 varbinary(M) 、text、blob等不确定数据具体长度的数据类型中,存储多少字节的数据是不固定的,我们在存储真实数据的时候需要把这些数据占用的字节数也存起来,读取数据的时候,才能准确读完整这些不确定长度的数据。所以变长字段实际需要存储一下信息 实际的字段值 实际字段长度(字节长度) 如果该可变字段允许存储的最大字节数超过255字节并且真实存储的字节数超过127字节...
MySQL之Redo Log
发表于2022-11-02|数据库
MySQL之Redo Log简介重做日志,也就是Redo Log是MySQL中InnoDB存储引擎特有的事务日志,它是一种物理日志,存储着数据被修改的具体的数据值。 Redo Log主要有以下作用 实现事务的持久性,让 MySQL 有 crash-safe 的能力,能够保证 MySQL 在任何时间段突然崩溃,重启后之前已提交的记录都不会丢失; 将写操作从「随机写」变成了「顺序写」,提升MySQL 写入磁盘的性能。 2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用? - 知乎 (zhihu.com) 背景MySQL中更新数据的流程大概如下: 将数据从磁盘中读取到内存中(Buffer Pool) 在内存中修改数据,产生脏页 将脏页刷回磁盘 说明: 脏页:修改后的数据,和磁盘上的数据会不一致,称这种有差异的数据为脏页 页:此处留坑,后面补充。 通过上面的更新流程,大概会产生下列问题: 如果每次有脏页产生就刷回磁盘,就会产生海量IO,严重影响性能 如果在刷回磁盘的过程中出现故障,就会造成数据的丢失 MySQ...
MySQL索引
发表于2022-11-01|数据库
MySQL 索引概念聚簇索引 将数据存储和索引放到了一块,找到了索引也就找到了数据。 ps: MySQL的InnoDB引擎中,索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值。 总结: 定义了主键,则该主键就是聚簇索引 未定义主键,第一个not NULL unique列是聚集索引 所有字段均可为NULL,InnoDB会创建一个隐藏的row-id作为聚集索引 非聚簇索引 以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。 在InnoDB引擎中,一般一个表只能有一个聚簇索引,但可以有多个非聚簇索引,每一个非聚簇索引的叶子节点都存储了主键的值。 唯一索引 索引列的值必须唯一,但允许有空值,且空值只能有一个 全文索引 MySQL5.7版本之前只在MyISAM引擎上支持,全文索引可以在Char、Varchar、Text类型的列上创建。 联合索引 多列联合组成索引。 最左前缀优先原则 最左前缀原则(假设索引为a, b, c) 则有效索引为: a a,b a,b,c 覆盖索引 查询字段...
MySQL基础架构
发表于2022-10-31|数据库
MySQL基础架构 MySQL大致可以分为客户端层、Server层和存储引擎两层。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。 不同的存储引擎,是共用同一个Server层的。 组件关系图如下: 客户端层 用户访问MySQL的接口。在客户端,用户可以输入SQL语句,通过SQL语句,实现对数据库的访问、操作和控制。 MySQL Server 层连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 注意点: 连接器在用户登录时读取用户权限并用于后续判断,所以管理员修改密码对已登录用户无效(除非该用户重新登录) 客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数...
123…5
avatar
wshawk
文章
46
标签
25
分类
8
Follow Me
公告
This is my Blog
最新文章
Redis之redisDb2026-03-04
Redis之主从复制2026-03-04
SpringBoot 启动时实现缓存预热2026-02-28
AI自动化协作体系的演进2025-12-02
日志系统搭建2025-11-14
分类
  • AI1
  • Linux2
  • hexo1
  • 前端2
  • 后端21
    • Java2
  • 数据库16
  • 网络1
标签
Linux 后端 Vue redisDb Spring JDK Java 概念 SpringBoot hexo 日志 时间戳 动态代理 缓存 Tomcat 参数校验 主从同步 踩坑 Redis 随笔 MySQL 代理 AI JavaScript HTTP
归档
  • 三月 2026 2
  • 二月 2026 1
  • 十二月 2025 1
  • 十一月 2025 1
  • 九月 2025 1
  • 六月 2025 1
  • 十月 2023 1
  • 六月 2023 1
网站信息
文章数目 :
46
本站总字数 :
75.7k
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2020 - 2026 By wshawk