以前的整理哪些情況下的操作會(huì)使用到臨時(shí)表空間
首先我們要明確下哪些情況下的操作會(huì)使用到臨時(shí)表空間:
temp表空間的作用
temp表空間的作用,temp表空間主要是用作需要排序的操作。
臨時(shí)表空間信息
(查詢用戶需要具備dba權(quán)限)
select * from dba_tablespaces
where tablespace_name = 'TEMP';
--自動(dòng)擴(kuò)展字段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語句完成之后,需要檢查記錄的準(zhǔn)確性。
2、盡量不要在視圖中進(jìn)行order by ,這是一個(gè)非常耗費(fèi)資源的操作。
說明
臨時(shí)表空間主要用途是在數(shù)據(jù)庫(kù)進(jìn)行排序運(yùn)算、管理索引、訪問視圖等操作
時(shí)提供臨時(shí)的運(yùn)算空間,當(dāng)運(yùn)算完成之后系統(tǒng)會(huì)自動(dòng)清理。
當(dāng) 里需要用到sort 的時(shí)候oracle創(chuàng)建臨時(shí)表空間, PGA 中 大小不夠時(shí),將會(huì)把數(shù)據(jù)放入臨時(shí)表空間里進(jìn)行排序,同時(shí)如果有異常情況的話,也會(huì)被放入臨時(shí)表空間。
正常來說,在完成 語句、 index 等一些使用 TEMP 表空間的排序操作后, 是會(huì)自動(dòng)釋放掉臨時(shí)段的。
注意這里的釋放,僅僅是將這些空間標(biāo)記為空閑oracle創(chuàng)建臨時(shí)表空間,并可重用,真正占用的磁盤空間并沒有釋放。 所以 Temp 表空間可能會(huì)越來越大。
排序是很耗資源的, Temp 表空間滿了,關(guān)鍵是優(yōu)化你的語句,盡量使排序減少才是上策.
Temp 表空間的操作創(chuàng)建臨時(shí)表空間
create temporary tablespace TEMP
tempfile '/oradata/cc/temp01.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local; --默認(rèn)的是local ,可以不加,另外一種是dictionary(數(shù)據(jù)字典管理)
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$顯示了 的狀態(tài)。
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;
改變臨時(shí)表空間大小
alter database tempfile '/oradata/cc/temp01.dbf' resize 1024M;
擴(kuò)展臨時(shí)表空間方法一、增大臨時(shí)文件大小:
SQL> alter database tempfile ‘/oradata/cc/temp01.dbf’ resize 100m;
方法二、將臨時(shí)數(shù)據(jù)文件設(shè)為自動(dòng)擴(kuò)展:
SQL> alter database tempfile ‘/oradata/cc/temp01.dbf’ autoextend on next 5m maxsize unlimited;
方法三、向臨時(shí)表空間中添加數(shù)據(jù)文件:
SQL> alter tablespace temp add tempfile ‘/oradata/cc/temp02.dbf’ size 100m;
Temp 表空間過大的處理方法
11g的方法更加簡(jiǎn)單快捷,如果是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
.........
關(guān)于用戶這塊是要特別注意的,如果我們將默認(rèn)的 Temp 表空間指向其他的
名稱,那么這些用戶的信息就會(huì)失效。
所以,我們替換時(shí),
要么創(chuàng)建一個(gè)臨時(shí)的Temp 表空間中轉(zhuǎn)一下,這樣切換之后,我們的 temp 空間名稱不變,
要么改變名稱,同時(shí)更新相關(guān)用戶的 temp 表空間。
這里用中轉(zhuǎn)的方法來測(cè)試.
創(chuàng)建中轉(zhuǎn)臨時(shí)表空間
Temp 表空間必須是 的, undo 必須是 的。默認(rèn)情況 下 是 1M。
創(chuàng)建 SQL
SQL>CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE
'/oradata/cc/temp02.dbf' SIZE 10M AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
修改 Temp2 為默認(rèn)臨時(shí)表空間
SQL>alter database default temporary tablespace temp2;
刪除原來臨時(shí)表空間
SQL>drop tablespace temp including contents and datafiles;
重新創(chuàng)建臨時(shí)表空間
SQL>CREATE TEMPORARY TABLESPACE TEMP TEMPFILE
'/oradata/cc/temp02.dbf' SIZE 10M AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
重置缺省臨時(shí)表空間為新建的 temp 表空間
SQL>alter database default temporary tablespace temp;
刪除中轉(zhuǎn)用臨時(shí)表空間
SQL>drop tablespace temp2 including contents and datafiles;
如果有必要,重新指定用戶表空間為重建的臨時(shí)表空間
SQL>alter user dave temporary tablespace temp;
對(duì)臨時(shí)表空間進(jìn)行
11g中針對(duì)臨時(shí)表空間過大的問題推出了方法,使用這種方法可以非常便捷的自動(dòng)化完成縮小臨時(shí)表空間或臨時(shí)文件的目的。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------- --------- --------------- ----------
TEMP 1073741824 248512512 1069547520
視圖是11g中新增加的視圖,使用這個(gè)視圖可以很方便的得到臨時(shí)表空間的使用情況。
當(dāng)排序操作完成, 占用的空間并沒有釋放,僅僅是將它標(biāo)記為空閑,并可重用,可以使用 來釋放沒有使用的空間。
是一個(gè) 的操作,不影響其他的查詢.
使用臨時(shí)表空間的方法縮小臨時(shí)表空間的大小
–將temp表空間收縮為20M
SQL>alter tablespace temp shrink space keep 20M;
或者
SQL> alter tablespace temp shrink space;
Tablespace altered.
操作之前,查詢下大小,可以方便的比較出效果。
select * from dba_temp_free_space;
收縮表空間中具體的臨時(shí)文件
同樣可以作用到具體的臨時(shí)文件
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 ';--不指定大小,自動(dòng)將表空間的臨時(shí)文件縮小到最小可能的大小
更改系統(tǒng)的默認(rèn)臨時(shí)表空間
查詢默認(rèn)臨時(shí)表空間
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
修改默認(rèn)臨時(shí)表空間
alter database default temporary tablespace temp02;
所有用戶的默認(rèn)臨時(shí)表空間都將切換為新的臨時(shí)表空間:
select username,temporary_tablespace,default_tablespace from dba_users;
更改某一用戶的臨時(shí)表空間:
alter user scott temporary tablespace temp02;
刪除臨時(shí)表空間
刪除臨時(shí)表空間的一個(gè)數(shù)據(jù)文件:
alter database tempfile '/oradata/cc/temp01.dbf' drop;
刪除臨時(shí)表空間(徹底刪除):
drop tablespace temp including contents and datafiles cascade constraints;
查看臨時(shí)表空間的使用情況
GV_$視圖必須在sys用戶下才能查詢 ,擁有DBA權(quán)限的用戶也不行,必須sys用戶
GV_$視圖記錄了臨時(shí)表空間的使用大小與未使用的大小
視圖的bytes字段記錄的是臨時(shí)表空間的總大小
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
數(shù)據(jù)文件重命名的步驟:
( 1)將
( 2)在操作系統(tǒng)上重命名
( 3)使用 alter file 更新控制文件
臨時(shí)表空間組概述
10g之前,同一用戶的多個(gè)會(huì)話只可以使用同一個(gè)臨時(shí)表空間,因?yàn)樵诮o定的時(shí)間只有一個(gè)臨時(shí)表空間默認(rèn)給用戶,為了解決這個(gè)潛在的瓶頸,支持臨時(shí)表空間組即包含多個(gè)臨時(shí)表空間的集合。
臨時(shí)表空間組邏輯上就相當(dāng)于一個(gè)臨時(shí)表空間。
操作
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到臨時(shí)表空間組中
SQL>alter tablespace temp1 tablespace group tempgrp;
SQL>alter tablespace temp2 tablespace group tempgrp;
SQL>alter tablespace temp3 tablespace group tempgrp;
啟用臨時(shí)表空間組
SQL>alter database default temporary tablespace tempgrp;
SQL>select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
---------------------------------------------------------
TEMPGRP TEMP1
TEMPGRP TEMP2
TEMPGRP TEMP3
此時(shí)數(shù)據(jù)庫(kù)所有用戶的默認(rèn)臨時(shí)表空間為
SQL>select username,defualt_tablespace,temporary_tablespace from dba_user where username='SCOTT';
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
-------------------------------------------------------
SCOTT USERS TEMPGRP
刪除臨時(shí)表空間組
1.必須先刪除成員
SQL>alter tablespace temp1 tablespace group '';(表示刪除temp1)
SQL>select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
----------------------------------------------------------
TEMPGRP TEMP2
TEMPGRP TEMP3
同理將temp2,temp3刪除
當(dāng)表空間組是數(shù)據(jù)庫(kù)默認(rèn)表空間時(shí),最后一個(gè)成員刪除報(bào)錯(cuò):ORA-10919: group must be have at least one
SQL>alter database default temporary tablespace temp;
此時(shí)再刪除最后一個(gè)成員,臨時(shí)表空間組自動(dòng)消失
SQL>select * from dba_tablespace_groups;
no rows selected
刪除temp1表空間及數(shù)據(jù)文件
SQL>drop temporary tablespace temp1 including contents and datafiles;