oracle用戶與表空間關系
用戶=商家
表=商品
表空間=倉庫
1. 1個商家能有很多商品鱼冀,1個商品只能屬于一個商家
2. 1個商品可以放到倉庫A匀泊,也可以放到倉庫B茅主,但不能同時放入A和B
3. 倉庫不屬于任何商家
4. 商家都有一個默認的倉庫纵刘,如果不指定具體倉庫穴翩,商品則放到默認的倉庫中
oracle中用戶的所有數(shù)據(jù)都是存放在表空間中的犬第,很多個用戶可以共用一個表空間,也可以指定一個用戶只用某一個表空間芒帕。
表空間:創(chuàng)建表空間會在物理磁盤上建立一個數(shù)據(jù)文件歉嗓,作為數(shù)據(jù)庫對象(用戶、表背蟆、存儲過程等等)的物理存儲空間鉴分;
用戶:創(chuàng)建用戶必須為其指定表空間,如果沒有顯性指定默認表空間带膀,則指定為users表空間志珍;創(chuàng)建用戶后,可以在用戶上垛叨,創(chuàng)建表伦糯、存儲過程等等其他數(shù)據(jù)庫對象;
表:是數(shù)據(jù)記錄的集合嗽元;
創(chuàng)建過程: 表空間--->用戶--->表;
所屬關系: 表空間 包含 用戶 包含 表敛纲;
1.首先是ORACLE的整體結構。
oracle中的一個數(shù)據(jù)庫就是一個實例.
oracle的一個用戶就是一個Schema(即方案).
oracle的結構是===
實例->用戶->表(用戶屬于數(shù)據(jù)庫實例,表屬于某個用戶)
所以在oracle下建立 建表空間剂癌,建用戶淤翔,設置用戶的默認表空間,在用戶下建表佩谷;
--創(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;
-- 為用戶賦予權限
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;
查看系統(tǒng)權限和對象權限
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上創(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;
############################
下面是單實例上創(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通過sqldeveloper連接庫,執(zhí)行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 連接到數(shù)據(jù)庫的時候,會從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;
查詢數(shù)據(jù)庫當前進程的連接數(shù):
select count(*) from v$process;
查看數(shù)據(jù)庫當前會話的連接數(shù):
select count(*) from v$session;
查看數(shù)據(jù)庫的并發(fā)連接數(shù):
select count(*) from v$session where status='ACTIVE';
查看當前數(shù)據(jù)庫建立的會話情況:
select sid,serial#,username,program,machine,status from v$session;
查詢數(shù)據(jù)庫允許的最大連接數(shù):
select value from v$parameter where name = 'processes';
##################################
undo表空間管理
你可以建立多個undo表空間,但是當前在用undo表空間只能是其中一個莉撇。rac除外
只能是一個,但是可以新建另外一個,把原來的失效,再指向新UNDO表空間
修改默認的undo表空間為新創(chuàng)建的
show parameter undo;
alter system set undo_tablespace=undo1;
undo表空間用于存放undo數(shù)據(jù)呢蛤,當執(zhí)行DML操作(insert、update棍郎、delete)時其障,oracle會將這些操作的舊數(shù)據(jù)寫入到undo段。
知道updata語句執(zhí)行會產(chǎn)生undo信息涂佃,將老的數(shù)據(jù)保存到undo表空間中励翼。
那么select語句會產(chǎn)生undo信息嗎?產(chǎn)生什么信息呢辜荠?select會將什么保存的表空間中呢汽抚?
insert呢?又會產(chǎn)生undo信息嗎伯病?將什么保存到undo表空間呢造烁?
新建一個表,插入十萬數(shù)據(jù)午笛,執(zhí)行:
sql>select addr, used_ublk from v$transaction;
ADDR USED_UBLK
-------- ----------
3B7D6984 87
產(chǎn)生87塊惭蟋,產(chǎn)生undo信息了嗎?表是新建的季研,沒有任何信息敞葛,也就是沒有老的數(shù)據(jù),那么會產(chǎn)生undo信息嗎与涡?在undo表空間存入什么呢惹谐?
還原段用途:
事務處理回退——當某事務處理修改表中某行時持偏,被修改的列的舊映像(要還原的數(shù)據(jù))將存儲在還原段中。如果將該事務處理回退氨肌,則Oracle 服務器通過將還原段中的值寫回到該行來恢復原始值鸿秆。
事務處理恢復——如果例程在事務處理正在進行時失敗,那么Oracle 服務器需要在數(shù)據(jù)庫再次打開時還原所有未提交的更改怎囚。這種回退操作是事務處理恢復的一部分卿叽。之所以有可能恢復事務處理,原因在于對還原段所做的更改同樣受重做日志文件的保護恳守。
讀一致性——在事務處理正在進行時考婴,數(shù)據(jù)庫中的其他用戶不應看到這些事務處理所做的任何未提交更改。此外催烘,也不應從某條語句中看到該語句開始執(zhí)行后所提交的任何更改沥阱。還原段中的舊值(要還原的數(shù)據(jù))也可用于為讀者提供給定語句的一致映像。
oracle中undo是用來存放回滾數(shù)據(jù)的伊群。
撤銷(Undo)數(shù)據(jù)是反轉DML語句結果所需的信息考杉。撤銷數(shù)據(jù)通常被稱為“回滾數(shù)據(jù)”,在過去的Oracle版本中舰始,“回滾數(shù)據(jù)”和“撤銷數(shù)據(jù)”可以交替使用崇棠,但從 9i版本開始,這兩個術語有所不同:功能相同丸卷,但管理方式不同枕稀。只要某個事務修改了數(shù)據(jù),那么更新前的原有數(shù)據(jù)就會被寫入一個回滾段或撤銷段及老〕槔常回滾段在 11g版本中依然存在,但從9i版本開始骄恶,Oracle數(shù)據(jù)庫引入了可供選擇的撤銷段食铐。Oracle強烈建議所有數(shù)據(jù)庫都應當使用撤銷段,回滾段只被保留用于向后兼容 僧鲁。
undo表空間:
一個數(shù)據(jù)庫可以存在多個撤銷表空間虐呻,但是在任意給定時刻都只能使用一個撤銷表空間。撤銷表空間必須被創(chuàng)建為持久的寞秃、本地管理的并且能夠自動擴展分配空間的表空間斟叼。
事務與undo段:
在某個事務啟動時,Oracle會為其指派一個撤銷段春寿。任何一個事務都只能受一個撤銷段保護朗涩,一個事務生成的撤銷數(shù)據(jù)無法被分配到多個撤銷段中。
在某個事務更新表和索引數(shù)據(jù)塊時绑改,回滾該變化所需的信息會被寫入指定撤銷表空間的數(shù)據(jù)塊谢床。撤銷數(shù)據(jù)在提交后過期的事實意味著可以采用循環(huán)方式使用撤銷段兄一。如果使用原有的、人工管理的回滾段识腿,那么調整的重要環(huán)節(jié)是控制具體事務分別受哪些回滾段保護出革。
oracle會將沒有commit或rollback的數(shù)據(jù)放入undo表空間
update\insert\delete 都會使用undo表空間,
select 應該不會渡讼,會使用temp表空間
你不是插入10萬的數(shù)據(jù)了嗎骂束,在執(zhí)行 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;