exclude参数可用于在Oracle Data Pump中导出期间过滤出架构对象。
EXCLUDE=object_type[:name_clause] [, ...]
table partition
是否有效object_type
?
换句话说,在导出期间排除选定的表分区是否可行?
答案 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个字符的限制。