ALTER TABLE ... DROP PARTITION 用於從一個分區表中刪除指定的分區及其包含的全部資料。此操作會永久移除資料且不可恢複,執行前需確認目標資料分割已備份或不再需要。
文法介紹
ALTER TABLE [schema.]table_name DROP PARTITION partition_name;參數說明
參數名稱 | 參數要求 | 參數說明 | 參數樣本 |
| 必填 | 要刪除分區的目標資料分割表的名稱。 |
|
| 必填 | 要刪除的分區的名稱。 |
|
注意事項
執行此命令的使用者需是該表的所有者或者是高許可權使用者。
不能刪除最後一個分區,目標資料分割表至少要保留一個分區。
DROP PARTITION會擷取AccessExclusiveLock(表級獨佔鎖定),阻塞該表的所有 DML 和大部分 DDL 操作。建議在業務低峰期執行,並預留足夠的時間視窗。
使用樣本
常見問題
Q1:執行刪除分區後,報partition "..." of relation "..." does not exist異常。
分區名不存在或大小寫不匹配。分區名大小寫敏感,請先查詢 USER_TAB_PARTITIONS確認分區名稱,或使用雙引號精確引用。
Q2:執行刪除分區後,報permission denied for table ... 或 must be owner of table ...異常。
執行操作的使用者權限不足,需切換到表所有者或高許可權使用者執行。
Q3:執行刪除分區後,報cannot drop partition due to dependent objects異常。
存在其他資料庫物件(如外鍵約束、視圖)依賴於此分區。預設的 RESTRICT 行為會阻止刪除。可以手動識別並刪除這些依賴對象。
Q4:操作長時間未完成或卡住。
執行 DROP PARTITION 時,資料庫會請求 AccessExclusiveLock 鎖。若該鎖被其他活躍事務阻塞,操作將進入等待狀態,可能導致逾時或執行延遲。可通過查詢鎖資訊擷取會話(blocking_pid),在通過以下語句查詢具體會話資訊。
-- 根據pid查詢阻塞線程的使用者資訊
SELECT
pid,
usename AS username, -- 資料庫使用者名稱
application_name, -- 應用程式名稱(如 JDBC, psql)
client_addr, -- 用戶端 IP 位址
client_hostname, -- 用戶端主機名稱
client_port, -- 用戶端連接埠
backend_start, -- 串連開始時間
xact_start, -- 事務開始時間
query_start, -- 當前查詢開始時間
state_change, -- 狀態變更時間
state, -- 狀態(active, idle, idle in transaction)
wait_event_type, -- 等待類型(如 Lock, IO)
wait_event, -- 具體等待事件
query -- 當前正在執行或最近執行的 SQL
FROM
pg_stat_activity
WHERE
pid in 'blocking_pid'; 相關語句
ALTER TABLE…ADD PARTITION:向分區表添加新分區。
ALTER TABLE…TRUNCATE PARTITION:清空分區中的資料,但保留分區定義。
ALTER TABLE…SPLIT PARTITION:將一個分區劃分為兩個分區。