Oracle筆記(九)

[第六章 Oracle權限與角色管理]

一、Oracle 權限管理
SQL> grant connect, resource, dba to acc01;

SQL> revoke connect, resource from acc01;

二、Oracle 角色管理(參考講義)

SQL> Create Role <role_name>
 Identified by password/ Not Identified;
 
SQL> Alter Role <role_name> ...

SQL> Grant <privs> to <role_name>;

SQL> Grant <role_name> to <user_name>

SQL> Set Role <role_name>
 All Except <role_name2> / None  // 使角色生效或失效
 

[第七章 Oracle 數據庫備份與恢復]

一、Oracle歸檔方式

確認數據庫歸檔方式:

SVRMGR> archive log list;

SQL> select log_mode from v$database;


二、Oracle歸檔方式配置步驟:

1、啓動自動歸檔進程ARCH
 log_archive_start=true
 
2、確定歸檔日誌文件存儲目錄
 log_archive_dest=目錄名

3、確定歸檔日誌文件存儲格式
 log_archive_format=%t_%s.arc

4、確定歸檔日誌文件鏡像目錄:
 log_archive_duplex_dest=鏡像目錄名

5、以MOUNT方式啓動數據庫,修改數據庫歸檔方式:
 SVRMGR> connect internal
 SVRMGR> startup mount
 SVRMGR> alter database archivelog;
 SVRMGR> alter database open;
 
// 前面1、2、3、4四個參數都在參數文件中。

[*]在Oracle8i以後,可以使用多個鏡像目錄:[8i最多是5個,9i是10個,與duplex方式不能混用]
log_archive_dest_1='location=d:/oracle/archive1'
log_archive_dest_2='location=d:/oracle/archive2'
log_archive_dest_3='location=d:/oracle/archive3'

[*]歸檔文件的格式爲二進制,可以沒有後綴。

實際操作:
1、在d:/oracle目錄下建立archive1, archive2兩個目錄
2、修改init.ora文件,增加下面四行:
log_archive_start=true
log_archive_format=%t_%s.arc
log_archive_dest=d:/oracle/archive1
log_archive_duplex_dest=d:/oracle/archive2

3、進入svrmgrl
SVRMGR> connect internal/oracle
SVRMGR> shutdown immediate
SVRMGR> startup mount
SVRMGR> alter database archivelog;
SVRMGR> alter database open;

4、進入SQL*Plus
SQL> alter system switch logfile;

//檢查d:/oracle/archive1及archive2目錄下是否有歸檔的日誌文件。

[*]在線啓動或關閉歸檔方式
SQL> Alter system archive log start;
SQL> Alter system archive log stop;


三、數據庫物理備份
[*]爲了最大限度地進行恢復,應選擇最合理的備份方法來防止介質失敗導致的數據丟失。
(1)非歸檔的操作系統備份
(2)歸檔的操作系統備份
(3)Export工具備份
註釋:
。用歸檔的操作系統備份的方法來恢復到介質失敗後的失敗點。
。用其它的恢復方法恢復到介質失敗後的最後一次備份點。
。用Export工具創建一個直接的數據庫備份文件,它不能與歸檔log文件組合使用。


1、完全數據庫脫機備份:可以在歸檔及非歸檔兩種模式下使用。
操作步驟:
(1)編寫一個要備份的最新的文件列表。
(2)用SHUTDOWN命令關閉Oracle例程。
(3)用操作系統的備份工具,備份所有的數據文件、Redo Log文件、控制文件、參數文件。
(4)重啓Oracle例程。

2、部分數據庫聯機備份:
備份步驟如下:
(1) 確認數據庫運行在ARCHIVELOG下。
(2) 對於某一個表空間進行備份:
SQL> Alter tablespace 表空間名 begin backup;

(3) 操作系統備份相應數據文件

(4) 設置表空間備份結束標識:
SQL> Alter tablespace 表空間名 end backup;

恢復數據文件:
SVRMGR> Alter database RECOVER datafile '數據庫文件名及路徑';

<=等價=>

SVRMGR> RECOVER datafile '數據庫文件名及路徑';

