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:将一个分区划分为两个分区。