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
next 50m maxsize 2048m
create user monitor identified by "lCp_mon1"
default tablespace monitor;
grant connect,resource to monitor;
下面是單執行個體上建立表空間
三步走
create tablespace monitor
datafile '/u01/app/oracle/oradata/testdb/monitor.dbf'
size 100m
autoextend on
next 50m maxsize 20480m
以使用者monitor通過sqldeveloper連接配接庫,執行monitor.sql腳本即可,将表空間名字替換即可USERS->monitor
#####################################
##################################
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;
##############################