[英]How to shrink temp tablespace in oracle?
我們如何在oracle中縮小臨時表空間? 並且為什么它增加到高達25 GB,因為數據庫中只有一個用於應用程序的模式,數據表空間大小為2 GB,索引表空間大小為1 GB。
哦,我的天啊! 看看我的臨時表空間的大小! 或者......如何縮小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克(也許在10克)這就是它! 如果它有效,您可能需要返回上一個命令並再嘗試一下。
但是,如果失敗了怎么辦? 如果臨時表空間是安裝數據庫時設置的默認臨時表,那么您可能需要做更多的工作。 在這一點上,我通常會重新評估我是否真的需要這個空間。 所有磁盤空間只需$ X.XX $ GiB。 通常我不希望在生產時間內進行這樣的更改。 這意味着再次在凌晨2點工作! (並不是說我真的反對在凌晨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.
希望其中一件事能有所幫助!
管理表空間的選項比以8i開頭的版本要好得多。 如果您使用適當類型的文件用於臨時表空間(即本地管理的臨時文件),則尤其如此。
所以,它可以像這個命令一樣簡單,它會將你的表空間縮小到128兆...
alter tablespace <your_temp_ts> shrink space keep 128M;
Oracle在線文檔非常好。 了解更多。
編輯
看來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
/
您應該編寫您使用的Oracle版本。 您最有可能使用除Oracle 11g之外的其他內容,這就是您無法縮小臨時表空間的原因。
備擇方案:
1) alter database tempfile '[your_file]' resize 128M;
這可能會失敗
2)刪除並重新創建表空間。 如果要縮小的臨時表空間是默認的臨時表空間,則可能必須先創建一個新的臨時表空間,將其設置為默認的臨時表空間,然后刪除舊的默認臨時表空間並重新創建它。 然后刪除創建的第二個臨時表。 3)對於Oracle 9i及更高版本,您可以刪除臨時文件並添加一個新文件
請參閱此鏈接: http : //databaseguide.blogspot.com/2008/06/resizing-temporary-tablespace.html
它已經鏈接了,但也許你錯過了它,所以這里又是它。
它將會增加,因為您需要臨時存儲空間,可能是由於笛卡爾積或大型排序操作。
動態性能視圖V$TEMPSEG_USAGE
將有助於診斷原因。
alter database datafile 'C:\ORA_SERVER\ORADATA\AXAPTA\AX_DATA.ORA' resize 40M;
如果它沒有幫助:
我不打算放棄備用溫度以防萬一我將來需要再次收回存儲空間...
臨時表空間用於數據庫排序和連接操作以及用於存儲全局臨時表。 它可能會在一段時間內增大,因此我們需要重新創建臨時表空間或縮小它以釋放未使用的空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.