Oracle数据库中有表却不能导出,导出时显示表不存在。
原因:在Oracle 11g 默认空表不能导出,因为在11g版本中新添加了一个参数deferred_segment_creation,它的意思是段延迟创建;安装数据库后默认是true。可以查看一下,在命令窗口:
SQL> show parameter deferred_segment_creation;
True的意思是当你创建一个表table1,并且没有向表中插入数据,那么这个表不会立即被分配extent,即不会被分配存储空间。当你插入数据时才分配存储空间,好处是减少空间的浪费,所以当你导出一个空表时,就会提示表不存在。
解决方法:
将上述参数设置为false,在命令窗口:
SQL> alter system set deferred_segment_creation=false;
然后关闭数据库重新链接,结果导出数据时还是提示原来问题。
Why? 因为该参数修改后,对之前创建的空表不起作用,对之后创建的表才起作用。
这咋整?那之前的空表就不能导出了吗?别急,看下列解决方式:
1、如果空表就几张,那就先在空表里插入一条数据,这样该表就被分配个存储空间,再把数据删掉,这样就可以导出表。手动麻烦些,不过就几张表。
2、如果空表几十张甚至上百张,那就统一处理,需要用到allocate extent 为表分配空间,需要构造下列语句:
Alter table 表名 allocate extent;
步骤1:首先找到所有空表:
SQL> select table_name from user_tables where num_rows=0;
步骤2:拼凑出上述语句并执行:
SQL> select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
步骤3:将生成的结果进行整理并执行;
步骤4:导出数据;