用過Oracle,再比較曾經用過的Access和MySQL,才深刻體會到Oracle在數據存儲和管理方面的強大!個人覺得Oracle比較突出的特點有:
1、數據的存儲方式和查詢效率;
2、用戶的權限管理;
下面是我在使用Oracle過程中在網上找的一些資料,并附上一些自己的心得體會。需要指出的一點是,作為剛從小型數據庫轉到使用大型數據庫的Oracle初學者,我覺得很有必要熟練掌握視圖的操作!!在本文最后會展開論述一下我對視圖的理解。
一、概念
1. 數據庫 (Database)
什么是數據庫?
數據庫是依照某種數據模型組織起來并存放二級存儲器中的數據集合。這種數據集合具有如下特點:盡可能不重復,以最優方式為某個特定組織的多種應用服務,其數據結構獨立于使用它的應用程序,對數據的增、刪、改和檢索由統一軟件進行管理和控制。從發展的歷史看,數據庫是數據管理的高級階段,它是由文件管理系統發展起來的。
什么是數據庫系統?
數據庫系統是一個實際可運行的存儲、維護和應用系統提供數據的軟件系統,是存儲介質、處理對象和管理系統的集合體。它通常由軟件、數據庫和數據管理員組成。其軟件主要包括操作系統、各種宿主語言、實用程序以及數據庫管理系統。數據庫由數據庫管理系統統一管理,數據的插入、修改和檢索均要通過數據庫管理系統進行。數據管理員負責創建、監控和維護整個數據庫,使數據能被任何有權使用的人有效使用。數據庫管理員一般是由業務水平較高、資歷較深的人員擔任。
打個比喻吧:庫據庫就是存放數據的倉庫. 當然倉庫得組織得有序,這需要一套管理方法及管理組織,管理方法及管理組織結合就成了一個管理倉庫的有機體——系統。
2. 數據表空間 (Tablespace)
存放數據總是需要空間, Oracle把一個數據庫按功能劃分若干空間來保存數據。當然數據存放在磁盤最終是以文件形式,所以一盤一個數據表空間包含一個以上的物理文件。
3. Oracle用戶
一個數據庫多個用戶來創建和管理自己的數據, 每個用戶有自己的權限,也可與其他用戶共享數據。
4. 數據表
在倉庫,我們可能有多間房子,每個房子又有多個貨架,每架又有多層。 我們在數據庫中存放數據,最終是數據表的單元來存儲與管理的。
5. 數據文件
以上幾個概念都是邏輯上的, 而數據文件則是物理上的。就是說,數據文件是真正“看得著的東西”,它在磁盤上以一個真實的文件體現。
二、創建
1. 數據庫
安裝好oracle后,一個數據庫系統就安裝好了,其中有一個缺省的數據庫,當然,還可以創建新的數據庫。
2. 數據表空間
現在應該建數據表空間,就如要存放貨物,起碼首先得把房子建好吧。就是存放東西的空間。表空間就存放數據的空間。
格式: create tablespace 表空間名 datafile '數據文件名' size 表空間大小;
例子:
create tablespace data_test datafile 'e:\oracle\oradata\test\data_1.dbf' size 2000M;
create tablespace idx_test datafile 'e:\oracle\oradata\test\idx_1.dbf' size 2000M;
(*數據文件名 包含全路徑, 表空間大小 2000M 表是 2000兆)
3.用戶
建好tablespace, 就可以建用戶了
格式:create user 用戶名 identified by 密碼 default tablespace 表空間表;
例子:
create user study identified by study default tablespace data_test;
(*創建一個用戶名為 study,密碼為 study, 缺少表空間為 data_test -這是在第二步建好的.)
(*抽省表空間表示 用戶study今后的數據如果沒有專門指出,其數據就保存在 data_test中, 也就是保存在對應的物理文件 e:\oracle\oradata\test\data_1.dbf中)
4. 授權給新用戶
grant connect,resource to study;
--表示把 connect,resource權限授予study用戶
grant dba to study;
--表示把 dba權限授予給 study
5. 創建數據表
進入剛創建的用戶:
sqlplusw study/study@test
然后就可以在用戶study中創建數據表了:
格式:create table 數據表名,后面的詳細參數,在網上搜索 "oracle" "create table" "語法"。
例子:
create table test_user (
no number(5) not null , --pk
username varchar2(30) not null , --用戶名
passpord varchar2(30) not null , --密碼
constraint pk_connectdb primary key(no)
)storage (initial 10k next 10k pctincrease 0);
*下面講解上面命令的各方面的含義
create table test_user --創建數據表
no number(5) not null , --pk
(列名或字段名) 數據類型(數據長度)
該數據列不能為空 ,是列之間的分隔符 --后的內容是注釋
constraint pk_connectdb primary key(no)
(約束) 約束名 (主鍵) (列名)
值得一提的是,Oracle中可以對多個列定義主鍵約束,約束條件為(非空、不重復),即多個列合并起來的ID不重復即可,利用這點可以很方便地定義父表系統和子表系統。
storage (initial 10k next 10k pctincrease 0);
Oracle的一種存儲管理方式,初次接觸,深刻體會到Oracle在數據存儲管理方面的專業。如果某個數據表要存放大量數據,就把initial和next后的值設置大一點, 否則設置小一點。
既然上面在創建數據表中沒有特別指定 表空間,當然該表就存放在study缺省表空間data_test了.
三、管理
1.用戶管理
(1)修改用戶
ALTER USER avyrros
IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE data_ts
TEMPORARY TABLESPACE temp_ts
QUOTA 100M ON data_ts
QUOTA 0 ON test_ts
PROFILE clerk;
(2)刪除用戶
DROP USER username [CASCADE]
CASECADE 選項會刪除該用戶模式下的所有對象,建議在刪除前,先確認是否有其他的依賴關系存在。
(3)用戶權限查詢
a、查詢某個用戶授予其他用戶在當前用戶模式下的對象權限
select * from user_tab_privs_made --假如當前用戶為WENZI,那么查詢結果就是由WENZI授權,在WENZI模式下的權限記錄
b、查詢某個用戶授予其他用戶在該用戶模式對象及其他模式對象上的對象權限
select * from all_tab_privs_made -- 假如當前登錄用戶為WENZI,那么查詢結果就是所有由WENZI授予的權限的記錄
c、查詢為某個用戶授予的,在其他模式對象上的權限
select * from user_tab_privs_recd --假如當前登錄用戶為WENZI,那么查詢結果就是WENZI在其他模式對象上的權限
d、查詢為某個用戶授予的,在該用戶模式對象與其他模式對象上的權限
select * from all_tab_privs_recd --假如當前用戶為wenzi,則查詢結果為wenzi在整個數據庫中擁有權限的對象
e、查詢屬于用戶的對象
select owner,object_name,object_type,status from dba_objects where owner='WENZI'
2.角色管理
(1)創建口令文件
orapwd file='..........\pwd{SID}.ora' password='***(sys的密碼)' tntries=10(口令文件最大的用戶數量)
(2)授予權限
要使某個用戶可以使用口令文件,必須為其授予SYSDBA權限,系統會自動將其加入到口令文件中。
grant sysdba to wenzi
當收回SYSDBA權限時,系統將對應的用戶從口令文件中刪除。
revoke sysdba from wenzi
(3)查看口令文件管理的用戶
select * from v$pwfile_users
四、備份
為防止數據出現意外損壞和丟失,需要定期對數據庫進行備份,備份方法如下:
1.表的復制
(1) 復制表結構及其數據:
create table table_name_new as select * from table_name_old
(2)只復制表結構:
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old
(3)只復制表數據:
如果兩個表結構一樣:
insert into table_name_new select * from table_name_old
如果兩個表結構不一樣:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
(4)添加約束條件
復制表沒有主鍵,因此需要進一步添加主鍵。添加約束的指令格式為:
alter table 表格名稱 add constraint 約束名稱 增加的約束類型 (字段列表)
例子:
alter table emp add constraint ppp primary key (id1,id2,id3)
以上代碼,聯合三個列為主鍵,列名為id1,id2,id3,表名為emp,約束名為ppp。在數據庫所有表中約束名需保證唯一性,因此一般采用某種序列生成方式來形成約束名。
2.數據庫備份
(1)導出
exp ff/ff@orcl file='d:ff.dmp' tables=customers direct=y
使用exp 輸出。輸入的為需要備份的用戶表的賬號和密碼,根據提示一直點回車就OK 結束后將會出現一個ff.DMP文件,此文件為備份數據。
導出時可以選擇導出:1.整個數據庫(需具備dba權限);2.用戶(包括表、視圖和其它);3.表(只包含表,不導出視圖);
(2)導入
create user ly identified by pw default tablespace users quota 10M on users;
創建新用戶 用戶名為ly 密碼為pw 默認表空間為此空間,配額為10M
grant connect,resource,dba to ly;
賦予ly權限(1.連接;2.資源;3.dba權限,必須具備才能執行導入!)
grant create session,create table,create view,unlimited tablespaces to ly;
賦予ly其它常用權限(1.登陸到服務器,2.創建表,3.創建視圖,4.無限表空間)
imp ly/ly@ORCL fromuser=ff touser=ly file='d:ff.dmp' constraints=n
使用 imp 輸入。輸入需要導入的用戶的用戶名和密碼 然后點回車,根據提示一直到再次要求你輸入用戶名的地方。
(3)DBA授權問題
一個數據庫中除了system和sys用戶以外,最好嚴格控制DBA權限的授予,尤其是不要隨便賦予應用系統schema的owner以這個權限。
目前國內的軟件開發以及項目管理的能力還很薄弱,絕大多數項目中,不會設立專門的數據庫管理角色,又為了圖方便,往往賦予應用系統schema的owner以DBA權限,這樣一來,在一個幾十人或者上百人的團隊中,其中任何一個開發人員或是運維人員一個隨意的對DB的操作,對DB而言也許將會是災難性的。
因此,當導入數據后,應及時revoke掉 DBA 權限。
(4)數據存放的表空間問題(IMP由擁有DBA權限的用戶EXP數據時)
第一種情況:
目標數據庫中存在與導出用戶的缺省表空間同名的表空間,此時,一定要將導入用戶的 unlimited tablespace 權限 revoke 掉,否則,數據將全部被導入到那個同名的表空間中,而不是導入用戶的缺省表空間中。
第二種情況:
目標數據庫中沒有與導出用戶的缺省表空間同名的表空間,這種情況下,并不需要將導入用戶的 unlimited tablespace 權限 revoke 掉。
總結:
當拿到由擁有DBA權限的用戶導出的數據時,最好問清楚其缺省表空間,如果目標數據庫中存在與導出數據庫同名的表空間時,這種情況需要特別注意。
我們往往在一看到“IMP-00013: 只有 DBA 才能導入由其它 DBA 導出的文件” 這個錯誤信息后,就立刻給導入用戶授予DBA權限,但卻忽略了DBA的角色是擁有對數據庫中所有表空間unlimit的權限,造成花費很長時間import結束后,卻發現沒有導入到預期的表空間中。
簡而言之,如果有同名表空間存在的話,必須將導入用戶的 unlimited tablespace的權限 revoke 掉,否則數據將被直接存放到了那個同名表空間中,而不是導入用戶缺省的表空間中;如果沒有同名表空間,則無需進行 revoke,oracle 會自動將數據存放在導入用戶的缺省表空間中。
五、關于視圖
現在迷上了使用視圖來查詢,主要是因為視圖有以下幾點很突出的作用,而這些作用單純的表是無法實現的。
1.視圖的作用
(1)簡化用戶的操作。
聯接表,對用戶隱蔽,并使用戶能以多種角度查看同一數據。
(2)邏輯獨立性。
可以利用視圖導出同一表的不同內容,實現多個獨立的“虛擬表”。
(3)提高數據的安全性。
封裝了部分操作,隱蔽了內部表結構。
2.視圖的創建
create or replace view 視圖名 as 條件;
金錢,可以給路邊的陌生人,而時間,只愿意留給我在乎的人。
專注SOA、ESB,專注通信、教育領域數據交換。
MSN:java.paul@hotmail.com
Email:javapaul@163.com