oracle 11G 導出空表失敗的解決方法

1、問題緣由: 
    11G中有個新特性,當表無數據時,不分配segment,以節省空間 
    一、insert一行,再rollback就產生segment了。 

        該方法是在在空表中插入數據,再刪除,則產生segment。導出時則可導出空表。 

    二、設置deferred_segment_creation 參數 

       show parameter deferred_segment_creation 

   NAME                                 TYPE        VALUE 

   ------------------------------------ ----------- ---------- 

   deferred_segment_creation            boolean     TRUE 

   SQL> alter system set deferred_segment_creation=false; 

   系統已更改。 

   SQL> show parameter deferred_segment_creation 

   NAME                                 TYPE        VALUE 

   ------------------------------------ ----------- ---------- 


   deferred_segment_creation            boolean     FALSE 

    該參數值默認是TRUE,當改成FALSE時,不管是空表仍是非空表,都分配segment。 

    需注意的是:該值設置後對之前導入的空表不產生做用,仍不能導出,只能對後面新增的表產生做用。如需導出以前的空表,只能用第一種方法。 

2、解決方法: 

    一、先查詢一下當前用戶下的全部空表 

      select table_name from user_tables where NUM_ROWS=0; 

    二、用如下這句查找空表 

      select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 

       把查詢結果導出,執行導出的語句 

      'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT;' 

      ----------------------------------------------------------- 

      alter table AQ$_AQ$_MEM_MC_H allocate extent; 

      alter table AQ$_AQ$_MEM_MC_G allocate extent; 

      alter table AQ$_AQ$_MEM_MC_I allocate extent; 

      alter table AQ$_AQ_PROP_TABLE_T allocate extent; 

      alter table AQ$_AQ_PROP_TABLE_H allocate extent; 

      alter table AQ$_AQ_PROP_TABLE_G allocate extent; 

      alter table AQ$_AQ_PROP_TABLE_I allocate extent; 

      alter table AQ$_KUPC$DATAPUMP_QUETAB_T allocate extent; 

      alter table AQ$_KUPC$DATAPUMP_QUETAB_H allocate extent; 

      alter table AQ$_KUPC$DATAPUMP_QUETAB_G allocate extent; 

      alter table AQ$_KUPC$DATAPUMP_QUETAB_I allocate extent; 

    三、而後再執行 

       exp 用戶名/密碼@數據庫名 file=/home/oracle/exp.dmp log=/home/oracle/exp_smsrun.log   成功! 


ORACLE 11G在用EXPORT導出時,空表不能導出。 

11G中有個新特性,當表無數據時,不分配segment,以節省空間 

  解決方法: 
  一、insert一行,再rollback就產生segment了。 
  該方法是在在空表中插入數據,再刪除,則產生segment。導出時則可導出空表。 

  二、設置deferred_segment_creation 參數 
  該參數值默認是TRUE,當改成FALSE時,不管是空表仍是非空表,都分配segment。 

  需注意的是:該值設置後對之前已經存在的空表不產生做用,仍不能導出,只能對後面新增的表產生做用。如需導出以前的空表,只能用第一種方法】 

以爲不是解決方法,而後就用了expdp和impdp 
create directory expdp_dir as   '/data/app1/dp'; 
grant read,write on directory expdp_dir to DRGN_OWNER; 

expdp DRGN_OWNER/DRGN_OWNER DIRECTORY=expdp_dir DUMPFILE=DRGN_OWNER.dmp SCHEMAS=DRGN_OWNER logfile=DRGN_OWNERexpdp.log 

create directory impdp_dir as '/data/app1/dp'; 
grant read,write on directory impdp_dir to DRGN_OWNER; 

impdp DRGN_OWNER/DRGN_OWNER DIRECTORY=impdp_dir DUMPFILE=DRGN_OWNER.dmp logfile=DRGN_OWNER.dmpimpdp.log 

空表果真已經導入了 

對於DBA新建數據庫,我我的建議,創建了空的數據庫後,立刻執行 
alter system set deferred_segment_creation=false scope=spfile; 
shutdowm immediate 
startup 




【總結】 
一、本身沒有好好學習11g的新特性,致使了這個問題花費了2個小時的 
二、建議客戶使用穩定的10.2.0.4,客戶拒絕,如今11g已是主流了,並非每個客戶都很保守使用穩定版本,而非最新版本 
三、某美 和 某ELL 的項目之後少接觸,4年前IBM P570雙機Oracle10g的實施問題就折騰的無語。 
四、再次論證了不少甲方和廠商基本都是:事前豬同樣,過後諸葛亮。和目前國內流行的磚家叫獸有殊途同歸之妙。 
五、作技術果真是一條不歸之路 



在Oracle 11g中,exp默認不能導出空表。用傳統的exp,imp進行異構平臺數據庫遷移會比較麻煩。不過可使用expdp、impdp進行遷移。 

