ALTER TABLE ... TRUNCATE PARTITION 用于清空分区表指定分区内的全部数据,此操作会永久移除数据但保留分区结构,执行前需确认数据不再需要或已备份。
语法介绍
ALTER TABLE table_name TRUNCATE PARTITION partition_name
[{DROP|REUSE} STORAGE]参数说明
参数名称 | 参数要求 | 参数说明 | 参数示例 |
| 必填 | 要清空分区的目标分区表的名称。 |
|
| 必填 | 要清空的分区的名称。 |
|
| 选填 | 子句仅为兼容 Oracle 语法而存在,会被解析但实际忽略,不影响存储行为。 |
|
注意事项
执行此命令的用户需是该表的所有者或者是高权限用户。
该操作会获取
AccessExclusiveLock(表级排他锁),阻塞该表的所有 DML 和大部分 DDL 操作。建议在业务低峰期执行,并预留足够的时间窗口。TRUNCATE PARTITION是元数据操作+文件删除,即使亿级数据也可秒级完成,I/O 和CPU/内存开销极低。如果表上定义了
ON TRUNCATE触发器,该操作会触发它们。请确保了解这些触发器可能执行的业务逻辑,避免意外的连锁反应。
使用示例
本示例演示如何清空一个销售记录表中的历史季度分区。此操作常用于数据生命周期管理,即删除旧数据但保留分区结构,以便将来加载同一时期的新数据。
常见问题
Q1:TRUNCATE PARTITION 和 DROP PARTITION 有什么区别?TRUNCATE PARTITION 仅清空分区内的数据但保留分区定义,而 DROP PARTITION 会将分区定义和数据一并删除。
Q2:执行 TRUNCATE PARTITION 后,数据可以恢复吗?
不可以,因为 TRUNCATE 是一项DDL操作,它会永久删除数据且默认不记录在事务日志中,无法通过常规手段回滚或闪回。
Q3:执行此命令为什么提示 RA-02149: specified partition does not exist?
分区名不存在或大小写不匹配。分区名大小写敏感,请先通过查询确认分区名称,或使用双引号精确引用。
Q4:执行此命令为什么提示 ORA-01031: insufficient privileges?
这是因为执行该命令的用户不具备目标表的 ALTER 权限,需要联系数据库管理员授予相应权限。
Q5:执行此命令为什么提示ERROR: cannot truncate partition of table because it has global indexes?
有全局索引时,执行 TRUNCATE PARTITION 会失败。全局索引跨所有分区维护唯一性和查询路径,TRUNCATE 无法在不破坏索引一致性的前提下快速清理索引条目。
相关语句
ALTER TABLE…DROP PARTITION:删除分区定义及其包含的数据。
ALTER TABLE…ADD PARTITION:向分区表添加新分区。
ALTER TABLE…SPLIT PARTITION:将一个分区划分为两个分区。