1.前言
今天徹底搞懂Oracle的用戶、Schema、數據庫、表空間、數據文件的相互關系
2.開始
在進入抽象的概念之前,可以先看一下網上的這段比喻:
“我們可以把Database(這里應該是指某一個sid對應的數據庫)看做一個大倉庫,倉庫分了很多很多房間,Schema就是其中的房間,一個schema代表一個房間,table可以看做是每個schema中的床,table(床)被放入每個房間中,不能放置在房間外,user就是每個schema的主人,所以schema包含的是object,而不是user,user和schema是一一對應的,每個user在沒有特別指定下只能使用自己schema(房間)的東西,如果一個user想要使用其他schema(房間)的東西,那就要看那個schema(房間)的user(主人)有沒有給你這個權限了,或者看這個倉庫的老大(DBA)有沒有給你這個權限了。換句話說,如果你是某個倉庫的主人,那么這個倉庫的使用權和倉庫中的東西都是你的(包括房間),你有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西都某一個房間,你還可以給每個user分配具體的權限,也就是他到某一個房間能做寫什么,是只能看(read-only),還是可以像主人一樣有所有的控制權(R/W).這個就要看這個user所對應的角色role了。
3.具體介紹
(1)數據庫:
Oracle數據庫時數據的物理存儲。這就包括(數據文件ORA或者DBF、控制文件、聯機日志、參數文件)。其實Oracle數據庫的概念和其它數據庫不一樣,這里的數據庫是一個操作系統只有一個庫。可以看做是oracle就只要一個大數據庫。
(2)實例
一個oracle實例(Oracle instance)有一系列的后台進程(Backgroud processes)和內存結構(Memory Structures)組成,一個數據庫可以有n個實例。
(3)用戶(user)
用戶是在實例下建立的。不同實例可以建立相同名字的用戶。
-- 創建新用戶時,同時要指明表空間和臨時表空間(建立創建時就指定表空間名) create user testuser #profile "default" identified by "password123" default tablespace ts_test ##這里要指定默認表空間 temporary tablespace tmp_ts_test ##這里指定了臨時表空間 quota 500m on ts_test ##用戶在表空間的限額 account unlock; ##解鎖用戶
*關於profile的說明(使用profile文件實現用戶口令限制與資源限制)
profile是口令限制,資源限制的命令集合,建立oracle數據庫時,oracle會自動建立命為default的profile,初始化的default沒有進行任何口令和資源限制,使用profile有以下一些注意事項:
1.建立profile時,如果只設置了部分口令或者資源限制選項,其他選項會自動使用默認值(default的相應選項)
2.建立用戶時,如果不指定profile選項,oracle會自動將default分配給相應的數據庫用戶
3.一個用戶只能分配一個profile。如果要同時管理用戶的口令和資源,那么在建立profile時應該同時指定口令和資源選項。
4.使用profile管理口令時,口令管理選項總是處於被激活狀態,但如果使用profile管理資源,必須要激活資源限制。
*關於profile使用實踐
1)查看當前存在的profile文件
select distinct profile from dba_profiles; --查看指定profile文件中各資源的限制情況: select resouce_name,limit from dba_profiles where profile='DEFAULT';
2)修改現在profile文件中資源選項:
1 alter profile default limit FAILED_LOGIN_ATTEMPTS 1 password_lock_time 3;
3)創建一個新的profile文件
1 create profile lock_accout limit failed_login_attempts 3 password_lock_time 10;
4)讓用戶使用新的profile文件:
1 alter user testuser profile lock_accout;
5)查看用戶當前使用的profile文件
select username,profile from dba_users;
6)使用profile文件限制用戶對資源的使用;
1 --必須先激活資源限制: 2 alter system set resource_limit=TRUE scope=memory; 3 --對資源限制做修改: 4 alter profile lock_accout limit cpu_per_session 5000;
7)刪除profile
1 drop profile lock_accout;
8)刪除profile並將使用當前profile的用戶profile改為default
1 drop profile lock_accout cascade;
9)以下列出所有profile相關參數內容以便參考:
FAILED_LOGIN_ATTEMPTS:用於指定聯系登陸的最大失敗次數. PASSWORD_LOCK_TIME:用於指定帳戶被鎖定的天數. PASSWORD_LIFE_TIME:用於指定口令有效期 PASSWORD_GRACE_TIME:用於指定口令寬限期. PASSWORD_REUSE_TIME:用於指定口令可重用時間. PASSWORD_REUSE_MAX;用於指定在重用口令之前口令需要改變的次數. PASSWORD_VERIFY_FUNCTION;是否校驗口令(校驗將值改為VERIFY_FUNCTION) CPU_PER_SESSION:用於指定每個會話可以占用的最大CPU時間. LOGICAL_READS_PER_SESSON:用於指定會話的最大邏輯讀取次數. PRIVATE_SGA:用於指定會話在共享池中可以分配的最大總計私有空間.需要注意,該選項只使用與共享服務器模式. COMPOSITE_LIMIT:用於指定會話的總計資源消耗(單位:服務單元). CPU_PER_CALL:限制每次調用(解析,執行或提取數據)可占用的最大CPU時間(單位:百分之一秒) LOGICAL_READS_PER_CALL:用於限制每次調用的最大邏輯I/O次數. SESSIONS_PER_USER:用於指定每個用戶的最大並發會話個數. CONNECT_TIME:用於指定會話的最大連接時間. IDLE_TIME:用於指定會話的最大空閑時間.
(4)schema
在Oracle中,一般一個用戶就對應一個schema,該用戶的schema名等於用戶名,並作為該用戶缺省schema,用戶是不能創建schema的,schema在創建用戶的時候創建,並可以指定用戶的各種表空間(這點與pg是不同,pg是可以創建schema並指派給某個用戶)。當前連接到數據庫上的用戶創建的所有數據庫對象都默認數據這個schema(在不指明schema的情況下),比如若用戶scott連接到數據庫,然后create table test(id int null)創建表,那么這個表被創建在了scott這個schema中;但若這樣create table testuser.test(id int not null)的話,這個表被創建在了testuser這個schema中,當前前提是權限允許(即testuser用戶給scott用戶在其schema下創建數據表的權限)。由此看來,schema是一個邏輯概念。
但一定要注意一點:schema並不是在創建user時就創建的,而是在該用戶創建了第一個對象之后才將schema真正創建的,只有user下存在對象,他對應的schema才會存在,如果user下不存在任何對象了,schema也就不存在了。
(5)表空間
表空間是一個用來管理數據存儲邏輯概念,表空間只是和數據文件(ORA或者DBF文件)發生關系,數據文件是物理的,一個表空間可以包含多個數據文件,而一個數據文件只能隸屬一個表空間。
(6)數據文件(dbf、ora)
數據文件是數據庫的物理存儲單位,數據庫的數據在邏輯上是存儲在表空間中的,但真正落地是在某一個或者多個數據文件中。而一個表空間可以由一個或者多個數據文件組成,一個數據文件只能屬於一個表空間。一旦數據文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數據文件,只能刪除其所屬於的表空間才行。