以前的整理哪些情況下的操作會使用到臨時表空間
首先我們要明確下哪些情況下的操作會使用到臨時表空間:
temp表空間的作用
temp表空間的作用,temp表空間主要是用作需要排序的操作。
臨時表空間信息
(查詢用戶需要具備dba權限)
select * from dba_tablespaces
where tablespace_name = 'TEMP';
--自動擴展字段autoextendsible(yes/no)
select * from dba_temp_files;
select * from v$tempfile ;
select tablespace_name,file_name,bytes/1024/1024 "file_size(M)",autoextensible from dba_temp_files;
需要說明的是:
1、sql語句完成之后,需要檢查記錄的準確性。
2、盡量不要在視圖中進行order by ,這是一個非常耗費資源的操作。
說明
臨時表空間主要用途是在數據庫進行排序運算、管理索引、訪問視圖等操作
時提供臨時的運算空間,當運算完成之后系統會自動清理。
當 里需要用到sort 的時候oracle創建臨時表空間, PGA 中 大小不夠時,將會把數據放入臨時表空間里進行排序,同時如果有異常情況的話,也會被放入臨時表空間。
正常來說,在完成 語句、 index 等一些使用 TEMP 表空間的排序操作后, 是會自動釋放掉臨時段的。
注意這里的釋放,僅僅是將這些空間標記為空閑oracle創建臨時表空間,并可重用,真正占用的磁盤空間并沒有釋放。 所以 Temp 表空間可能會越來越大。
排序是很耗資源的, Temp 表空間滿了,關鍵是優化你的語句,盡量使排序減少才是上策.
Temp 表空間的操作創建臨時表空間
create temporary tablespace TEMP
tempfile '/oradata/cc/temp01.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local; --默認的是local ,可以不加,另外一種是dictionary(數據字典管理)
You can use ALTER to add a , take a , or bring a , as in the :
SQL>ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/cc/temp02.dbf' SIZE 18M REUSE;
SQL>ALTER TABLESPACE TEMPFILE TEMPFILE OFFLINE;
SQL>ALTER TABLESPACE TEMPFILE TEMPFILE ONLINE;
不可以將 Temp 表空間 ,但是可以將 。V$顯示了 的狀態。
The ALTER can be used to alter .
SQL>ALTER DATABASE TEMPFILE '/oradata/cc/temp02.dbf' OFFLINE;
SQL>ALTER DATABASE TEMPFILE '/oradata/cc/temp02.dbf' ONLINE;
改變臨時表空間大小
alter database tempfile '/oradata/cc/temp01.dbf' resize 1024M;
擴展臨時表空間方法一、增大臨時文件大小:
SQL> alter database tempfile ‘/oradata/cc/temp01.dbf’ resize 100m;
方法二、將臨時數據文件設為自動擴展:
SQL> alter database tempfile ‘/oradata/cc/temp01.dbf’ autoextend on next 5m maxsize unlimited;
方法三、向臨時表空間中添加數據文件:
SQL> alter tablespace temp add tempfile ‘/oradata/cc/temp02.dbf’ size 100m;
Temp 表空間過大的處理方法
11g的方法更加簡單快捷,如果是11g的話,建議使用.
替換 Temp 表空間
查看目前 Temp 表空間的信息
SQL> select name from v$tempfile;
NAME
--------------------------------------------------
/oradata/cc/temp01.dbf
SQL> select username,temporary_tablespace from dba_users;
USERNAME TEMPORARY_TABLESPACE
------------------------ ------------------------------
SYS TEMP
SYSTEM TEMP
UCC TEMP
CC TEMP
.........
關于用戶這塊是要特別注意的,如果我們將默認的 Temp 表空間指向其他的
名稱,那么這些用戶的信息就會失效。
所以,我們替換時,
要么創建一個臨時的Temp 表空間中轉一下,這樣切換之后,我們的 temp 空間名稱不變,
要么改變名稱,同時更新相關用戶的 temp 表空間。
這里用中轉的方法來測試.
創建中轉臨時表空間
Temp 表空間必須是 的, undo 必須是 的。默認情況 下 是 1M。
創建 SQL
SQL>CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE
'/oradata/cc/temp02.dbf' SIZE 10M AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
修改 Temp2 為默認臨時表空間
SQL>alter database default temporary tablespace temp2;
刪除原來臨時表空間
SQL>drop tablespace temp including contents and datafiles;
重新創建臨時表空間
SQL>CREATE TEMPORARY TABLESPACE TEMP TEMPFILE
'/oradata/cc/temp02.dbf' SIZE 10M AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
重置缺省臨時表空間為新建的 temp 表空間
SQL>alter database default temporary tablespace temp;
刪除中轉用臨時表空間
SQL>drop tablespace temp2 including contents and datafiles;
如果有必要,重新指定用戶表空間為重建的臨時表空間
SQL>alter user dave temporary tablespace temp;
對臨時表空間進行
11g中針對臨時表空間過大的問題推出了方法,使用這種方法可以非常便捷的自動化完成縮小臨時表空間或臨時文件的目的。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------- --------- --------------- ----------
TEMP 1073741824 248512512 1069547520
視圖是11g中新增加的視圖,使用這個視圖可以很方便的得到臨時表空間的使用情況。
當排序操作完成, 占用的空間并沒有釋放,僅僅是將它標記為空閑,并可重用,可以使用 來釋放沒有使用的空間。
是一個 的操作,不影響其他的查詢.
使用臨時表空間的方法縮小臨時表空間的大小
–將temp表空間收縮為20M
SQL>alter tablespace temp shrink space keep 20M;
或者
SQL> alter tablespace temp shrink space;
Tablespace altered.
操作之前,查詢下大小,可以方便的比較出效果。
select * from dba_temp_free_space;
收縮表空間中具體的臨時文件
同樣可以作用到具體的臨時文件
SQL> select file#,name,bytes/1024/1024 MB from v$tempfile;
FILE# NAME MB
---------- ---------------------- ----------
1 /oradata/cc/temp01.dbf 1024
SQL> alter tablespace temp shrink tempfile '/oradata/cc/temp01.dbf' keep 100m;
Tablespace altered
SQL> select file#,name,bytes/1024/1024 MB from v$tempfile;
FILE# NAME MB
---------- -------------------- --------------
1 /oradata/cc/temp01.dbf 100.992187
或者
SQL>ALTER TABLESPACE temp SHRINK TEMPFILE
'/oradata/cc/temp01.dbf ';--不指定大小,自動將表空間的臨時文件縮小到最小可能的大小
更改系統的默認臨時表空間
查詢默認臨時表空間
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
修改默認臨時表空間
alter database default temporary tablespace temp02;
所有用戶的默認臨時表空間都將切換為新的臨時表空間:
select username,temporary_tablespace,default_tablespace from dba_users;
更改某一用戶的臨時表空間:
alter user scott temporary tablespace temp02;
刪除臨時表空間
刪除臨時表空間的一個數據文件:
alter database tempfile '/oradata/cc/temp01.dbf' drop;
刪除臨時表空間(徹底刪除):
drop tablespace temp including contents and datafiles cascade constraints;
查看臨時表空間的使用情況
GV_$視圖必須在sys用戶下才能查詢 ,擁有DBA權限的用戶也不行,必須sys用戶
GV_$視圖記錄了臨時表空間的使用大小與未使用的大小
視圖的bytes字段記錄的是臨時表空間的總大小
SELECT temp_used.tablespace_name,
total - used as "Free",
total as "Total",
round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
FROM GV_$TEMP_SPACE_HEADER
GROUP BY tablespace_name) temp_used,
(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
FROM dba_temp_files
GROUP BY tablespace_name) temp_total
WHERE temp_used.tablespace_name = temp_total.tablespace_name
SQL> conn sys/system as sysdba
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as sys@cc AS SYSDBA
SQL> SELECT temp_used.tablespace_name,
2 total - used as "Free",
3 total as "Total",
4 round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
5 FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
6 FROM GV_$TEMP_SPACE_HEADER
7 GROUP BY tablespace_name) temp_used,
8 (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
9 FROM dba_temp_files
10 GROUP BY tablespace_name) temp_total
11 WHERE temp_used.tablespace_name = temp_total.tablespace_name
12 ;
TABLESPACE_NAME Free Total Free percent
------------------------------ ---------- ----------
TEMP 787 1024 76.855
數據文件重命名的步驟:
( 1)將
( 2)在操作系統上重命名
( 3)使用 alter file 更新控制文件
臨時表空間組概述
10g之前,同一用戶的多個會話只可以使用同一個臨時表空間,因為在給定的時間只有一個臨時表空間默認給用戶,為了解決這個潛在的瓶頸,支持臨時表空間組即包含多個臨時表空間的集合。
臨時表空間組邏輯上就相當于一個臨時表空間。
操作
SQL>create temporary tablespace temp1 tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' size 10M;
SQL>create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' size 10M;
SQL>create temporary tablespace temp3 tempfile '/u01/app/oracle/oradata/orcl/temp03.dbf' size 10M;
SQL>select name from v$tempfile;
NAME
----------------------------------------------------
/u01/app/oracle/oradata/orcl/temp01.dbf
/u01/app/oracle/oradata/orcl/temp02.dbf
/u01/app/oracle/oradata/orcl/temp01.dbf
SQL>select tablespace_name from dba_tablespaces where contents='TEMPORARY';
TABLESPACE_NAME
-------------------------------------------------------------
TEMP1
TEMP2
TEMP3
添加temp1,temp2,temp3到臨時表空間組中
SQL>alter tablespace temp1 tablespace group tempgrp;
SQL>alter tablespace temp2 tablespace group tempgrp;
SQL>alter tablespace temp3 tablespace group tempgrp;
啟用臨時表空間組
SQL>alter database default temporary tablespace tempgrp;
SQL>select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
---------------------------------------------------------
TEMPGRP TEMP1
TEMPGRP TEMP2
TEMPGRP TEMP3
此時數據庫所有用戶的默認臨時表空間為
SQL>select username,defualt_tablespace,temporary_tablespace from dba_user where username='SCOTT';
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
-------------------------------------------------------
SCOTT USERS TEMPGRP
刪除臨時表空間組
1.必須先刪除成員
SQL>alter tablespace temp1 tablespace group '';(表示刪除temp1)
SQL>select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
----------------------------------------------------------
TEMPGRP TEMP2
TEMPGRP TEMP3
同理將temp2,temp3刪除
當表空間組是數據庫默認表空間時,最后一個成員刪除報錯:ORA-10919: group must be have at least one
SQL>alter database default temporary tablespace temp;
此時再刪除最后一個成員,臨時表空間組自動消失
SQL>select * from dba_tablespace_groups;
no rows selected
刪除temp1表空間及數據文件
SQL>drop temporary tablespace temp1 including contents and datafiles;