在Oracle數據庫中;一個表空間只屬於一個數據庫使用;而一個數據庫可以擁有多個表空間。屬於"一對多"的關系
我們對照着mysql來理解.
1、Oracle有表空間,mysql沒有表空間 2、Oracle提供的Sql Plus登錄 3、MySQL在一個實例中可以創建多個數據庫,但Oracle在一個實例中就只有一個數據庫,但是一個oracle一個數據庫對應多個實例,用實例sid來區分。 請看我的一篇 https://www.cnblogs.com/aozhejin/p/15859979.html 4、mysql是先建實例,后建庫,oracle是先建庫,后建實例(看看下面的模型) mysql--->實例1---》a庫---》a1表 a1表 b庫--->b1表 b2表 oracle---->數據庫a--->a實例--->a表空間----》a1表 a2表 b表空間---->b1表 b2表 b實例--->c表空間----》c1表 c2表 d表空間---->d1表 d2表
下面主要的幾個表空間.
1)system表空間 每個Oracle數據庫都會有SYSTEM表空間,而且SYSTEM表空間總是要保持在聯機模式下,因為其包含了數據庫運行所要求的基本信息,
如:數據字典、聯機求助機制、所有回退段、臨時段、所有的用戶數據庫實體、其它ORACLE軟件產品要求的表等等。 2)SYSAUX表空間 作為SYSTEM表空間的輔助表空間,主要存放一些其他的 metadata 組件,如 OEM,Streams 等會默認存放在 SYSAUX 表空間里。 3)臨時表空間 臨時表空間是用來管理數據庫排序操作以及用於存儲臨時表、中間排序結果等臨時對象,當ORACLE里需要用到SORT的時候,
並且當PGA中sort_area_size大小不夠時,將會把數據放入臨時表空間里進行排序。像數據庫中一些操作:
CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN
等都可能會用到臨時表空間。當操作完成后,系統會自動清理臨時表空間中的臨時對象,自動釋放臨時段。 4)UNDO表空間 undo表空間中會自動分配undo段,這些undo段用來保存事務中的DML語句的undo信息,也就是來保存數據在被修改之前的值。在rollback,實例恢復(前滾),
一致性讀CR塊的構造時會使用到undo信息。由於undo的引入,從而Oracle的select語句實現一致性讀時,不需要任何鎖。 5)USERS表空間 創建用戶必須為其指定表空間,如果沒有顯性指定默認表空間,則指定為users表空間,此用戶所有信息都會放入到users表空間中。 6)業務表空間(自建)
小結: 我們可以認為主要就是四個部分組成 一種是系統表空間、臨時表空間、日志表空間、業務表空間,這個應該沒有太多疑問。
由於臨時表空間是內存中的,所以我們通過pl/sql在查詢時候也看不到具體的表。
一、臨時表空間作用一:
1、oracle臨時表空間主要用來做查詢和存放一些緩沖區數據。 2、臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序。 3、重啟數據庫可以釋放臨時表空間,如果不能重啟實例,而一直保持問題sql語句的執行,temp表空間會一直增長。直到耗盡硬盤空間。
臨時表空間對應的文件就是臨時文件temp file,在Oracle中可以使用dba_temp_files視圖進行查詢。
SQL> col file_name for a50;
SQL> select file_name, bytes/1024/1024, AUTOEXTENSIBLE from dba_temp_files;
FILE_NAME BYTES/1024/1024 AUTOEXTEN
--------------- ---------
/u01/oracle/oradata/prd/prd_temp01.dbf 10337 YES
/u01/oracle/oradata/fp/fp_temp01.dbf 50 YES
//這里兩個庫,分別指定了表空間
通常,在系統創建的時候,Oracle會創建臨時表空間Temp作為系統默認臨時表空間Temporary Tablespace。而且,通常Temp表空間都是設置為支持自動拓展的。
二、 臨時表空間作用二:
索引create或rebuild; Order by 或 group by; Distinct 操作; Union 或 intersect 或 minus; Sort-merge joins; analyze。
表空間從類型上有若干分類的方式,一種是按照“文件file”的大小,區別為small file tablespace和big file tablespace。另一種是按照表空間用途而定的。
此種分類方法可以將表空間划分為持久化表空間(Permanent Tablespace)、Undo表空間和臨時表空間(Temporary Tablespace)。
Temporary臨時表空間是oracle一種內部空間調控的產物。根據Oracle官方文檔中的介紹,Temporary表空間主要是針對session會話自身的操作使用的。
當一個會話通過SQL或者PL/SQL將數據集合獲取,進行大面積的sort或者group by操作時,會話會嚴重的消耗PGA資源。PGA是針對會話自身特有信息的一塊內存區域,
用於保存會話自身特有、無法與其他會話共享的信息。如果數據集很大,這樣對內存PGA的資源消耗就會很大。Oracle在這個時候,就會采用類似操作系統虛擬內存技術的方法,
從硬盤上借一塊空間給PGA置換使用,緩解PGA的不足。
在使用Temporary表空間的時候,是系統自動完成的臨時段segment對象創建和銷毀。這個過程對用戶會話而言是透明的。
三、關於臨時表空間的語句:
1、查詢TEMP表空間使用情況
SQL> set pagesize 0
SQL> set line 9999
SQL> 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 11 WHERE temp_used.tablespace_name = temp_total.tablespace_name;
TEMP 0 10337 0
FP_TEMP 49 50 98
2、更改系統的默認臨時表空間
--查詢默認臨時表空間
SQL> select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
--修改默認臨時表空間
alter database default temporary tablespace temp1;
3、改變臨時表空間大小 alter database tempfile /u01/oracle/oradata/fp/fp_temp01.dbf' resize 100M;
或
alter database tempfile 4 autoextend on next 100M maxsize 1000M;
4、更改某一用戶的臨時表空間:
alter user scott temporary tablespace temp3;
3、擴展臨時表空間: 方法一、增大臨時文件大小: SQL> alter database tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' resize 100m; 方法二、將臨時數據文件設為自動擴展: SQL> alter database tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf’ autoextend on next 5m maxsize unlimited; 方法三、向臨時表空間中添加數據文件: SQL> alter tablespace temp add tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf’ size 100m; 5、創建臨時表空間: create temporary tablespace temp01 tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' size 10M; 6、更改系統的默認臨時表空間: 查詢默認臨時表空間 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; 7、刪除臨時表空間 刪除臨時表空間的一個數據文件: alter database tempfile 'C:ORADATAORCLTEMP03.DBF' drop; 刪除臨時表空間(徹底刪除): drop tablespace temp including contents and datafiles cascade constraints; 8、查看臨時表空間的使用情況(GV_$TEMP_SPACE_HEADER視圖必須在sys用戶下才能查詢) GV_$TEMP_SPACE_HEADER視圖記錄了臨時表空間的使用大小與未使用的大小 dba_temp_files視圖的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 89、查找消耗資源比較的sql語句 Select se.username, se.sid, su.extents, su.blocks * to_number(rtrim(p.value)) as Space, tablespace, segtype, sql_text from v$sort_usage su, v$parameter p, v$session se, v$sql s where p.name = 'db_block_size' and su.session_addr = se.saddr and s.hash_value = su.sqlhash and s.address = su.sqladdr order by se.username, se.sid 10、查看當前臨時表空間使用大小與正在占用臨時表空間的sql語句 select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text from v$sort_usage sort, v$session sess, v$sql sql where sort.SESSION_ADDR = sess.SADDR and sql.ADDRESS = sess.SQL_ADDRESS order by blocks desc; 11、臨時表空間組介紹 1)創建臨時表空間組: create temporary tablespace tempts1 tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' size 2M tablespace group group1; create temporary tablespace tempts2 tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' size 2M tablespace group group2; 2)查詢臨時表空間組:dba_tablespace_groups視圖 select * from dba_tablespace_groups; GROUP_NAME TABLESPACE_NAME ------------------------------ ------------------------------ GROUP1 TEMPTS1 GROUP2 TEMPTS2 3)將表空間從一個臨時表空間組移動到另外一個臨時表空間組: alter tablespace tempts1 tablespace group GROUP2 ; select * from dba_tablespace_groups; GROUP_NAME TABLESPACE_NAME ------------------------------ ------------------------------ GROUP2 TEMPTS1 GROUP2 TEMPTS2 4)把臨時表空間組指定給用戶 alter user scott temporary tablespace GROUP2; 5)在數據庫級設置臨時表空間 alter database default temporary tablespace GROUP2; alter database orcl default temporary tablespace GROUP2; 6)刪除臨時表空間組 (刪除組成臨時表空間組的所有臨時表空間) drop tablespace tempts1 including contents and datafiles; select * from dba_tablespace_groups; GROUP_NAME TABLESPACE_NAME ------------------------------ ------------------------------ GROUP2 TEMPTS2 drop tablespace tempts2 including contents and datafiles; select * from dba_tablespace_groups; GROUP_NAME TABLESPACE_NAME 12、對臨時表空間進行shrink(11g新增的功能) 將temp表空間收縮為20M alter tablespace temp02 shrink space keep 20M; 自動將表空間的臨時文件縮小到最小可能的大小 ALTER TABLESPACE temp SHRINK TEMPFILE ’/u01/oracle/oradata/fp/fp_temp01.dbf’;