2009-12-01 23 views
30

我們如何才能在oracle中收縮臨時表空間?以及爲什麼它增加了如此高達25 GB,因爲應用程序的數據庫中只有一個模式,數據表空間大小爲2 GB,索引表空間大小爲1 GB。如何在oracle中收縮臨時表空間?

+0

什麼版本的Oracle? – BradC

+0

你看過我的答案和它鏈接到的頁面嗎?我想知道你還需要什麼。 –

回答

94

哦,我的天啊!看看我的臨時表空間的大小! 或...如何縮小Oracle中的臨時表空間。

是的,我跑了查詢,看看我的臨時表空間有多大:

SQL> SELECT tablespace_name, file_name, bytes 
2 FROM dba_temp_files WHERE tablespace_name like 'TEMP%'; 

TABLESPACE_NAME FILE_NAME         BYTES 
----------------- -------------------------------- -------------- 
TEMP    /the/full/path/to/temp01.dbf  13,917,200,000 

你要問的第一個問題是,爲什麼臨時表空間是如此之大。 你可能知道這個問題的答案。這可能是由於您的一個大錯誤(我已經多次完成了 )才運行的大型查詢。這可能是由於其他特殊情況。如果這種情況是 ,那麼清理所需要做的只是縮小臨時表空間,然後繼續前進。

但是如果你不知道怎麼辦?在決定縮小之前,您可能需要對大表空間的原因進行一些調查。如果這發生在定期的 上,那麼您的數據庫可能只需要這麼多的空間。

動態性能視圖

V$TEMPSEG_USAGE 

可以是確定的原因是非常有用的。

也許你只是不在乎原因,你只需要縮小它。 這是你工作的第三天。如果數據和臨時表空間是13GiB,那麼數據庫中的數據只有200MiB - 只需將其縮小並繼續。 如果它再次增長,那麼我們將研究原因。與此同時,我在該磁盤捲上的空間不足 ,我只需要返回空間。

讓我們來看看縮小它。它將取決於您正在運行的Oracle的版本 以及臨時表空間的設置方式。
Oracle會盡最大努力防止出現任何可怕的錯誤 因此我們只會嘗試命令,如果它們不起作用,我們會以新的方式縮小 。

首先讓我們試着收縮數據文件。如果我們能夠做到這一點,那麼我們就會回到 的空間,我們可以擔心明天爲什麼會增長。

SQL> 
SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M; 
alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M 
* 
ERROR at line 1: 
ORA-03297: file contains used data beyond requested RESIZE value 

根據錯誤消息您可能需要使用不同尺寸 那些比文件的當前站點較小試試這個。我有限制 成功與此。如果臨時表空間 位於文件的開頭並且其大小小於 指定的大小,Oracle將只縮小文件。一些舊的Oracle文檔(他們糾正了這個)說 你可以發出命令,錯誤信息會告訴你你可以縮小的尺寸。當我開始作爲DBA工作時,這是 不正確。你只需猜測並重新運行命令 ,看看它是否工作。

好的。這沒有用。這個怎麼樣。

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M; 

如果你在11克(Maybee在10克太)這就是它!如果它有效,你可能想要 回到前面的命令並給它更多的嘗試。

但是,如果失敗了。如果臨時表空間是安裝數據庫時設置的默認臨時表空間 ,那麼您可能需要做更多的工作 。在這一點上,我通常會重新評估是否真的需要這個空間。所有磁盤空間只需要$ X.XX一個GiB。通常我不希望 在生產時間內進行這樣的更改。這意味着再次在2AM 工作! (不是說我真的反對 在凌晨2點工作 - 這只是...好吧,我也喜歡睡覺。而我的妻子 喜歡在凌晨2點讓我在家裏...不要在凌晨4點在市中心街道漫遊,試着 記得我在3小時前把我的車停在哪裏,我聽說過「遠程辦公」我的網絡連接 將會失敗 - 然後我不得不趕上市中心解決它所有鄉親在 早上顯示使用該數據庫。)

