ALTER TABLE xxxx ADD xxx, ALGORITHM=INPLACE, LOCK=SHARED
DDL的流程:
- 注意: 在online ddl前,inplace的方法主要在第三步大大缩短了时间,只重构了索引,没有重新copy所有数据
注意:
UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current;
之前online DDL存在的问题:
8.0快速加列的原理:
ALGORITHM=INSTANT,LOCK=DEFAULT
8.0的metadata中新增了instant列的默认值和instant列的数量,数据的物理记录中增加了info_bit,用flag标记这条记录是否是instant 当使用instant时,直接修改metadata中的列信息就好,操作数据时,就可以结合metadata来组成最新数据
针对不同的操作,8.0如何操作instant列的呢
8.0支持哪些操作
8.0快速加列的限制
注意: 1. 当对包含 instant 列的表进行 rebuild 时,所有的数据在 rebuild 的过程中重新以旧的数据格式(包含所有列的内容) 2. 可以用SELECT table_id, name, instant_cols FROM information_schema.innodb_tables WHERE name LIKE '%t1%';查到有多少快速加的列
示例及简单参数介绍:
pt-online-schema-change --check-interval=2 --alter="ENGINE=InnoDB" --no-check-replication-filters --max-load="Threads_running=200" --critical-load="Threads_running=500" --recurse=0 --ask-pass-dry-run --print h=xxx,P=xxx,u=xxx,D=xxx,t=xxx,A=utf8
pt-online-schema-change注意事项:
分享一个pt-online-schema-change的死锁场景
image.png
go-ost相对比pt来说的优势:
go-ost使用以及简单参数介绍
gh-ost --alter "add index (add_time)" --database="test" --table="test" --allow-master-master --allow-on-master --host="xxx" --user="xxx" --password="xxx" --assume-rbr --execute
go-ost有哪些限制呢:
gh-ost的切换细节,如何保证切换时不丢数据:
image.png
gh-ost的bug(源自姜老师公众号,简单描述下)
go-ost执行流程如下:
image.png
最后,本篇文章更多是总结一些DDL的使用,更偏向于一些介绍,汇总,可以帮助开发同学来了解下DDL的发展以及工具使用,如果有哪些地方描述不准确辛苦私下沟通