【轉】解決Oracle 11g在用EXP導出時,空表不能導出


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

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

    2、設置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。

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

二、解決方法:

    1、先查詢一下當前用戶下的所有空表

      select table_name from user_tables where NUM_ROWS=0;

    2、用以下這句查找空表

      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;

    3、然后再執行

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


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

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

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

  2、設置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=flase sscope=spfile;
shutdowm immediate
startup




【總結】
1、自己沒有好好學習11g的新特性,導致了這個問題花費了2個小時的
2、建議客戶使用穩定的10.2.0.4,客戶拒絕,現在11g已經是主流了,並不是每一個客戶都很保守使用穩定版本,而非最新版本
3、某美 和 某ELL 的項目以后少接觸,4年前IBM P570雙機Oracle10g的實施問題就折騰的無語。
4、再次論證了很多甲方和廠商基本都是:事前豬一樣,事后諸葛亮。和目前國內流行的磚家叫獸有異曲同工之妙。
5、做技術果然是一條不歸之路



在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服務器操作:

1、

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

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

2、在windows目錄創建目錄D:\mzl\backup

3、在DOS命令窗口導出:

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

在B服務器中操作:

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

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

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

(chmod 777 impdp_dir)

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

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

6、在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命令,即可把包括空表在內的所有表,正常導出。

本文轉自以下地址:

http://vondon.iteye.com/blog/1316223


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM