oracle用戶與表空間關(guān)系
用戶=商家
表=商品
表空間=倉(cāng)庫(kù)
1. 1個(gè)商家能有很多商品,1個(gè)商品只能屬于一個(gè)商家
2. 1個(gè)商品可以放到倉(cāng)庫(kù)A,也可以放到倉(cāng)庫(kù)B,但不能同時(shí)放入A和B
3. 倉(cāng)庫(kù)不屬于任何商家
4. 商家都有一個(gè)默認(rèn)的倉(cāng)庫(kù),如果不指定具體倉(cāng)庫(kù),商品則放到默認(rèn)的倉(cāng)庫(kù)中
oracle中用戶的所有數(shù)據(jù)都是存放在表空間中的,很多個(gè)用戶可以共用一個(gè)表空間,也可以指定一個(gè)用戶只用某一個(gè)表空間。
表空間:創(chuàng)建表空間會(huì)在物理磁盤上建立一個(gè)數(shù)據(jù)文件,作為數(shù)據(jù)庫(kù)對(duì)象(用戶、表、存儲(chǔ)過(guò)程等等)的物理存儲(chǔ)空間;
用戶:創(chuàng)建用戶必須為其指定表空間,如果沒(méi)有顯性指定默認(rèn)表空間,則指定為users表空間;創(chuàng)建用戶后,可以在用戶上,創(chuàng)建表、存儲(chǔ)過(guò)程等等其他數(shù)據(jù)庫(kù)對(duì)象;
表:是數(shù)據(jù)記錄的集合;
創(chuàng)建過(guò)程: 表空間--->用戶--->表;
所屬關(guān)系: 表空間 包含 用戶 包含 表;
1.首先是ORACLE的整體結(jié)構(gòu)。
oracle中的一個(gè)數(shù)據(jù)庫(kù)就是一個(gè)實(shí)例.
oracle的一個(gè)用戶就是一個(gè)Schema(即方案).
oracle的結(jié)構(gòu)是===
實(shí)例->用戶->表(用戶屬于數(shù)據(jù)庫(kù)實(shí)例,表屬于某個(gè)用戶)
所以在oracle下建立 建表空間,建用戶,設(shè)置用戶的默認(rèn)表空間,在用戶下建表;
--創(chuàng)建數(shù)據(jù)表空間
create tablespace CICI
logging
datafile 'D:\oraclexe\app\oracle\oradata\CICI\CICI.DBF'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
--創(chuàng)建用戶并指定表空間
CREATE USER cici IDENTIFIED BY cici
PROFILE DEFAULT
DEFAULT TABLESPACE CICI?
ACCOUNT UNLOCK;
-- 為用戶賦予權(quán)限
GRANT connect, resource TO cici;
grant create session to cici;
-- 登錄用戶
sql>conn
請(qǐng)輸入用戶名 cici
請(qǐng)輸入密碼 XXXXXX
---建立表
create table aa(name varchar2(100),age number(4));
insert into aa values('wo',29);
-- 查詢表
select * from cici.A;
select * from session_privs;
查看系統(tǒng)權(quán)限和對(duì)象權(quán)限
select * from dba_sys_privs;
select * from dba_tab_privs;
改自己的密碼,不需要dba的權(quán)限,但要使用舊密碼進(jìn)行驗(yàn)證,用以下語(yǔ)句即可
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上創(chuàng)建表空間
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;
############################
下面是單實(shí)例上創(chuàng)建表空間
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通過(guò)sqldeveloper連接庫(kù),執(zhí)行monitor.sql腳本即可,將表空間名字替換即可USERS->monitor
#####################################
查看當(dāng)前會(huì)話的session? ID 有如下三種方法:
desc v$mystat
select * from v$mystat where rownum=1;
select userenv('sid') from dual;
userenv('sessionid') 返回的是session audit id.其對(duì)應(yīng)v$session 的audsid字段。
在session 連接到數(shù)據(jù)庫(kù)的時(shí)候,會(huì)從SYS.AUDSES$序列中獲取一個(gè)audid 分配給session。
select sid from v$session where audsid=userenv('sessionid');?
這里返回了3個(gè)值,我們直接查看userenv('sessionid')? 值:
select userenv('sessionid') from dual;
對(duì)于internal用戶(’/as sysoper’ 和 ‘/as sysdba’)和后臺(tái)進(jìn)程,其對(duì)應(yīng)的AUDID 為0.?
在Oracle 10g中,如果AUDID的值為0,表明是internal 用戶,如果AUDID 值是4294967295,那么就表明是用SYS 用戶直接連接的。?
我們這里返回三個(gè)結(jié)果是把所有SYS 用戶的session都返回了,所以這種方法有時(shí)的準(zhǔn)確性并不高。
################################
sessions=(1.1*process+5)
show parameter processes
show parameter sessions
alter system set processes=1000 scope=spfile;
shutdown immediate;
startup;
查詢數(shù)據(jù)庫(kù)當(dāng)前進(jìn)程的連接數(shù):
select count(*) from v$process;
查看數(shù)據(jù)庫(kù)當(dāng)前會(huì)話的連接數(shù):
select count(*) from v$session;
查看數(shù)據(jù)庫(kù)的并發(fā)連接數(shù):
select count(*) from v$session where status='ACTIVE';
查看當(dāng)前數(shù)據(jù)庫(kù)建立的會(huì)話情況:
select sid,serial#,username,program,machine,status from v$session;
查詢數(shù)據(jù)庫(kù)允許的最大連接數(shù):
select value from v$parameter where name = 'processes';
##################################
undo表空間管理
你可以建立多個(gè)undo表空間,但是當(dāng)前在用undo表空間只能是其中一個(gè)。rac除外
只能是一個(gè),但是可以新建另外一個(gè),把原來(lái)的失效,再指向新UNDO表空間
修改默認(rèn)的undo表空間為新創(chuàng)建的
show parameter undo;
alter system set undo_tablespace=undo1;
undo表空間用于存放undo數(shù)據(jù),當(dāng)執(zhí)行DML操作(insert、update、delete)時(shí),oracle會(huì)將這些操作的舊數(shù)據(jù)寫入到undo段。
知道updata語(yǔ)句執(zhí)行會(huì)產(chǎn)生undo信息,將老的數(shù)據(jù)保存到undo表空間中。
那么select語(yǔ)句會(huì)產(chǎn)生undo信息嗎?產(chǎn)生什么信息呢?select會(huì)將什么保存的表空間中呢?
insert呢?又會(huì)產(chǎn)生undo信息嗎?將什么保存到undo表空間呢?
新建一個(gè)表,插入十萬(wàn)數(shù)據(jù),執(zhí)行:
sql>select addr, used_ublk from v$transaction;
ADDR USED_UBLK
-------- ----------
3B7D6984 87
產(chǎn)生87塊,產(chǎn)生undo信息了嗎?表是新建的,沒(méi)有任何信息,也就是沒(méi)有老的數(shù)據(jù),那么會(huì)產(chǎn)生undo信息嗎?在undo表空間存入什么呢?
還原段用途:
事務(wù)處理回退——當(dāng)某事務(wù)處理修改表中某行時(shí),被修改的列的舊映像(要還原的數(shù)據(jù))將存儲(chǔ)在還原段中。如果將該事務(wù)處理回退,則Oracle 服務(wù)器通過(guò)將還原段中的值寫回到該行來(lái)恢復(fù)原始值。
事務(wù)處理恢復(fù)——如果例程在事務(wù)處理正在進(jìn)行時(shí)失敗,那么Oracle 服務(wù)器需要在數(shù)據(jù)庫(kù)再次打開(kāi)時(shí)還原所有未提交的更改。這種回退操作是事務(wù)處理恢復(fù)的一部分。之所以有可能恢復(fù)事務(wù)處理,原因在于對(duì)還原段所做的更改同樣受重做日志文件的保護(hù)。
讀一致性——在事務(wù)處理正在進(jìn)行時(shí),數(shù)據(jù)庫(kù)中的其他用戶不應(yīng)看到這些事務(wù)處理所做的任何未提交更改。此外,也不應(yīng)從某條語(yǔ)句中看到該語(yǔ)句開(kāi)始執(zhí)行后所提交的任何更改。還原段中的舊值(要還原的數(shù)據(jù))也可用于為讀者提供給定語(yǔ)句的一致映像。
oracle中undo是用來(lái)存放回滾數(shù)據(jù)的。
撤銷(Undo)數(shù)據(jù)是反轉(zhuǎn)DML語(yǔ)句結(jié)果所需的信息。撤銷數(shù)據(jù)通常被稱為“回滾數(shù)據(jù)”,在過(guò)去的Oracle版本中,“回滾數(shù)據(jù)”和“撤銷數(shù)據(jù)”可以交替使用,但從 9i版本開(kāi)始,這兩個(gè)術(shù)語(yǔ)有所不同:功能相同,但管理方式不同。只要某個(gè)事務(wù)修改了數(shù)據(jù),那么更新前的原有數(shù)據(jù)就會(huì)被寫入一個(gè)回滾段或撤銷段?;貪L段在 11g版本中依然存在,但從9i版本開(kāi)始,Oracle數(shù)據(jù)庫(kù)引入了可供選擇的撤銷段。Oracle強(qiáng)烈建議所有數(shù)據(jù)庫(kù)都應(yīng)當(dāng)使用撤銷段,回滾段只被保留用于向后兼容 。
undo表空間:
一個(gè)數(shù)據(jù)庫(kù)可以存在多個(gè)撤銷表空間,但是在任意給定時(shí)刻都只能使用一個(gè)撤銷表空間。撤銷表空間必須被創(chuàng)建為持久的、本地管理的并且能夠自動(dòng)擴(kuò)展分配空間的表空間。
事務(wù)與undo段:
在某個(gè)事務(wù)啟動(dòng)時(shí),Oracle會(huì)為其指派一個(gè)撤銷段。任何一個(gè)事務(wù)都只能受一個(gè)撤銷段保護(hù),一個(gè)事務(wù)生成的撤銷數(shù)據(jù)無(wú)法被分配到多個(gè)撤銷段中。
在某個(gè)事務(wù)更新表和索引數(shù)據(jù)塊時(shí),回滾該變化所需的信息會(huì)被寫入指定撤銷表空間的數(shù)據(jù)塊。撤銷數(shù)據(jù)在提交后過(guò)期的事實(shí)意味著可以采用循環(huán)方式使用撤銷段。如果使用原有的、人工管理的回滾段,那么調(diào)整的重要環(huán)節(jié)是控制具體事務(wù)分別受哪些回滾段保護(hù)。
oracle會(huì)將沒(méi)有commit或rollback的數(shù)據(jù)放入undo表空間
update\insert\delete 都會(huì)使用undo表空間,
select 應(yīng)該不會(huì),會(huì)使用temp表空間
你不是插入10萬(wàn)的數(shù)據(jù)了嗎,在執(zhí)行 commit或rollback 之前 會(huì)使用undo表空間
########################
temp表空間的管理
臨時(shí)表空間的主要作用: 索引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;