无效。Oracle Data Pump的TABLES参数不支持“表名:分区名”格式,会报ORA-31655错误或忽略分区导出全表;正确方式是用QUERY或INCLUDE配合分区键条件逻辑过滤,无原生按分区导出参数。
EXPDP TABLES=表名:分区名 语法是否有效?
无效。oracle data pump 的 tables 参数不支持直接写 表名:分区名 这种格式——这会报错 ora-31655: no data or metadata objects selected 或直接被忽略分区部分,导出整张表。
正确导出单个分区的两种可靠方式
必须用 QUERY 或 INCLUDE 配合分区键条件,或改用 FLASHBACK_TIME + TABLES(仅限有分区键且可过滤的场景)。核心是:Data Pump 本身没有“按分区导出”的原生参数,得靠逻辑过滤模拟。
-
推荐用
QUERY(最直观):在导出时加QUERY=表名:"WHERE 分区键列 >= 值 AND 分区键列 ,确保条件精准命中目标分区(比如按日期范围、数值区间) -
用
INCLUDE+TABLE_DATA(更安全):INCLUDE=TABLE_DATA:"IN ('表名')"再配合QUERY,避免误导元数据;若分区键不可见(如 LIST 分区无显式范围),需先查USER_TAB_PARTITIONS确认该分区实际覆盖的键值 -
别信“
TABLES=表名:分区名能跑通”:某些旧文档或测试环境看似成功,实则是 Oracle 忽略了冒号后内容,导出了整表——检查日志里的Processing object type TABLE_EXPORT/TABLE/TABLE_DATA行数就能验证
QUERY 中容易漏掉的转义和空格细节
Oracle 对 QUERY 的解析极敏感:引号嵌套、空格、大小写全影响结果。常见翻车点:
- Windows 命令行里双引号需成对且外层用双引号、内层用单引号:
QUERY=SCOTT.EMP:"WHERE DEPTNO = 10"→ 实际要写成QUERY="SCOTT.EMP:\"WHERE DEPTNO = 10\"" - Linux/bash 下单引号更稳:
QUERY='SCOTT.EMP:"WHERE DEPTNO = 10"',但若条件含单引号(如字符串值),得用两个单引号转义 - 分区键是字符串类型时,值必须加单引号;数值类型则不能加——错加会导致全表扫描或无数据
- 导出前务必用相同条件在 SQL*Plus 里执行
SELECT COUNT(*) FROM 表名 WHERE ...,确认行数匹配,否则导出为空也查不出错
性能与一致性风险:单分区导出不是“轻量操作”
看起来只导一个分区,但 EXPDP 默认仍会对整张表做元数据解析、权限校验、段扫描——尤其大表+高并发时,可能触发大量 DBA_SEGMENTS 查询,拖慢导出速度,甚至阻塞 DDL。
- 加
ESTIMATE=BLOCKS可跳过行数估算,省几秒到几分钟(视表大小) - 若需强一致性,必须加
FLASHBACK_TIME=SYSTIMESTAMP或指定 SCN,否则导出过程中分区数据被修改,备份就不可用 - 导出文件本身不含分区结构信息,还原时需手动建好同结构表+分区,再用
IMPDP TABLES=表名导入——别指望它自动重建分区

