3、部分數據庫脫機備份:
備份步驟如下:
(1) 確認數據庫運行在ARCHIVELOG下。
(2)將某一個表空間脫機:
SQL> Alter tablespace 表空間名 offline;

(3) 操作系統備份相應數據文件

(4) 將表空間聯機:
SQL> Alter tablespace 表空間名 online;

恢復時也需要進行恢復數據文件:
SVRMGR> Alter database RECOVER datafile '數據庫文件名及路徑';

<=等價=>

SVRMGR> RECOVER datafile '數據庫文件名及路徑';

四、完全數據庫恢復應用實例
[*]完全數據庫恢復的語法:
  在數據庫關閉時,數據庫恢復語法(可以Mount):

SVRMGR> Alter database recover datafile 'filespec';
SVRMGR> Alter database recover database;
SVRMGR> Recover datafile 'filespec';
SVRMGR> recover database;

第1、3及第2、4條命令分別等價。

  在數據庫運行時,數據庫恢復語法(OPEN):
SVRMGR> recover tablespace 表空間名;
SVRMGR>recover datafile 'filespec';

1、數據庫文件被刪除,數據庫關閉時,數據庫恢復方法:
A、複製數據文件的備份文件
B、以mount方式啓動數據庫
C、恢復數據文件
SVRMGR> alter database recover datafile '數據文件名';
D、打開數據庫
SVRMGR> alter database open;

2、數據庫在運行時,數據文件被刪除的數據庫恢復方法:
A、將數據文件設置爲offline:
SVRMGR> alter database datafile '數據文件名' offline;

B、複製數據文件的備份文件
C、恢復數據文件
SVRMGR> alter database recover datafile '數據文件名';

D、將數據文件設置爲online:
SVRMGR> alter database datafile '數據文件名' online;


3、數據文件被刪除,該數據文件沒有備份,數據庫恢復方法:
A、以mount方式啓動數據庫
B、運行以下命令:
SVRMGR> Alter database create datafile '被刪除數據文件名及路徑'
    as '被刪除數據文件名及路徑';

C、恢復數據文件
SVRMGR> alter database recover datafile '數據文件名';

D、打開數據庫
SVRMGR> alter database open;

五、不完全數據庫恢復實例:

1、恢復一個被Dropped的基表:
A、關閉數據庫
B、拷貝全部的數據文件(不拷貝日誌及控制文件)
注:這些拷貝的數據文件是以前做的數據文件的備份,現在拷貝回數據庫數據文件所在目錄,覆蓋掉原來的。當然,最好在覆蓋之前將現在的數據文件及歸檔日誌做好備份。

C、實施基於時間的不完全數據庫恢復
SVRMGR> Alter database recover database until time '2002-05-17:9:00:00';
D、打開數據庫
SVRMGR> Alter database open RESETLOGS;
// 執行了resetlogs之後,文件同步號將從0開始,以前所有的歸檔日誌全部失效。

2、恢復一個被Dropped的表空間:
A、查詢跟蹤文件,確定表空間刪除時間
D:/oracle/admin/db_name/bdump/sidAlrt.log

B、關閉數據庫,複製未刪除表空間前的全部數據文件及控制文件,不復制日誌文件。

C、實施基於時間的數據庫恢復:
SVRMGR> Alter database recover database until time '2002-05-17:9:00:00' using backup controlfile;

D、打開數據庫
SVRMGR> Alter database open RESETLOGS;

六、數據庫邏輯備份:(Export/Import)

1、exp user01/user01 file=user01  // 用戶方式:將user01用戶的所有數據導出到user01.dmp文件中
2、exp user01/user01 file=user01_table tables=(emp,dept, pay, ...)   // 表方式,將指定用戶的指定表導出。
3、exp    // 交互方式
4、卸出(導出)大表:
exp user/password file=filename direct=y  ...
// 加上direct=y,表明用直接路徑卸出數據,不通過內存,直接卸出到磁盤,效率高,節省內存。

4、全部數據庫卸出:
exp system/manager file=fulldb full=y direct=y

