如何修改线上的Materialized View

背景

有时候,生产环境的Materialized View难免需要修改,平滑变更以及数据量过大都是需要面对的问题。

修改方法

一、 Explicit table (TO dest)

  1. 停止写入
  2. 修改原始表 dest
  3. create materialized view new_view
  4. exchange tables new and old
  5. drop table new

这个流程基本上可以不影响线上环境完成变更,甚至条件允许的话,都可以直接drop原mv,直接重新建一个

二、 Implicit table (.inner.mv)

Detach来改,网上已经有不少提到这个方法

  • Detach table
  • 定位一下元数据文件所在路径,上机器修改一下那个sql文件
  • Attch回去

这个方法能用但没那么好用,且不说集群需要同步所有机器,我要是用个SaaS服务连机器都上不去。。。

但implicit table的确没法直接改,要是有其他更好方法大家可以分享下。

其他思路

  1. 数据量不大的话直接一把梭
    ​ 直接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;

  2. 数据量大的话
    考虑新建一个mv(TO dest),然后insert select 到 dest表吧