1. 程式人生 > >oracle 使用者與表空間關係

oracle 使用者與表空間關係

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;