溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle 11g不能導(dǎo)出空表的多種解決方法

發(fā)布時間:2020-07-24 00:55:21 來源:網(wǎng)絡(luò) 閱讀:3762 作者:M_ling 欄目:關(guān)系型數(shù)據(jù)庫

空表不能導(dǎo)出的問題:

查資料發(fā)現(xiàn)Oracle 11g中有個新特性:新增了一個參數(shù)“deferred_segment_creation”含義是段延遲創(chuàng)建,默認(rèn)是true

具體是什么意思呢?

deferred_segment_creation,即建立表的時候,這個表不會立即分配extent,也就是不占數(shù)據(jù)空間,即表也不分配segment以節(jié)省空間。直接在字典中記錄了數(shù)據(jù)結(jié)構(gòu)。而只有當(dāng)真正有數(shù)據(jù)的時候才分配空間。這種方法對于象SAP這樣大的系統(tǒng)需要部署成千上萬張表是非常有效的。默認(rèn)是開啟的為ture,需要關(guān)閉alter system set deferred_segment_creation=false;

在系統(tǒng)表user_tables中也可以看到segment_treated的字段里是“NO”或者“YES”說明了某張表是否分配了segment。

用下面的SQL語句查詢,可以發(fā)現(xiàn)沒有導(dǎo)出的表其 segment_created 字段值都是 'NO'

Select segment_created,table_name from user_tables where segment_created = 'NO';

解決方案:

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

該方法是在在空表中插入數(shù)據(jù),再刪除,則產(chǎn)生segment。導(dǎo)出時則可導(dǎo)出空表。

 

2、設(shè)置deferred_segment_creation 參數(shù):

   設(shè)置deferred_segment_creation 參數(shù)為FALSE來禁用"段推遲創(chuàng)建"(也就是直接創(chuàng)建segment),無論是空表還是非空表,都分配segment

   sqlplus中,執(zhí)行如下命令:

SQL>alter system set deferred_segment_creation=false;

查看:

SQL>show parameter deferred_segment_creation;

   注意:該值設(shè)置后只對后面新增的表產(chǎn)生作用,對之前建立的空表(已經(jīng)存在的)不起作用,仍不能導(dǎo)出。

   并且要重新啟動數(shù)據(jù)庫,讓參數(shù)生效。

 

3、使用ALLOCATE EXTENT,可以導(dǎo)出之前已經(jīng)存在的空表。

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

 

構(gòu)建對空表分配空間的SQL命令。

查詢當(dāng)前用戶下的所有空表(一個用戶最好對應(yīng)一個默認(rèn)表空間)。命令如下:

   SQL>select table_name from user_tableswhere NUM_ROWS=0; 

Oracle 11g不能導(dǎo)出空表的多種解決方法


根據(jù)上述查詢,可以構(gòu)建針對空表分配空間的命令語句,如下:

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

Oracle 11g不能導(dǎo)出空表的多種解決方法

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

4、執(zhí)行對空表分配空間的SQL命令。

alter table WJDCPERSON allocate extent;
alter table VERSION_NUMBER allocate extent;

5、執(zhí)行完以上命令,然后再用exp的方式去導(dǎo)出數(shù)據(jù)庫,就可以完整的導(dǎo)出包括空表的數(shù)據(jù)庫。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI