<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Database on elonnzhang</title><link>https://jiabin.dev/categories/database/</link><description>Recent content in Database on elonnzhang</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 09 Aug 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://jiabin.dev/categories/database/index.xml" rel="self" type="application/rss+xml"/><item><title>MySQL InnoDB MVCC 原理</title><link>https://jiabin.dev/blog/mysql-innodb-mvcc/</link><pubDate>Sat, 09 Aug 2025 00:00:00 +0800</pubDate><guid>https://jiabin.dev/blog/mysql-innodb-mvcc/</guid><description>&lt;p&gt;&lt;img src="https://jiabin.dev/assets/img/ab91ab8a-cd5a-446f-bcc6-f73333545665.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://jiabin.dev/assets/img/cc034730-ff89-46da-b7e7-8f9e95d592ea.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;MVCC（多版本并发控制）&lt;/strong&gt; 是一种数据库并发控制机制，用于管理多个事务并发操作时，确保事务的 &lt;strong&gt;隔离性&lt;/strong&gt; 和 &lt;strong&gt;一致性&lt;/strong&gt;。在 &lt;strong&gt;MySQL InnoDB&lt;/strong&gt; 存储引擎中，MVCC 是实现 &lt;strong&gt;事务隔离&lt;/strong&gt; 和 &lt;strong&gt;高并发&lt;/strong&gt; 数据访问的关键技术之一。MVCC 允许多个事务在 &lt;strong&gt;不冲突&lt;/strong&gt; 的情况下并发执行，同时保证每个事务的 &lt;strong&gt;数据一致性&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="1-mvcc-的工作原理"&gt;&lt;strong&gt;1. MVCC 的工作原理&lt;/strong&gt;&lt;/h3&gt;&#10;&lt;p&gt;MVCC 通过 &lt;strong&gt;维护数据的多个版本&lt;/strong&gt; 来实现高并发控制，而不是像传统的锁机制那样阻塞事务，MVCC 通过给每个事务分配 &lt;strong&gt;快照&lt;/strong&gt; 来实现并发读写。&lt;/p&gt;&#10;&lt;h4 id="11-事务的隔离性"&gt;&lt;strong&gt;1.1. 事务的隔离性&lt;/strong&gt;&lt;/h4&gt;&#10;&lt;p&gt;在 MVCC 中，每个事务都有一个 &lt;strong&gt;独立的视图（Read View）&lt;/strong&gt;，它表示当前事务看到的数据版本。这确保了不同的事务可以并发执行，但又不互相影响，避免了 &lt;strong&gt;脏读&lt;/strong&gt;、&lt;strong&gt;不可重复读&lt;/strong&gt; 和 &lt;strong&gt;幻读&lt;/strong&gt; 问题。&lt;/p&gt;&#10;&lt;h4 id="12-如何维护多个版本的记录"&gt;&lt;strong&gt;1.2. 如何维护多个版本的记录&lt;/strong&gt;&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;InnoDB&lt;/strong&gt; 会为每个数据行维护多个版本，这些版本用于支持多个事务并发执行。每个修改操作会创建数据的一个新的版本。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;每个版本的数据行都会包含 &lt;strong&gt;事务 ID&lt;/strong&gt; 和 &lt;strong&gt;回滚标识（Undo Log）&lt;/strong&gt;，这些信息有助于数据库确定该数据是否对当前事务可见。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;例如，在更新操作时，&lt;strong&gt;更新前的版本&lt;/strong&gt; 保留在 &lt;strong&gt;Undo Log&lt;/strong&gt; 中，而新的版本会出现在 &lt;strong&gt;数据表中&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="2-read-view-在-mvcc-中如何工作"&gt;&lt;strong&gt;2. Read View 在 MVCC 中如何工作&lt;/strong&gt;&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Read View&lt;/strong&gt; 是 MySQL 在 &lt;strong&gt;MVCC&lt;/strong&gt; 中实现隔离性的关键概念。当一个事务需要读取数据时，数据库会为该事务创建一个 &lt;strong&gt;Read View&lt;/strong&gt;，并根据该视图决定事务能够看到哪些数据。&lt;/p&gt;</description></item><item><title>gh-ost 源码阅读</title><link>https://jiabin.dev/blog/gh-ost/</link><pubDate>Fri, 08 Aug 2025 00:00:00 +0800</pubDate><guid>https://jiabin.dev/blog/gh-ost/</guid><description>&lt;p&gt;地址：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/github/gh-ost/tree/master/go"&gt;https://github.com/github/gh-ost/tree/master/go&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://deepwiki.com/github/gh-ost"&gt;https://deepwiki.com/github/gh-ost&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;目录结构&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;├── base&#10;│ ├── context_test.go&#10;│ ├── context.go&#10;│ ├── default_logger.go&#10;│ ├── load_map_test.go&#10;│ ├── load_map.go&#10;│ ├── utils_test.go&#10;│ └── utils.go&#10;├── binlog&#10;│ ├── binlog_dml_event.go&#10;│ ├── binlog_entry.go&#10;│ ├── binlog_reader.go&#10;│ ├── gomysql_reader.go&#10;│ └── testdata&#10;│ ├── mysql-bin.000066&#10;│ ├── mysql-bin.000070&#10;│ ├── rbr-sample-0.txt&#10;│ ├── rbr-sample-1.txt&#10;│ └── rbr-sample-2.txt&#10;├── cmd&#10;│ └── gh-ost&#10;│ └── main.go&#10;├── logic&#10;│ ├── applier_test.go&#10;│ ├── applier.go&#10;│ ├── hooks_test.go&#10;│ ├── hooks.go&#10;│ ├── inspect_test.go&#10;│ ├── inspect.go&#10;│ ├── migrator_test.go&#10;│ ├── migrator.go&#10;│ ├── server_test.go&#10;│ ├── server.go&#10;│ ├── streamer_test.go&#10;│ ├── streamer.go&#10;│ ├── test_utils.go&#10;│ └── throttler.go&#10;├── mysql&#10;│ ├── binlog_test.go&#10;│ ├── binlog.go&#10;│ ├── connection_test.go&#10;│ ├── connection.go&#10;│ ├── instance_key_map.go&#10;│ ├── instance_key_test.go&#10;│ ├── instance_key.go&#10;│ ├── replica_terminology_map.go&#10;│ └── utils.go&#10;└── sql&#10; ├── builder_test.go&#10; ├── builder.go&#10; ├── encoding.go&#10; ├── parser_test.go&#10; ├── parser.go&#10; ├── types_test.go&#10; └── types.go&#10;&#10;9 directories, 47 files&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;入口 &lt;code&gt;cmd/gh-ost/main.go&lt;/code&gt;&lt;/p&gt;</description></item><item><title>分布式数据库与云原生数据库的区别</title><link>https://jiabin.dev/blog/distribute-vs-cloud-native/</link><pubDate>Sat, 11 Jan 2025 00:00:00 +0800</pubDate><guid>https://jiabin.dev/blog/distribute-vs-cloud-native/</guid><description>&lt;p&gt;分布式数据库和云原生数据库有一定的关联，但二者的关注点和设计理念不同。可以从 &lt;strong&gt;概念、关系、区别&lt;/strong&gt; 三个角度来看：&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1-概念"&gt;&lt;strong&gt;1. 概念&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;h3 id="11-分布式数据库"&gt;&lt;strong&gt;1.1 分布式数据库&lt;/strong&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：数据库的数据和计算分布在多台服务器上，通过网络协同工作，对用户透明地提供统一访问接口。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;核心目标&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;数据分片和多副本存储（高可用）。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;支持水平扩展（scale-out）。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;提供分布式事务和全局一致性。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;典型产品&lt;/strong&gt;：TiDB、CockroachDB、OceanBase、MongoDB、Cassandra。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="12-云原生数据库"&gt;&lt;strong&gt;1.2 云原生数据库&lt;/strong&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：基于云原生架构理念（容器化、微服务、弹性伸缩、可观测性）设计的数据库。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;原生支持云平台：容器化、Kubernetes 管理。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;计算与存储分离，支持弹性扩缩容。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;按需计费、自动运维、快速恢复。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;深度利用云基础设施（分布式存储、Serverless）。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;典型产品&lt;/strong&gt;：Aurora、PolarDB、TiDB Cloud、YugabyteDB、Spanner。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="2-关系"&gt;&lt;strong&gt;2. 关系&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;云原生数据库通常是分布式数据库的延伸&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;云原生数据库的底层架构往往是分布式数据库（支持水平扩展、多副本）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;不是所有分布式数据库都是云原生数据库&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;传统分布式数据库如果未支持容器化、自动弹性、计算存储分离，就不算云原生。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;简单理解：&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;分布式数据库 = 架构形态&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;云原生数据库 = 架构形态 + 云原生理念 + 云平台友好&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="3-区别"&gt;&lt;strong&gt;3. 区别&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;分布式数据库&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;云原生数据库&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;核心关注点&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;数据分布、水平扩展、一致性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;云环境下弹性伸缩、自动化运维、资源高效利用&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;计算存储架构&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;多数是计算存储一体化或弱分离&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;倾向于计算存储彻底分离&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;运行环境&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自建机房或云上虚拟机&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;云原生基础设施（K8s、分布式存储、Serverless）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;运维模式&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;运维成本高，需要人工或脚本管理&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自动运维、监控、故障自愈&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;弹性能力&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;水平扩展需要手动加节点、数据迁移&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;支持分钟级或秒级弹性伸缩&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="4-总结"&gt;&lt;strong&gt;4. 总结&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;分布式数据库是技术架构，云原生数据库是架构+理念的结合。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;云原生数据库几乎都具备分布式特性&lt;/strong&gt;，但在自动化、弹性、资源管理方面更先进。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;如果说 &lt;strong&gt;分布式数据库解决“规模化、可用性”&lt;/strong&gt;，那么 &lt;strong&gt;云原生数据库解决“云环境下弹性、自动化、降本增效”&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>pt-online-schema-change 执行流程</title><link>https://jiabin.dev/blog/pt-osc/</link><pubDate>Thu, 22 Aug 2024 00:00:00 +0800</pubDate><guid>https://jiabin.dev/blog/pt-osc/</guid><description>&lt;p&gt;地址 &lt;a href="https://github.com/percona/percona-toolkit/tree/3.x/bin"&gt;https://github.com/percona/percona-toolkit/tree/3.x/bin&lt;/a&gt;&#10;&lt;a href="https://docs.percona.com/percona-toolkit/pt-online-schema-change.html"&gt;使用文档&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;详细执行流程如下：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;相关环境参数检查&lt;/li&gt;&#10;&lt;li&gt;检查该表格是否存在&lt;/li&gt;&#10;&lt;li&gt;show create table tbosc&lt;/li&gt;&#10;&lt;li&gt;create table _tbosc_new&lt;/li&gt;&#10;&lt;li&gt;alter table _tbosc_new &lt;/li&gt;&#10;&lt;li&gt;创建删除触发器 pt_osc_dbddl_tbosc_del &lt;strong&gt;(如果数据修改的时候，还没有拷贝过来，修改后再拷贝则是覆盖，正确；如果是已经拷贝过来，再修改，也是正确，这里同时会检查是否具有主键或者唯一索引，如果都没有，这一步会报错，提示The new table &lt;code&gt;dbosc&lt;/code&gt;.&lt;code&gt;_tbosc_new&lt;/code&gt; does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.）&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;创建更新触发器 pt_osc_dbddl_tbosc_upd&lt;/li&gt;&#10;&lt;li&gt;创建插入触发器 pt_osc_dbddl_tbosc_ins&lt;/li&gt;&#10;&lt;li&gt;按块拷贝数据到新表，拷贝过程对数据行持有S锁&lt;/li&gt;&#10;&lt;li&gt;analyze 新表&lt;/li&gt;&#10;&lt;li&gt;rename 表名，RENAME TABLE &lt;code&gt;dbddl&lt;/code&gt;.&lt;code&gt;tbosc&lt;/code&gt; TO &lt;code&gt;dbddl&lt;/code&gt;.&lt;code&gt;_tbosc_old&lt;/code&gt;, &lt;code&gt;dbddl&lt;/code&gt;.&lt;code&gt;_tbosc_new&lt;/code&gt; TO &lt;code&gt;dbddl&lt;/code&gt;.&lt;code&gt;tbosc&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;删除旧表&lt;/li&gt;&#10;&lt;li&gt;删除新表上的删除、更新、插入 触发器&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;如果有表存在会新建表&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;failed to find a unique new table name after 10 attemps. the following tables exist which may be left over from previous failed runs of the tool:&#10; `test_db`.`_big_table_new`&#10; `test_db`.`__big_table_new`&#10; `test_db`.`___big_table_new`&#10; `test_db`.`____big_table_new`&#10; `test_db`.`_____big_table_new`&#10; `test_db`.`______big_table_new`&#10; `test_db`.`_______big_table_new`&#10; `test_db`.`________big_table_new`&#10; `test_db`.`_________big_table_new`&#10; `test_db`.`__________big_table_new`&#10;examine these tables and drop some or all of them if they are no longer need, then re-run the tool.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://deepwiki.com/percona/percona-toolkit/2.1-pt-online-schema-change"&gt;https://deepwiki.com/percona/percona-toolkit/2.1-pt-online-schema-change&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>