在数据泵导出期间排除特定的表分区

时间:2012-08-01 14:17:58

标签: oracle datapump

exclude参数可用于在Oracle Data Pump中导出期间过滤出架构对象。

EXCLUDE=object_type[:name_clause] [, ...]

table partition是否有效object_type

换句话说,在导出期间排除选定的表分区是否可行?

3 个答案:

答案 0 :(得分:2)

涵盖filtering during export operations的文档部分说:

  

元数据过滤是通过EXCLUDE和INCLUDE实现的   参数...

     

元数据过滤器标识要包含或排除的一组对象   来自出口或进口业务......

     

要查看有效对象类型列表,请查询以下视图:   完整模式的DATABASE_EXPORT_OBJECTS,SCHEMA_EXPORT_OBJECTS   模式模式,以及表和表空间模式的TABLE_EXPORT_OBJECTS。   OBJECT_PATH列中列出的值是有效对象   类型。

我的11gR2(EE)实例的前两个视图没有对分区的任何引用;第三个有一些引用DBMS_PLUGTS,它没有出现在PL/SQL Packages and Types Reference部分,但似乎是可传输的表空间。

不是确定的,但基于此我不得不说,至少作为单独的对象类型。

那么如何使用table:partition子句中有效的TABLES语法呢?这不起作用;如果您尝试在EXCLUDE子句中包含分区名称:

expdp tables=MY_TABLE exclude=table:"= 'MY_TABLE:SOME_PARTITION'" ...

...它被忽略了,整个表仍然被导出 - 它似乎将:视为表名的一部分,因为它在引号中并不完全不合理,因此不会匹配您要导出的表格。如果您指定要导出的架构,而不仅仅是该表,则相同。

您似乎唯一的选择是在TABLES子句中指定您 想要的分区。

答案 1 :(得分:1)

在导出期间包含/排除选定分区的唯一方法是使用datapump API。以下是一个例子:

http://www.acehints.com/2011/06/data-pump-expdp-how-to-exclude-table.html

答案 2 :(得分:1)

您不能使用TABLE关键字排除表分区,您要做的是排除TABLE_DATA

exclude=table_data:"in ('SOME_PARTITION','SOME_OTHER_PARTITION')"

手册实际上解释了这一点。

不幸的是,任何table_data匹配都将被排除。如果按周期划分表格,这非常好,如: TRANSACTION.PD2010
TRANSACTION.PD2011
TRANSACTION.PD2012
TRANSACTION.PD2013
TRANSACTION_DETAIL.PD2010
TRANSACTION_DETAIL.PD2011
TRANSACTION_DETAIL.PD2012
TRANSACTION_DETAIL.PD2013
分区名称不应与任何表名相同,但您在计划分区时当然会这样做。
您现在可以按如下方式进行排除:

exclude=table_data:"in (select partition_name from user_partitions where partition_name like 'PD%' and partition_name < 'PD' || to_char(sysdate,'YYYY'))"

您也可以使用select语句而不是表列表以相同的方式进行包含,这样您就可以获得4000个字符的行限制。这也可以通过多个include语句来规避,或者通过在表列表中添加换行符来规避,但是我相信如果你有一个in列表,那个列表中只能有1000个对象,你也可以做一个表导出,它只导出表,而不是模块,触发器等。该列表不限于1000,并且您可以通过添加换行符再次获得4000个字符的限制。