問題:
MySQL (version 5.7.26) 數據庫有一批表 xxx_yyy,由於評估的數據量可能比較大,因此每張表都設置了表分區,把每個月的數據保存在單獨的分區里。
那么如果每年年末,沒有提前創建好第二年的表分區,當第二年的數據寫入時,就會出現以下報錯:
ERROR 1526 (HY000): Table has no partition for value from column_list
解決:
今年的表分區忘了創建,因此需要批量對以 xxx_ 開頭的表創建分區。執行開發提供的存儲過程 tmp_addpart("20220101", "20201231") 將遍歷指定的表,依次創建表分區。
經過觀察,1G 數據的表新建一年的 12 個分區大約需要 6 分鍾。觀察到還有一些大表(數據億條以上,大小超過 10G)。
耗時的原因是:如果分區字段不在主鍵內,需要對表進行主鍵重建。如果按照大表的數據量,主鍵重建的速度會非常非常慢。
因為這些表算是中間表,除非重新回溯計算,否則不太會用到歷史數據。因此考慮將這些大表的數據進行備份(簡單點,直接對表重命名,再創建一個新表)。
RENAME TABLE xxx_yyy TO old_xxx_yyy
CREATE TABLE xxx_yyy LIKE old_xxx_yyy
DESCRIBE xxx_yyy
就先這樣臨時解決吧~
—END—