// 加上full=y,表示將整個數據庫全部卸出。

用戶方式和表方式可以在NT 與 UNIX之間的Oracle進行數據傳輸,但整個數據庫方式不能,因爲包含了相關的數據文件信息。


七、卸出表空間:
1、檢驗表空間自包含性:檢查表空間是不是與其它表空間有外鍵約束,有外鍵約束的不能卸出。
SQL> execute ...

2、將表空間設爲只讀

3、使用export卸出表空間
exp transport_tablespace=y tablespaces=mis file=expdat.dmp

4、使用Import裝入表空間
imp transport_tablespace=y datafile='d:/oracle/oradata/x.dbf' tablespaces=mis file=expdat.dmp


八、Windows 計劃任務備份數據文件
1、C:/> net start schedule //啓動計劃服務
    net stop schedule //停止計劃服務
   
2、AT命令安排計劃:
C:/>at 22:00 /every:m,t,w,th, f, s, su d:/fullback.bat // 每週一到週日的晚上十點運行d:/fullback.bat批處理文件

C:/>at /delete /yes  // 刪除全部計劃

3、fullback.bat
svrmgrl @d:/fullback.sql

4、fullback.sql
connect internal/oracle
shutdown immediate
host copy d:/oracle/oradata/ora8i/*.* e:/back
startup


還可以爲數據庫在線備份建立腳本通過AT調用執行,實現數據庫的聯機備份。


[第八章 Oracle 數據庫的優化與調整]

一、下面三個參數屬於SGA區的設置,主要看服務器內存是不是需要擴充。

1、數據緩衝區計算:(DB_BLOCK_BUFFERS)

SQL> select 1 - (phy.value /(blk.value+con.value))
 "   Hit Ratio"
 from v$sysstat phy, v$sysstat blk, v$sysstat con
 where phy.name = 'physical reads' and
   blk.name = 'db block gets' and
   con.name = 'consistent gets'
  
Hit Ratio最好是大於90%,需要在數據庫在最繁忙的時候的命中率,否則需要增加內存。


2、日誌緩衝區計算(log_buffer)
v$latch

sum(misses) 越接近於零越好。

3、共享池大小計算(shared_pool_size)
(1) v$librarycach:  PINS(命中),Reloads(失敗)

Reloads/(pins + reloads) * 100 -> 失敗率 -> 應小於1%,否則需要擴內存。

(2) v$rowcache: GETS(取到),  GETMISSES(失敗)


二、排序區參數計算(SORT_AREA_SIZE):v$sysstat

sorts(disk) / sorts(memory)+sorts(disk)  失敗率 < 10%

三、磁盤存儲參數測算:
計算以下存儲參數:
initial
next
minextents
maxextents
pctincrease

如果使用本地化管理,不需要計算以上參數。

四、數據庫參數自動統計計算
1、修改參數文件:timed_statistics=true,重啓數據庫

2、在數據庫最繁忙的時段運行下面兩個SQL程序(在Oracle目錄中搜索這兩個文件)

SVRMGR>@d:/oracle/ora81/rdbms/admin/utlbstat.sql   
SVRMGR>@d:/oracle/ora81/rdbms/admin/utlestat.sql

3、查詢d:/report.txt來看統計結果。

五、回退段優化設計
1、對於大事務,設計大回退段,提高數據操作速度。

步驟如下:
A、創建一個專用的回退段表空間。例如:rb100
B、在回退段表空間rbs100上創建大的回退段。
SQL> create rollback segment rbs100
 tablespace rbs100
 storage(initial 50m);
C、使回退段表空間online
SQL> Alter rollback segment rbs100 online;

D、指定用戶使用專用的回退段表空間:
SQL> set transaction use rollback segment rbs100;  // 必須在事務開始前指定

E、事務結束後,刪除回退段及表空間。


教師操作實例:
System用戶操作:
SQL> create tablespace rbs1 datafile 'd:/oracle/oradata/ora8i/rbs1_01.dbf' size 10m

SQL> create rollback segment rbs100 tablespace rbs1;

SQL> alter rollback segment rbs100 online;

SCOTT用戶操作:
CREATE table bb(s1 char(20));

insert into bb values('abcdefghi');

commit;   // 必須在事務開始之前設置回退段

set transaction use rollback segment rbs100;


system用戶操作:

alter rollback segment rbs100 offline;

drop rollback segment rbs100

drop tablespace rbs1;

2、回退段I/O調整,具體步驟:
A、創建多個回退段表空間,對就不同物理磁盤,以平衡磁盤I/O
B、在多個表空間上分別創建回退段。例如:
rbs1:rbs01, rbs02, rbs03, rbs04, rbs05
rbs2: rbs06, rbs07, rbs08, rbs09, rbs10

C、修改參數文件,使回退段交叉排放。例如:
rollback_segments=(rbs01,rbs06,rbs02,rbs07,rbs03,rbs08,...)


[Oracle Developer/2000 系統開發工具]

簡介:
Form: 開發基於Form應用系統,是Developer/2000的主要開發工具。
Report: 報表開發工具,開發設計各種報表。
Graphics:圖形設計工具,開發基於數據庫的圖形界面

Form 包括以下三個工具:
。Form Builder 設計與開發組件
。Form compiler 編譯組件
。Form Runtime 運行組件

[Form Builder 設計]

一、創建一個簡單的Form應用

表在Form Builder中稱爲數據塊。

在新建的Form中的表格字段中可以輸入查詢條件,按F8按條件查詢。

另外,可以在字段中輸入變量,例如:在emp表中的sal(工資)字段輸入變量:x,在執行查詢時,輸入:x> 2000 and :x < 3000,則表示查詢工資在2000及3000之間的人員。如果要查詢1981年的人員,則在date字段輸入:x,條件爲:To_Char(:x, 'yyyy) = '1981'

查詢最大工資::x = (select max(sal) from emp)

二、創建主從型Form應用:
1、使用主表創建主塊
2、使用子表創建子塊
3、建立主表與子表之間的關聯

三、佈局設計(Layout)

四、域屬性表(Properties): 雙擊某字段即可調出屬性表

格式掩碼

五、創建文本項(Text Item):

文本項:用於顯示數據庫的統計結果

名稱
數據類型
格式掩碼
計算模式
彙總函數:總和
數據塊:emp
數據項:fullsal


公式:水平計算
彙總:垂直計算

工資及獎金合計::sal + nvl(:comm,0)

數據->用項同步化

記錄->顯示的項數:0 -> 1

六、創建值列表Lov(List of Value):

七、創建按鈕(Push Button):

1、創建文本類型按鈕:
數據查詢,條件查詢,工資總和,報表打印、退出系統
2、創建圖標類型按鈕:
(1)常用缺省圖標:
save:數據提交
rt_rdel:數據刪除
rt_radd: 數據插入
rt_rec4: >>
rt_rec3: >
rt_rec2: <
rt_rec1: <<

(2)更改按鈕屬性
圖標化:是
圖標文件名:<Icon File path>
鼠標導航:否
顯示的項數:1

(3) 增加按鈕提示
保存
刪除
插入數據
第一條記錄
下一條記錄
上一條記錄
最後一條記錄


八、創建顯示項(Display Item):
顯示項:只讀數據項,用於顯示數據庫的統計結果。


九、創建單選按鈕(Radio Button):

(1) 增加了單選按鈕後,先到“對象導航器”中修改“Radio Group”的屬性

名稱:
鼠標導航:否
數據類型:數值
初始值:10


財務部(10)、銷售部(20)、開發部(30)、網絡中心(40)

示// 數據->需要:如果選擇“是”,則表明數據爲非空,不允許爲空,如果不在表中輸入查詢條件,則不允許移動光標焦點,應選“否”。

十、複選框(Check Box)

增加一個複選框,修改其屬性:
名稱:
標籤文本:
複選時的值:y
未複選時的值:n
鼠標導航:否
顯示的項數:1
數據庫項:否

[Trigger 觸發器設計]
一、按鈕觸發器設計:
觸發器類型:WEHN-BUTTON-PRESSED
觸發器代碼:使用PL/SQL及函數編寫程序代碼。

Execute_Query;   // 執行查詢的函數,這是寫在相應按鈕上的PL/SQL執行語句的腳本

編譯,關閉,執行。


Enter_Query; // 條件查詢函數

Exit_Form; // 退出系統函數

常用的對於數據庫操作的函數:
Create_Record;  // 數據插入
Delete_Record;  // 數據刪除
Commit_Form;  // 數據提交
Execute_Query;  // 無條件數據查詢
Enter_Query;  // 條件查詢
Next_Record;  // 下一條記錄
Previous_Record;  // 上一條記錄
First_Record;  // 第一條記錄
Last_Record;  // 最後一條記錄
Scroll_Up;  // 上滾一屏
Scroll_Down;  // 下滾一屏
Exit_Form;  // 退出系統

這些函數名不區分大小寫。

如果在執行查詢時提示Oracle錯誤,不能查詢,有可能就是因爲Form中一個與數據庫字段無關的對象的“數據庫項”設置成了“是”,將其改成“否”即可。

工資總和按鈕的WHEN-BUTTON-Pressed的pl/sql腳本:select sum(sal) into :Display_sumsal from emp;


二、創建Form級觸發器完成數據庫的自動查詢與統計:
A. 在Form啓動時,進行自動查詢

觸發器名稱:WHEN-NEW-FROM-INSTANCE
對象導航器->表格->Form1->觸發器->新增

腳本內容:Execute_Query;


B. 在Form啓動時,進行自動統計計算

觸發器名稱:POST-QUERY
對象導航器->表格->Form1->觸發器->新增
select sum(sal) into :Display_sumsal from emp;

C. 顯示動態時間:
觸發器名稱:POST-QUERY
自動顯示統計時間:yyyy年mm月DD日
增加一個顯示項:DISPLAYTIME
數據類型:字符
立體:無

修改POST-QUERYR的腳本,增加一行:
:DISPLAYTIME := To_Char(sysdate, 'yyyy"年"mm"月"dd"日"');  --// 顯示的是客戶端時間

select To_Char(sysdate, 'yyyy"年"mm"月"dd"日"') into :DISPLAYTIME from dual; --// 顯示的是服務器端時間

[C*]在編輯觸發器腳本中漢字不能正確顯示的解決辦法:
先退出FormBuilder。然後:
regedit -> HKLM-> Software -> Oracle -> 新建字串de20_plain_edit,鍵值爲1。
再重新進入FormBuilder即可解決所有的漢字顯示問題。

D. Form啓動時,MDI窗口最大化及標題設置,同樣在FORM的POST-QUERY觸發器中設置:
SET_Window_Property(FORMS_MDI_WINDOW, WINDOW_STATE, maximize);
Set_Window_property(FORMS_MDI_WINDOW, TITLE, '公司員工工資情況一覽表');

設置MDI子窗口Window1:
SET_Window_Property('window1', WINDOW_STATE, maximize);
Set_Window_property('window1', TITLE, '員工管理信息系統 Version 200205 Build 1');


[*] 進入Form1模塊的屬性設置-> 菜單模塊 -> default&smartbar ,default表示菜單,smartbar表示工具欄,去掉就表示沒有這些東西。

[*] Window1屬性-> 模式 -> 是。意味着這是mdi窗口中的最後一個窗口。還可以取消最大最小化等按鈕,實現mdi子窗口看上去與主窗口好象一個窗口。

三、單選按鈕觸發器:
觸發器類型:WHEN-RADIO-CHANGED
腳本:
Declare
 string varchar2(50);
 v_dname dept.dname%type;
Begin
 select sum(sal), count(*) into :Display_item2, :Display_item3 from emp
  where deptno=:select_deptno;
 select dname into v_dname from dept where deptno = :select_deptno;
 string := v_dname || '部門統計結果';
 Message(string);

Exception
 when NO_DATA_FOUND THEN
  Message('數據庫中沒有編碼爲'||:select_deptno||'的部門。');
End;

四、時間觸發器(Timer):
1、創建計時器,確定時間間隔:
觸發器名稱:WHEN-NEW-FORM-INSTANCE
增加腳本:
Declare
 timer_id timer;
Begin
 timer_id := Create_Timer('T1', 1000, REPEAT);
End;
-- T1:計時器名稱(大寫);1000:時間間隔(毫秒);REPEAT:重複

2、創建時間觸發器的執行操作:
觸發器名稱:WHEN-TIMER-EXPIRED
Declare
 t_name varchar2(30);
Begin
 t_name := Get_Application_Property(TIMER_NAME);
 if t_name = 'T1' then Begin
  --顯示Server時間
    select To_Char(Sysdate,'yyyy"年"mm"月"dd"日"hh24"時"mi"分"ss"秒"')
     into :DisplayTime from dual;
     --顯示本機時間
   :DisplayTime :=To_Char(Sysdate,'yyyy"年"mm"月"dd"日"hh24"時"mi"分"ss"秒"') ;

  --select To_Char(sysdate, 'yyyy"年"mm"月"dd"日"hh24"時"mi"分"ss"秒") into :DisplayTime from dual;
  End;
 End if;
End;

五、複選按鈕觸發器:
觸發器類型:WHEN-CHECKBOX-CHANGED
腳本:
Begin
 if :ifprint='y' then
  Set_Item_Property('print_report', ENABLED, PROPERTY_TRUE);  --// 使打印按鈕生效
 ELSE
  Set_Item_Property('print_report', ENABLED, PROPERTY_FALSE);  --// 使打印按鈕無效
 end if;
end;

六、菜單設計
在c:/orawin95目錄下查找menudef.mmb,然後打開該文件,雙擊MENUDEF編輯原來的菜單(刪除不要的,添加需要的),然後另存爲自己的菜單menu1.mmb,然後編譯(文件->管理->編譯文件CTRL+T)。。然後在Form1的屬性設置中,將菜單模塊直接設置成菜單文件的名稱及路徑,例如:e:/xyf/menu1

七、基於數據庫的圖象字段存儲:
1、在數據庫中創建一個含有圖象字段的基表。
SQL>Create table employee as select * from emp;
SQL> alter table employee add(photo long raw);  --//加上long raw字段後,該表就不能再用select * 去查詢

2、對圖象文件進行唯一性編碼

SQL> Spool e:/empno
SQL> select empno from emp;
SQL> Spool off;

生成e:/empno.lst文件,存儲了所有僱員的empno列表作爲圖象文件的唯一性編碼
如:7788.jpg...

3、創建Form,編寫觸發器調用圖象文件:photo.fmb
photo屬性->大小風格 -> 調整

empno字段的觸發器:WHEN-NEW-ITEM-INSTANCE
Declare
 photo_name varchar2(50);
Begin
 photo_name := 'e:/xyf/'||To_Char(:empno)||'.jpg';
 Read_Image_File(photo_name, 'jpg', 'photo');
End;

4、圖象數據提交數據庫。

5、刪除本機圖象,刪除觸發器。

八、標籤畫布(Page):
不使用數據塊嚮導,直接在“表格”處新增一個Form,然後進入佈局編輯器,選擇左邊工具欄中的“標籤畫布”新建一個標籤畫布。然後回到對象導航器,刪除原來的畫布。

在佈局編輯器中,在標籤位置按鼠標右鍵->屬性選項板,可以進入標籤畫布的根的屬性設置中,而在某個標籤的中間部位按鼠標右鍵->屬性選項板,則可以進入這個標籤頁的屬性設置。

對象(導航器) -> 數據塊 -> 關係 -> 新建:dept.deptno = employee.deptno

各個標籤頁的顯示順序,由在各個頁上的數據塊在對象導航器中的排列先後順序確定,可以通過鼠標拖動來直接調整其排列順序。


[Oracle Application Server應用服務器]
試驗環境:
Oracle Server:
IP: 75.64.23.30
SID: orcl

Oracle Application Server:
IP: 75.64.23.40
Host Name: ntsvr1

用戶:
user01/user01, ... user40/user40

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章