我有一个在 Linux (x64) 上运行的 Oracle 11g (11.2.0.1) 数据库。在数据库中,我有一个架构和 33 个表(全部位于同一个表空间中)。当我通过 sqlplus 登录时,我可以通过以下方式列出所有表
SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE';
但是当我使用导出表空间时
exp ... BUFFER=65536 FULL=N COMPRESS=N CONSISTENT=Y TABLESPACES=... FILE=...
然后它只导出 33 个表中的 24 个。我尝试通过以下方式导出缺失的表
exp ... TABLES=<missing_table> ...
但后来我收到一个错误:
EXP-00011: <schema>.<missing_table> does not exist
我怎样才能找出这里的问题?
我怎样才能导出所有表格?
更新:
按照 Gary 的建议后,我发现导出的表和丢失的表之间存在以下差异。导出表的 DDL:
CREATE TABLE "MY_SCHEMA"."EXPORTED_TABLE" ( ... ) TABLESPACE "MY_TS" PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K BUFFER_POOL DEFAULT) LOGGING NOCOMPRESS
现在未导出表的 DDL:
CREATE TABLE "MY_SCHEMA"."MISSING_TABLE" ( ... ) TABLESPACE "MY_TS" PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( BUFFER_POOL DEFAULT) LOGGING NOCOMPRESS
上述 DDL 是由企业管理器生成的。使用 sqlplus 创建的 DDL 包含根本没有存储部分查找缺失的表格。
我发现当我重新组织表并将 STORAGE INITIAL 值设置为 64K 时表会被导出。
问题解决了。(希望如此 ;))
答案1
SELECT DBMS_METADATA.GET_DDL('TABLE','yourTableName')
对其中一个有效的表格和一个无效的表格执行。然后玩找不同游戏。(请注意yourTableName
区分大小写。)
可能是类似 BLOB/CLOB 或不同表空间中的分区之类的东西,对未被导出的另一个模式所拥有的 TYPE 的依赖...
答案2
从 Oracle 11gR2 (11.2.0.1) 开始,有一个新功能:延迟段创建:发送的表的创建被延迟到插入第一行为止。这导致空表不会在 dba_segments 中列出,也不会被 exp 实用程序导出。
最简单的解决方案是使用 expdp 实用程序。
如果您必须使用 exp 实用程序,则必须对所有空表运行此命令:
ALTER TABLE tablename ALLOCATE EXTENTS
答案3
表存在于数据库中,但除非为该表分配一个范围,否则您无法导出它……
已用时间:00:00:00.04 14:44:54 PIMUSER @ mdmqa > 更改表 RECORDAPPROVALHISTORY 分配范围;
答案4
这些表是否位于您导出的相同表空间中?请使用以下查询进行检查:
SELECT table_name, tablespace_name FROM user_tables