Spirit精神小伙 - 在MySQL中修改表结构中的使用 

使用 pt-online-schema-change(基于触发器) 或 gh-ost(基于binlog)修改表结构?当然,MySQL DBA 都在使用。但现在有一种新的在线模式更改工具 - Spirit(翻译后:精神)


那么为了方便记忆,我们称之为Spirit精神小伙。

https://github.com/cashapp/spirit


Spirit是一款基于gh-ost原理的在线DDL工具,主要用于执行表结构修改(ALTER TABLE)操作。与gh-ost类似,Spirit也采用了"在线双写"的方式,创建一个新表,并使用多线程并发地从原表复制数据到新表,同时通过解析binlog获取原表增量数据,保持新旧表数据最终一致。

Spirit的设计思路和基本原理源于gh-ost,但在实现细节上作了一些优化和创新。


工作原理

创建表:创建一个临时表(_new),其结构与原始表相同。

复制表:多线程并发从原表查询数据批量插入到临时表(_new),例:INSERT IGNORE INTO `test`.`_sbtest2_new` (`id`, `k`, `c`, `pad`)

SELECT `id`, `k`, `c`, `pad` FROM `test`.`sbtest2` FORCE INDEX (PRIMARY) WHERE `id` >= 2001 AND `id` < 3001

增量复制:使用 binlog 事件将原始表的更改增量复制到新表中。

切换表:在完成所有数据复制后,通过原子性的 RENAME TABLE 操作将新表替换为原始表。


使用

shell> ./spirit --host=127.0.0.1:3346 
--username=admin 
--password=123456 --database=test 
--table=sbtest1 
--alter="modify pad varchar(300)" 
--threads=4

Spirit精神小伙  - 一款基于gh-ost原理的在线DDL工具_多线程并发


总结

  • Spirit性能是其主要卖点,通过并发复制和增量复制机制,可以高效地执行大表在线DDL,且不会导致过多锁等待。
  • 仅支持在MySQL 8.0+版本上使用。