Oracle 11g不能匯出空表的多種解決方案

來源:互聯網
上載者:User

Oracle 11g不能匯出空表的多種解決方案

Oracle 11g空表不能匯出的問題:

查資料發現Oracle 11g中有個新特性:新增了一個參數“deferred_segment_creation”含義是段延遲建立,預設是true。

具體是什麼意思呢?

deferred_segment_creation,即建立表的時候,這個表不會立即分配extent,也就是不佔資料空間,即表也不分配segment以節省空間的。直接在字典中記錄了資料結構。而只有當真正有資料的時候才分配空間。這種方法對於象SAP這樣大的系統需要部署成千上萬張表是非常有效。預設是開啟的為ture,需要關閉alter system set deferred_segment_creation=false;

在系統資料表user_tables中也可以看到segment_treated的欄位裡是“NO”或者“YES”說明了某張表是否分配了segment。

用下面的SQL語句查詢,可以發現沒有匯出的表其 segment_created 欄位值都是 'NO'。

1 Select segment_created,table_name from user_tableswhere segment_created = 'NO';

解決方案:

1、最原始最笨的辦法(不推薦):insert一行,再rollback或者刪除就產生segment了。

該方法是在在空表中插入資料,再刪除,則產生segment。匯出時則可匯出空表。

2、設定deferred_segment_creation 參數:

設定deferred_segment_creation 參數為FALSE來禁用"段延遲建立"(也就是直接建立segment),無論是空表還是非空表,都分配segment。

在sqlplus中,執行如下命令:

SQL>alter system setdeferred_segment_creation=false;

查看:

SQL>show parameterdeferred_segment_creation;

注意:該值設定後只對後面新增的表產生作用,對之前建立的空表(已經存在的)不起作用,仍不能匯出。

並且要重新啟動資料庫,讓參數生效。

3、使用ALLOCATE EXTENT,可以匯出之前已經存在的空表。

使用ALLOCATE EXTENT可以為資料庫物件的每一張表分配Extent(注意針對每一張表,就是說一張表需要一條SQL代碼),但要是每一張表寫一條語句的話太過麻煩,為了方便我們使用SQL命令拼字出每一張表的alter語句。

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

查詢目前使用者下的所有空表(一個使用者最好對應一個預設資料表空間)。命令如下:

SQL>select table_name from user_tableswhere NUM_ROWS=0;

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

SQL>Select 'alter table '||table_name||'allocate extent;' from user_tables where num_rows=0 or num_rows is null(注意:很多教程沒有這裡,這裡是有可能為空白的)

上述代碼可產生批量的修改表extent的SQL語句(有多少張空表就產生多少條),我們只需要將其產生的所有sql代碼全部執行,就可以給每一張已經存在的表來分配segment,就OK了。

4、執行對空表分配空間的SQL命令。

alter table WJDCPERSON allocate extent;

alter table VERSION_NUMBER allocate extent;

5、執行完以上命令,然後再用exp的方式去匯出資料庫,就可以完整的匯出包括空表的資料庫。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.