如何修改线上的Materialized View
背景
有时候,生产环境的Materialized View难免需要修改,平滑变更以及数据量过大都是需要面对的问题。
修改方法
一、 Explicit table (TO dest)
- 停止写入
- 修改原始表 dest
- create materialized view new_view
- exchange tables new and old
- drop table new
这个流程基本上可以不影响线上环境完成变更,甚至条件允许的话,都可以直接drop原mv,直接重新建一个
二、 Implicit table (.inner.mv)
Detach来改,网上已经有不少提到这个方法
- Detach table
- 定位一下元数据文件所在路径,上机器修改一下那个sql文件
- Attch回去
这个方法能用但没那么好用,且不说集群需要同步所有机器,我要是用个SaaS服务连机器都上不去。。。
但implicit table的确没法直接改,要是有其他更好方法大家可以分享下。
其他思路
-
数据量不大的话直接一把梭
直接CREATE Materialized View xxx_new ... populate AS SELECT ....
但要注意populate过程中不要有数据插入,然后我踩了个坑,如果数据量涉及的partition如果有 点多但实际数据量其实还好),会出现
Too many partitions for single INSERT block more than 100)
这个问题。
感觉上populate像是当初一次insert执行的样子,不改分区键的话,可以临时调大再执行
set max_partitions_per_insert_block=600;
-
数据量大的话
考虑新建一个mv(TO dest),然后insert select 到 dest表吧