繼續上文講述,使用Nifi管理數據庫分區。
其實關鍵就是表的設計 ,oracle的語法,nifi的自動化。
廢話不多說了,就用一個需求作為結尾吧。
GE_BI_T_CENTER_COMP_DETAIL 這是一張分區表。
T_CENTER_COMP_DETAIL_P20200301 這是3月1號的分區。
T_CENTER_COMP_DETAIL_P20200402 這是4月2號的分區。
我們假設 這張表當前最小的分區是3月1號,最大的分區是4月2號。而今天就是3月29號。
那麼nifi這邊做到操作 就是刪除歷史分區 3月1號,和創建新增分區 4月3號的分區。
那麼首先:
我們將GE_BI_T_CENTER_COMP_DETAIL存儲到一張專門維護分區表的表中。
然後表字段如下:
這樣,我們通過Nifi的ExecuteSQL 得到數據庫的查詢結果。
馬上通過PartitionRecord 這個processor 獲取到 添加分區的天數,刪除分區的天數,分區的前綴,表名等。
PartitionRecord的下游就是 設置 刪除分區 和 添加分區的關鍵屬性。
這樣就構建了關鍵的文本 ,用於組裝sql語句。
接下來 這個下游流向兩處,
一個是生成 刪除分區的語句。【alter table ${table_name} truncate partition ${delete_text} drop storage】
一個是生成 構建分區的語句。【ALTER TABLE ${table_name} ADD PARTITION ${pre_text} VALUES LESS THAN(TO_DATE('${pre}','YYYY-MM-DD'))】
最後,將這兩句sql ,交給 PutSQL 這個processor 去執行就大功告成了。
只是這是在正常情況下,萬一有人給表新加了分區,那執行刪除分區 可能會有問題。
所以為了保險,在刪除分區 之前 加一層校驗,如果當前刪除的分區不是最小的分區,就不給刪除。
select min(partition_name) as MIN_PARTITION from user_tab_partitions where table_name='${table_name:toUpper()}'
執行這個獲取當前的最小分區,當然執行這句查詢肯定是交給
這樣才能保證高可用,而新增分區也是如此類推,查詢添加的分區是否存在,如果不存在就添加,反之就過濾。
然後這樣Nifi 就會每天幫你自動化執行,刪除歷史的分區 和 構建未來的分區。
而用戶只要維護 那張存儲分區表的表即可,一勞永逸。
閱讀更多 豆豆杭哲 的文章