使用 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 操作将新表替换为原始表。
使用
代码语言:bash复制shell> ./spirit --host=127.0.0.1:3346
--username=admin
--password=123456
--database=test
--table=sbtest1
--alter="modify pad varchar(300)"
--threads=4
总结
- Spirit性能是其主要卖点,通过并发复制和增量复制机制,可以高效地执行大表在线DDL,且不会导致过多锁等待。
- 仅支持在MySQL 8.0 版本上使用。