主要观点:MySQL 的复制协议广泛用于实现高可用性、负载均衡和数据冗余,自 2000 年引入以来不断发展并流行。文中深入探讨了 MySQL 复制协议的细节,包括 GTID 定位、复制格式(行式、语句式、混合式)、启动复制流、二进制日志事件(初始事件、DDL 事件、DML 事件)及类型序列化等方面。
关键信息:
- MySQL 复制通过源服务器将事件记录到二进制日志,副本连接后接收并应用这些事件来保持同步。
- GTID 基于全局事务标识符,使副本更易重新连接并继续复制流,主从服务器需启用
GTID_MODE
。 - 复制格式有行式、语句式和混合式,行式在多数情况下能正确复制数据,但在某些情况下效率不如语句式。
- 启动复制流时,副本先注册自己,查询配置,然后发送
COM_BINLOG_DUMP_GTID
命令,源服务器定期发送心跳事件保持连接。 - 二进制日志事件包括初始事件(Rotate、Format Description、Previous GTIDs 事件)、DDL 事件(以 GTID 事件开始,后跟 Query 事件)、DML 事件(以 GTID 事件开始,后跟 Table Map 事件、Rows 事件和 XID 事件)。
- 类型序列化方面,MySQL 二进制日志一般使用内部序列化格式,各数据类型有不同的序列化方式,MySQL 的 JSON 序列化格式有空间效率优化但可能影响序列化效率。
重要细节: - 二进制日志文件开头有魔法字节
0xfe 0x62 0x69 0x6e
,初始 Rotate 事件不写入日志文件但用于帮助副本定位。 - DDL 语句以 Query 事件发送,包含 DDL 语句和执行相关的元数据。
- DML 事件中的 Table Map 事件包含表结构的大量数据,Rows 事件描述行的变化,Update Rows 事件有额外字段。
- MySQL 的 JSON 序列化格式在空间效率和序列化效率之间有权衡,小格式用两字节表示元素计数和偏移位置,大格式用四字节。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。