好吧......回到嚴肅的事情...... 如果你要收縮的臨時表空間是默認 臨時表空間,你將有先創建一個新的臨時表空間 ,將其設置爲默認臨時表空間,然後將 刪除舊的默認臨時表空間並重新創建它。後綴 刪除創建的第二個臨時表。

SQL> CREATE TEMPORARY TABLESPACE temp2 
2 TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE 
3 AUTOEXTEND ON NEXT 1M MAXSIZE unlimited 
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; 

Tablespace created. 

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2; 

Database altered. 

SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES; 

Tablespace dropped. 


SQL> CREATE TEMPORARY TABLESPACE temp 
2 TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE 
3 AUTOEXTEND ON NEXT 128M MAXSIZE unlimited 
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; 

Tablespace created. 

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp; 

Database altered. 

SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES; 

Tablespace dropped. 

希望這些東西中的一個會有所幫助!

+0

只是一個說明 - 收縮空間是在11g中引入的,並不適用於10g。感謝您對所有選項進行了非常全面的介紹! –

+1

互聯網上的許多帖子和文章都提示了非常複雜的程序。這是我找到的最簡單的! –

+1

非常感謝您提供清晰準確的解釋和解決方案。這是目前互聯網上最好的一個。 –

0
alter database datafile 'C:\ORA_SERVER\ORADATA\AXAPTA\AX_DATA.ORA' resize 40M; 

如果它不能幫助:

  • 創建新的表空間
  • 切換到新的臨時表空間
  • 等待,直到舊的表將不會被使用
  • 刪除舊的表
5

用於管理tablespa的選項在8i開始的版本中,ces有更好的表現。如果您爲臨時表空間使用適當類型的文件(即本地管理的臨時文件),則尤其如此。

所以,這可能是因爲該命令,它會收縮你的表空間,以128兆那樣簡單......

alter tablespace <your_temp_ts> shrink space keep 128M; 

Oracle的在線文檔是相當不錯的。 Find out more.

編輯

它會出現在OP具有數據庫的早期版本。在早期版本中,我們必須調整個別數據文件的大小。所以,首先找到文件名。一個或其他這些查詢應該這樣做的......

select file_name from dba_data_files where tablespace_name = '<your_temp_ts>' 
/

select file_name from dba_temp_files where tablespace_name = '<your_temp_ts>' 
/

然後使用該路徑在此命令:

alter database datafile '/full/file/path/temp01.dbf' resize 128m 
/
+0

SQL> alter tablespace temp shrink space keep 128M; alter tablespace temp shrink space keep 128M * 錯誤在第1行: ORA-02142:丟失或無效ALTER TABLESPACE選項 –

1

將增加,因爲你有一個需要臨時存儲空間,這可能是由於到笛卡爾產品或大型排序操作。

動態性能視圖V$TEMPSEG_USAGE將有助於診斷原因。

+0

它會在使用後顯示嗎? –

+0

我不這麼認爲。 –

+0

另一個原因可能是大量使用全局臨時表。 –

2

您應該已經編寫了您使用的Oracle版本。您最有可能使用的不是Oracle 11g,這就是爲什麼您無法縮小臨時表空間的原因。

替代方案:

1)alter database tempfile '[your_file]' resize 128M;這可能會失敗
2)刪除並重新創建表空間。如果想要縮小的臨時表空間是您的默認臨時表空間,則可能必須先創建一個新的臨時表空間,將其設置爲默認臨時表空間,然後刪除舊的默認臨時表空間並重新創建它。之後放下創建的第二個臨時表。 3)對於Oracle 9i和更高的你可以只刪除臨時文件(S),並添加

一切都介紹的很詳細here一個新的(S)。


請參閱此鏈接:http://databaseguide.blogspot.com/2008/06/resizing-temporary-tablespace.html
它已經聯繫在一起,但也許你錯過了,所以這裏要再次重申。

0

我不萬一我需要在將來再次回收存儲下探備用臨時打擾...

  1. 從臨時組設置默認爲獨立溫度
  2. 等一會兒,然後調整臨時組的成員的大小
  3. 將默認設置恢復爲臨時組
  4. 等待一會,調整大小獨立臨時。有沒有急於做最後一步