把64位windows 2003的Oracle11gR2數據庫遷移到64位Linux RedHat Enterprise 5中,可使用expdp、impdp進行遷移數據。 

如:Windows爲A服務器,Linux爲B服務器,數據庫用戶爲test,把A服務器的數據遷移到B服務器中 


在A服務器操做: 

一、 

SQL> create directory expdp_dir as 'D:\mzl\backup '; 

SQL> grant read,write on directory expdp_dir to test; 

二、在windows目錄建立目錄D:\mzl\backup 

三、在DOS命令窗口導出: 

expdp test/test DIRECTORY=expdp_dir DUMPFILE=test.dmp logfile=testexpdp.log 

在B服務器中操做: 

四、SQL> create directory impdp_dir as '/home/oracle/impdp_dir'; 

  SQL> grant read,write on directory impdp_dir to test; 

一、 在系統中須要有/home/oracle/impdp_dir目錄,在impdp_dir目錄下必須有讀寫權限 

(chmod 777 impdp_dir) 

五、用ftp把A服務器導出的數據上傳到B服務器的/home/oracle/impdp_dir目錄中 

在A服務器中配置好B服務器的服務器名,在A服務器導入數據 

六、在DOS命令窗口導出: 

impdp test/test@B_database DIRECTORY=impdp_dir DUMPFILE=test.dmp logfile=testimpdp.log 

(這裏注意大小寫,若是test.dmp在linux中爲大寫,必須更改成大寫。Linux區分大小寫) 



本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連接:http://www.linuxidc.com/Linux/2011-08/41146.htm 

  在oracle 11g r2中,發現傳統的exp竟然不能導出空的表,而後查詢一下, 
發現須要以下的步驟去搞,筆記之。 

oracle 11g 新增了一個參數:deferred_segment_creation,含義是段延遲建立,默認是true。具體是什麼意思呢? 

若是這個參數設置爲true,你新建了一個表T1,而且沒有向其中插入數據,那麼這個表不會當即分配extent,也就是不佔數據空間,只有當你insert數據後才分配空間。這樣能夠節省少許的空間。 

解決辦法 

1 設置deferred_segment_creation 參數爲FALSE後,不管是空表仍是非空表,都分配segment。 

   在sqlplus中,執行以下命令: 

   SQL>alter system set deferred_segment_creation=false; 

   查看: 
   SQL>show parameter deferred_segment_creation; 


   該值設置後只對後面新增的表產生做用,對以前創建的空表不起做用。 

   注意而且要從新啓動數據庫,讓參數生效 

2  使用ALLOCATE EXTENT的說明 


   使用ALLOCATE EXTENT能夠爲數據庫對象分配Extent。其語法以下: 

   ----------- 
   ALLOCATE EXTENT { SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer } 
    ----------- 

   能夠針對數據表、索引、物化視圖等手工分配Extent。 

   ALLOCATE EXTENT使用樣例: 

    ALLOCATE EXTENT 
    ALLOCATE EXTENT(SIZE integer [K | M]) 
    ALLOCATE EXTENT(DATAFILE 'filename') 
    ALLOCATE EXTENT(INSTANCE integer) 
    ALLOCATE EXTENT(SIZE integer [K | M]   DATAFILE 'filename') 
    ALLOCATE EXTENT(SIZE integer [K | M]   INSTANCE integer) 
   

    針對數據表操做的完整語法以下: 

   ----------- 
    ALTER TABLE [schema.]table_name ALLOCATE EXTENT [({ SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer})] 
    ----------- 


    故,須要構建以下樣子簡單的SQL命令: 

   ----------- 
   alter table aTabelName allocate extent 
   ----------- 



3.2 構建對空表分配空間的SQL命令, 


    查詢當前用戶下的全部空表(一個用戶最好對應一個默認表空間)。命令以下: 

   ----------- 
   SQL>select table_name from user_tables where NUM_ROWS=0; 
   ----------- 


   根據上述查詢,能夠構建針對空表分配空間的命令語句,以下: 

   ----------- 
   SQL>Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 
    ----------- 


   批量輸出上述生成的SQL語句,創建C:\createsql.sql,其內容以下: 

   ----------- 
   set heading off; 
   set echo off; 
   set feedback off; 
   set termout on; 
   spool C:\allocate.sql; 
   Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0; 
    spool off; 
   ----------- 


   執行C:\createsql.sql,命令以下: 
   ----------- 
   SQL>@ C:\createsql.sql; 
   ----------- 

   執行完畢後,獲得C:\allocate.sql文件。 

   打開該文件會看到,已經獲得對全部空表分配空間的命令SQL語句。 


3.4 執行SQL命令,對空表分配空間: 

   執行C:\allocate.sql,命令以下: 
   ----------- 
   SQL>@ C:\allocate.sql; 
   ----------- 
  
   執行完畢,表已更改。 


3.4 此時執行exp命令,便可把包括空表在內的全部表,正常導出。linux

相關文章
相關標籤/搜索