oracle 11g deferred_segment_creation段延遲建立
今天早上一大早,同事就說系統無法登入。檢視報錯資訊居然是:ORA-00942: 表或檢視不存在
因為昨晚給資料庫做了雙機dataguard,為了確保割接順利進行,我把備庫的資料庫刪了重新匯入了,今天早上又把備庫的資料恢復。難道是備庫中少匯入了表?
檢視昨晚備庫的匯出日誌,確實沒有這部分表。同事說這些表他確實是建在備庫上了。感覺非常奇怪,但是各種備份日誌都查不到錯誤資訊,而且備庫的備份日誌顯示:“成功終止匯出, 沒有出現警告。”檢視匯出列表,確實沒這些表。詭異的~~~
最後想到用的庫是最新版本的ORACLE 11R2,懷疑是遇到BUG了。一查資料發現,原來是ORACLE 11R2新引數的問題。
ORACLE 11g 新增了一個引數:deferred_segment_creation,從字面理解含義是段延遲建立,該引數取值範圍是true和false,預設是true。具體是如果deferred_segment_creation為true,當新建表並且沒有向其中插入資料的時候,這個表不會立即分配extent,即不佔資料空間,只有insert資料後才分配空間,這樣做可以節省少量的空間。但是也給初接觸oracle 11g的人帶來了麻煩,我就是受害者之一!!!
如果deferred_segment_creation為false,那就和之前版本建立表一樣,建立時即分配extent。
一、問題提出
如果deferred_segment_creation為預設值,當透過EXP命令來匯出整個使用者時,所有沒有資料的表都導不出來。
如果deferred_segment_creation為false,那就和之前版本建立表一樣,建立時即分配extent。
一、問題提出
如果deferred_segment_creation為預設值,當透過EXP命令來匯出整個使用者時,所有沒有資料的表都導不出來。
二、問題分析
1、新建表沒有分配extent,在user_segments檢視中必然查不到,但是在user_tables中是可以查到的。這樣就可以找出哪些表是沒有建立extent的:
select * from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
2、透過alter table xxx allocate extent 語句立即為其分配extent:
alter table t1 allocate extent (size 64k);
三、問題解決
1、批次處理所有“空表”:
select 'alter table '||table_name||' allocate extent(size 64k);' sql_text,table_name,tablespace_name
from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
2、透過alter table xxx allocate extent 語句立即為其分配extent:
alter table t1 allocate extent (size 64k);
三、問題解決
1、批次處理所有“空表”:
select 'alter table '||table_name||' allocate extent(size 64k);' sql_text,table_name,tablespace_name
from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
2、把sql_text列在sqlplus中執行一下就可以透過exp匯出。
3、如果覺得每次匯出都這樣做太麻煩,完全可以將deferred_segment_creation引數調為false,這樣調整後建的表都會立即分配空間,但是調整前的表都不會改變,因此還需要用1、2提到的辦法解決。
3、如果覺得每次匯出都這樣做太麻煩,完全可以將deferred_segment_creation引數調為false,這樣調整後建的表都會立即分配空間,但是調整前的表都不會改變,因此還需要用1、2提到的辦法解決。
--調整deferred_segment_creation為false:
SQL> alter system set deferred_segment_creation=false;
SQL> alter system set deferred_segment_creation=false;
--調整deferred_segment_creation為預設值:
SQL> alter system reset deferred_segment_creation;
四、其他方法
1、現在網上提到的辦法都是先往表中間insert一條資料,然後再rollback,使之分配空間。但是每次建表都這樣做也是比較麻煩,不推薦。
2、透過move(alter table table_name move;)的辦法也能得到相同的效果,因為move會使部分索引失效,所以也不推薦。
SQL> alter system reset deferred_segment_creation;
四、其他方法
1、現在網上提到的辦法都是先往表中間insert一條資料,然後再rollback,使之分配空間。但是每次建表都這樣做也是比較麻煩,不推薦。
2、透過move(alter table table_name move;)的辦法也能得到相同的效果,因為move會使部分索引失效,所以也不推薦。
如果空間不是很緊張,還是建議把這個引數改成false。不過,如果你是用expdp代替exp的話,就不會出現這個問題。而且expdp比exp要快,只是exp先入為主,大家都比較習慣是用exp。oracle新增deferred_segment_creation這個引數的目的難到只是為了節省一點空間麼?而且也只是在建立表時沒分配extent,當插入資料的時候並不會節省空間,還是順便推薦大家以後多使用expdp?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-702058/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【延遲段建立】Oracle 11gR2的延遲段建立(deferred segment creation)特性Oracle
- Oracle11gr2延遲段建立Oracle
- Oracle 11gr2 的新特性-延遲段建立Oracle
- Oracle 11g中的密碼延遲功能Oracle密碼
- ORACLE 11g RAC 叢集互連延遲Oracle
- oracle 11g 密碼延遲驗證問題Oracle密碼
- 關於SYS使用者無法使用延遲段建立的示例
- Oracle 11g RAC查詢物理備庫延遲情況Oracle
- [Rman]Oracle 11g控制檔案延遲自動備份Oracle
- oracle的延遲約束Oracle
- Unlimited Tablespace 許可權 及 “延遲段”特性MIT
- SYS使用者物件不支援延遲段物件
- 取消 11G延遲密碼驗證密碼
- Oracle 11g 密碼延遲認證與 library cache lock 等待Oracle密碼
- 【11gR2新特性】extent延遲建立
- ORACLE密碼錯誤驗證延遲Oracle密碼
- oracle 塊延遲清除(delayed block cleanout) 理解OracleBloC
- oracle block cleanout塊清除_延遲塊清除OracleBloC
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- 【Deferred Segment Creation】Oracle 11g新特性-延期建立段Oracle
- 延遲釋出
- Oracle資料庫密碼延遲驗證Oracle資料庫密碼
- 11G新特性-控制檔案延遲自動備份
- 如何建立 Laravel 延遲載入的服務提供者Laravel
- Mysql 建立心跳錶來監控Replication的Slave是否延遲MySql
- Laravel 延遲佇列Laravel佇列
- WebGL之延遲著色Web
- Mybatis延遲查詢MyBatis
- 疫情延遲 題解
- redis 延遲佇列Redis佇列
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- oracle延遲事務無法自動推入處理Oracle
- Oracle 11G EM建立Oracle
- oracle 11g dataguard 建立Oracle
- oracle 11g 建立 jobOracle
- 延遲阻塞佇列 DelayQueue佇列
- SQL之延遲約束SQL