oracle用戶與表空間關系
用戶=商家
表=商品
表空間=倉庫
1. 1個商家能有很多商品,1個商品只能屬於一個商家
2. 1個商品可以放到倉庫A,也可以放到倉庫B,但不能同時放入A和B
3. 倉庫不屬於任何商家
4. 商家都有一個默認的倉庫,如果不指定具體倉庫,商品則放到默認的倉庫中
oracle中用戶的所有數據都是存放在表空間中的,很多個用戶可以共用一個表空間,也可以指定一個用戶只用某一個表空間。
表空間:創建表空間會在物理磁盤上建立一個數據文件,作為數據庫對象(用戶、表、存儲過程等等)的物理存儲空間;
用戶:創建用戶必須為其指定表空間,如果沒有顯性指定默認表空間,則指定為users表空間;創建用戶后,可以在用戶上,創建表、存儲過程等等其他數據庫對象;
表:是數據記錄的集合;
創建過程: 表空間--->用戶--->表;
所屬關系: 表空間 包含 用戶 包含 表;
http://www.cnblogs.com/cici-new/archive/2012/12/25/2831740.html
1.首先是ORACLE的整體結構。
oracle中的一個數據庫就是一個實例.
oracle的一個用戶就是一個Schema(即方案).
oracle的結構是===
實例->用戶->表(用戶屬於數據庫實例,表屬於某個用戶)
所以在oracle下建立 建表空間,建用戶,設置用戶的默認表空間,在用戶下建表;
--創建數據表空間
create tablespace CICI
logging
datafile 'D:\oraclexe\app\oracle\oradata\CICI\CICI.DBF'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
--創建用戶並指定表空間
CREATE USER cici IDENTIFIED BY cici
PROFILE DEFAULT
DEFAULT TABLESPACE CICI
ACCOUNT UNLOCK;
-- 為用戶賦予權限
GRANT connect, resource TO cici;
grant create session to cici;
-- 登錄用戶
sql>conn
請輸入用戶名 cici
請輸入密碼 XXXXXX
---建立表
create table aa(name varchar2(100),age number(4));
insert into aa values('wo',29);
-- 查詢表
select * from cici.A;
select * from session_privs;
查看系統權限和對象權限
select * from dba_sys_privs;
select * from dba_tab_privs;
改自己的密碼,不需要dba的權限,但要使用舊密碼進行驗證,用以下語句即可
alter user hr identified by 123456 replace zxcasd;
select table_name from user_tables;
desc jobs
set pagesize 200
select * from jobs;
desc locations
set linesize 200
select * from locations;
############################
rac上創建表空間
create tablespace MONITOR datafile '+DATA1/baoka/datafile/monitor.dbf' size 4096m autoextend on;
select * from v$tablespace;
select * from v$datafile;
drop tablespace MONITOR including contents and datafiles;
create tablespace monitor logging
datafile '+DATA1/baoka/datafile/monitor.dbf'
size 100m
autoextend on
next 50m maxsize 2048m
extent management local;
select * from v$tablespace;
select * from v$datafile;
create user monitor identified by "lCp_mon1"
default tablespace monitor;
grant connect,resource to monitor;
############################
下面是單實例上創建表空間
select * from v$tablespace;
select * from v$datafile;
三步走
create tablespace monitor
logging
datafile '/u01/app/oracle/oradata/testdb/monitor.dbf'
size 100m
autoextend on
next 50m maxsize 20480m
extent management local;
create user monitor identified by "lCp_mon1"
default tablespace monitor;
grant connect,resource to monitor;
以用戶monitor通過sqldeveloper連接庫,執行monitor.sql腳本即可,將表空間名字替換即可USERS->monitor
#####################################
查看當前會話的session ID 有如下三種方法:
desc v$mystat
select * from v$mystat where rownum=1;
select userenv('sid') from dual;
userenv('sessionid') 返回的是session audit id.其對應v$session 的audsid字段。
在session 連接到數據庫的時候,會從SYS.AUDSES$序列中獲取一個audid 分配給session。
select sid from v$session where audsid=userenv('sessionid');
這里返回了3個值,我們直接查看userenv('sessionid') 值:
select userenv('sessionid') from dual;
對於internal用戶(’/as sysoper’ 和 ‘/as sysdba’)和后台進程,其對應的AUDID 為0.
在Oracle 10g中,如果AUDID的值為0,表明是internal 用戶,如果AUDID 值是4294967295,那么就表明是用SYS 用戶直接連接的。
我們這里返回三個結果是把所有SYS 用戶的session都返回了,所以這種方法有時的准確性並不高。
################################
sessions=(1.1*process+5)
show parameter processes
show parameter sessions
alter system set processes=1000 scope=spfile;
shutdown immediate;
startup;
查詢數據庫當前進程的連接數:
select count(*) from v$process;
查看數據庫當前會話的連接數:
select count(*) from v$session;
查看數據庫的並發連接數:
select count(*) from v$session where status='ACTIVE';
查看當前數據庫建立的會話情況:
select sid,serial#,username,program,machine,status from v$session;
查詢數據庫允許的最大連接數:
select value from v$parameter where name = 'processes';
##################################
undo表空間管理
你可以建立多個undo表空間,但是當前在用undo表空間只能是其中一個。rac除外
只能是一個,但是可以新建另外一個,把原來的失效,再指向新UNDO表空間
修改默認的undo表空間為新創建的
show parameter undo;
alter system set undo_tablespace=undo1;
undo表空間用於存放undo數據,當執行DML操作(insert、update、delete)時,oracle會將這些操作的舊數據寫入到undo段。
知道updata語句執行會產生undo信息,將老的數據保存到undo表空間中。
那么select語句會產生undo信息嗎?產生什么信息呢?select會將什么保存的表空間中呢?
insert呢?又會產生undo信息嗎?將什么保存到undo表空間呢?
新建一個表,插入十萬數據,執行:
sql>select addr, used_ublk from v$transaction;
ADDR USED_UBLK
-------- ----------
3B7D6984 87
產生87塊,產生undo信息了嗎?表是新建的,沒有任何信息,也就是沒有老的數據,那么會產生undo信息嗎?在undo表空間存入什么呢?
還原段用途:
事務處理回退——當某事務處理修改表中某行時,被修改的列的舊映像(要還原的數據)將存儲在還原段中。如果將該事務處理回退,則Oracle 服務器通過將還原段中的值寫回到該行來恢復原始值。
事務處理恢復——如果例程在事務處理正在進行時失敗,那么Oracle 服務器需要在數據庫再次打開時還原所有未提交的更改。這種回退操作是事務處理恢復的一部分。之所以有可能恢復事務處理,原因在於對還原段所做的更改同樣受重做日志文件的保護。
讀一致性——在事務處理正在進行時,數據庫中的其他用戶不應看到這些事務處理所做的任何未提交更改。此外,也不應從某條語句中看到該語句開始執行后所提交的任何更改。還原段中的舊值(要還原的數據)也可用於為讀者提供給定語句的一致映像。
oracle中undo是用來存放回滾數據的。
撤銷(Undo)數據是反轉DML語句結果所需的信息。撤銷數據通常被稱為“回滾數據”,在過去的Oracle版本中,“回滾數據”和“撤銷數據”可以交替使用,但從 9i版本開始,這兩個術語有所不同:功能相同,但管理方式不同。只要某個事務修改了數據,那么更新前的原有數據就會被寫入一個回滾段或撤銷段。回滾段在 11g版本中依然存在,但從9i版本開始,Oracle數據庫引入了可供選擇的撤銷段。Oracle強烈建議所有數據庫都應當使用撤銷段,回滾段只被保留用於向后兼容 。
undo表空間:
一個數據庫可以存在多個撤銷表空間,但是在任意給定時刻都只能使用一個撤銷表空間。撤銷表空間必須被創建為持久的、本地管理的並且能夠自動擴展分配空間的表空間。
事務與undo段:
在某個事務啟動時,Oracle會為其指派一個撤銷段。任何一個事務都只能受一個撤銷段保護,一個事務生成的撤銷數據無法被分配到多個撤銷段中。
在某個事務更新表和索引數據塊時,回滾該變化所需的信息會被寫入指定撤銷表空間的數據塊。撤銷數據在提交后過期的事實意味着可以采用循環方式使用撤銷段。如果使用原有的、人工管理的回滾段,那么調整的重要環節是控制具體事務分別受哪些回滾段保護。
oracle會將沒有commit或rollback的數據放入undo表空間
update\insert\delete 都會使用undo表空間,
select 應該不會,會使用temp表空間
你不是插入10萬的數據了嗎,在執行 commit或rollback 之前 會使用undo表空間
########################
temp表空間的管理
臨時表空間的主要作用: 索引CREATE或REBUILD; ORDER BY 或 GROUP BY; DISTINCT 操作; UNION 或 INTERSECT 或 MINUS; SORT - MERGE JOINS; ANALYZE.
SELECT
SE.USERNAME,
SE.SID,
SE.SERIAL#,
SE.SQL_ADDRESS,
SE.MACHINE,
SE.PROGRAM,
SU.TABLESPACE,
SU.SEGTYPE,
SU.CONTENTS
FROM V$SESSION SE,
V$SORT_USAGE SU
WHERE SE.SADDR = SU.SESSION_ADDR;
在Oracle數據庫中,當某個事物對數據進行修改時,Oracle首先將數據的原始值保存到一個回退段中。一個事物只能將它的回退信息保存到一個回退段中,而多個並行事物可以使用同一個回退段。
(1)回退段的作用
回退段主要有4個作用,分別是:事物回滾、數據庫恢復、讀一致性、閃回查詢。
--事物回滾:當事物執行失敗或用戶執行回滾操作(rollback)時,Oracle會利用保存在回退段中的信息將數據恢復到原來的值;
--數據庫恢復:當數據庫實例運行失敗,在數據庫重啟恢復時,Oracle先利用重做日志文件的信息對數據庫進行恢復(包括已提交和未提交的事務),再利用回滾段中的信息回滾未提交的事務;
--讀一致性:當一個用戶對數據進行修改時,會預先將其原始值保存到回退段中,這時,如果有其它用戶訪問該數據,則訪問回退段中的信息,使當前用戶未提交的修改其他用戶無法看到,保證了數據的一致性;
--閃回查詢:通過保留在回退段中的信息,用戶可以查詢某個數據在過去某個時刻的狀態
(2)回退段的工作方式
當事務開始時,系統分配給該事物一個回退段,在事務的整個生命周期中,當數據發生改變時,數據的原始值被復制到回退段中。回退段采用循環寫的方式進行工作,當事務寫滿回退段的一個區之后,會接着寫入回退段的下一個區,當所有的區都寫滿后,事務開始循環寫入到第一個區或者分配新的區(datafile為autoextend)。回退段歸用戶sys所有,每個回退段至少包含2個區。
二、回退表空間的管理
(1)創建undo表空間
在Oracle 11g中,創建undo tablespace有2種方法,一種是在創建數據庫時創建undo tablespace,另一種是使用create undo tablespace來創建undo tablespace。undo tablespace用來保存事務的回退信息,用戶不能在其中創建數據庫對象。
我們這里介紹如何使用craete undo tablespace 來創建undo表空間。
--使用create undo tablespace
CREATE [BIGFILE | SMALLFILE]UNDO TABLESPACE tbs_name DATAFILE 'path/filename' SIZE integer [K | M] [REUSE] [AUTOEXTEND] [OFF | ON] NEXT integer[K | M] MAXSIZE [UNLIMITED | integer [K | M] ] [EXTENT MANAGEMENT LOCAL] [AUTOALLOCATE] [RETENTION GUARANTEE | NOGUARANTEE]
(2)修改undo表空間
可以使用alter tablespace修改undo表空間,允許對undo表空間進行如下操作:
--添加undo表空間的數據文件;
--重命名undo表空間的數據文件;
--將undo表空間的數據文件聯機或脫機;
--啟用或禁用保護回退信息在回退段中的保留時間;
例子1、當undo表空間容量不足時,可以考慮增加新的數據文件或改變數據文件的大小
--為undo tablespace添加新的數據文件 alter tablespace undotbs1 add datafile '/home/app/oracle/oradata/orcl/untbs02.dbf' size 50M; --將undo tablespace里面的untbs02.dbf文件擴充為100M alter database datafile '/home/app/oracle/oradata/orcl/untbs02.dbf' resize 100M;
(3)刪除undo表空間
與普通表空間一樣,可以使用drop tablespace來刪除undo表空間,但是不能刪除當前正在使用的undo表空間。如果在undo表空間中含有任何未提交的事務的回退信息,則不能使用drop tablespace來刪除表空間。此外,即使已經使用drop tablespace刪除了undo表空間,在該表空間中也可能存在未過期的回退信息,這樣導致某些查詢所需的回退信息丟失。因此,在刪除時應該注意,不要刪除這樣的undo表空間。
(4)切換undo表空間
在數據庫運行過程中,可以從一個undo表空間切換到另一個undo表空間,由於初始化參數undo_tablespace是一個動態參數,直接修改即可,無需重啟實例,切換方式如下:
ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_name
在以下情況,undo表空間切換會發生錯誤:
--指定的undo表空間不存在;
--指定的表空間不是undo表空間;
--指定的undo表空間正在被其它實例使用;
在完成undo表空間的切換后,任何新的事物的回退信息都會進入新的undo表空間中,如果舊的undo表空間還存在未提交的事務,則舊的undo表空間進入“掛起脫機狀態”,“掛起脫機狀態”的undo表空間不能被新的事務使用,也不能刪除,當前未提交的事務將繼續使用該表空間。當所有事務都提交完成后,舊的undo表空間進入脫機狀態。
例子2、切換undo表空間
--切換undo表空間
--實驗目的:
-- 1.學會切換undo表空間
-- 2.學會刪除undo表空間 12:40:16 SQL> show parameter undo_tablespace --【窗口1】查看當前undo表空間 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_tablespace string UNDOTBS1 12:45:59 SQL> insert into dept values(50,'a','b'); --【窗口1】執行一條insert語句,且不提交 1 row inserted SQL> alter system set undo_tablespace = UNDOTNS2; --【窗口2】切換undo表空間 System altered SQL> show parameter undo_tablespace; --【窗口2】查看新的表空間 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_tablespace string UNDOTNS2 SQL> drop tablespace undotbs1 including contents and datafiles; --【窗口2】刪除舊的表空間,報錯,提示舊的表空間正在使用 ORA-30013: undo tablespace 'UNDOTBS1' is currently in use 12:53:02 SQL> commit; --【窗口1】提交事務 SQL> drop tablespace undotbs1 including contents and datafiles; --【窗口2】過一段時間之后,成功刪除 Tablespace dropped
(5)回退信息保留時間
前面我們講了回退信息的4個作用,當我們提交了事務之后,回退信息對於事務回滾以及數據庫恢復已經不再起作用。但是,對於一個長事務而言,具有讀一致性的作用,保證查詢到的信息一直是舊的信息。此外,數據庫的各種閃回操作的實現也需要回退段中的信息。Oracle根據undo表空間的大小以及事物量的多少自動調整回退信息的保留時間,可通過調整初始化參數undo_retention設置回退信息在回退段中的保留時間:
-- 將回退信息的保留時間設置為1800s
SQL > ALTER SYSTEM SET UNDO_RETENTION = 1800 ;
需要注意的是,undo_retention是Oracle的一個”軟設置“,這個”軟設置“如何理解呢?例如,當用戶將UNDO_RETENTION參數設置為1800s后,Oracle會盡量的將回退信息保存1800s,但是,在這個過程中,如果回退表空間不夠用了,新的回退信息依然會將未達到1800s的回退信息覆蓋。
為了保證長時間的查詢的讀一致性以及各種閃回操作,我們也可以指定回退信息必須保留到undo_retention規定的時間,通過啟用undo表空間的retention guarantee特性,保證只有過期(已提交且達到undo_retention設定的值)的數據才會被覆蓋,即使undo表空間容量已經不足,也不會覆蓋未過期的回退信息。
--啟用retention_guarantee SQL > ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
三、查詢undo表空間
與undo表空間相關的數據字典如下:
| 數據字典 | 解釋 |
| v$undostat | 包含所有undo表空間的統計信息,用於對undo表空間進行監控和調整。 通過該視圖,可以估計當前undo表空間的大小,Oracle利用該視圖完成對回退信息的自動管理,該視圖數據是有最近4天內,每10分鍾產生一條統計記錄構成的。 |
| v$rollstat | 包含undo表空間中回退段的性能統計信息 |
| v$transaction | 包含事務所使用的回退段信息 |
| dba_undo_extents | 包含undo表空間中區的大小與狀態信息 |
| dba_hist_undostat | 包含v$undostat的快照,主要是4天前的統計信息 |
例子3、查詢undo表空間中回退信息的當前狀態
SQL> select tablespace_name,segment_name,extent_id,status from dba_undo_extents; TABLESPACE_NAME SEGMENT_NAME EXTENT_ID STATUS ------------------------------ ------------------------------ ---------- --------- UNDOTBS3 _SYSSMU10_968665341$ 0 UNEXPIRED UNDOTBS3 _SYSSMU10_968665341$ 1 EXPIRED UNDOTBS3 _SYSSMU9_3484649867$ 0 UNEXPIRED UNDOTBS3 _SYSSMU9_3484649867$ 1 EXPIRED ... ... ... ...
undo表空間中區的狀態一共有3種:EXPIRED、UNEXPIRED、ACTIVE。
--EXPIRED:表示該回退信息對應的事務已經提交,保存時間超過保留區;
--UNEXPIRED:表示該回退信息對應的事務已經提交,保存時間沒有超過保留區;
--ACTIVE:表示回退信息對應的事務還沒有提交,該區還在使用;

