ocp11g培訓內部教材_052課堂筆記(042)_體系架構

 

OCP 052 課堂筆記css

 

目錄html

第一部分: Oracle體系架構... 4java

第一章:實例與數據庫... 4node

一、Oracle 網絡架構及應用環境... 4linux

二、Oracle 體系結構... 4ios

三、 SGA. 5web

4 Oracle的進程: 9sql

5 PGA. 12數據庫

六、用戶與Oracle服務器的鏈接方式... 12windows

第二章:實例管理及數據庫的啓動/關閉... 14

2.1 實例和參數文件... 14

2.2 數據庫啓動與關閉:... 16

2.3 告警日誌:alert_SID.log. 18

2.4 口令文件... 19

2.5 添加scott 案例... 21

第三章:控制文件... 22

3.1 控制文件的功能和特色:... 22

3.2 控制文件的內容... 22

3.3 控制文件多元化... 24

3.4 控制文件的重建與備份... 24

3.5 控制文件手工恢復... 25

第四章: redo 日誌... 26

4.1 redo (重作) log 的功能:數據recovery. 27

4.2 redo log 特徵:... 27

4.3 redo 日誌組... 27

4.4 如何添加日誌組... 27

4.5 如何添加日誌組的成員... 29

4.6 如何查看日誌信息... 30

4.7 redo 日誌成員重命名或遷移... 31

第五章: 歸檔日誌 archivelog. 40

5.1 歸檔和非歸檔的區別... 40

5.2 查看歸檔模式:... 41

5.3 設置歸檔模式... 41

5.四、歸檔日誌的路徑及命名方法... 41

5.5 在liunx下查看歸檔進程... 43

5.6 日誌歸檔:... 44

第六章 日誌挖掘 log miner. 45

6.1 log miner的做用:... 45

6.2 有兩種日誌挖掘方法 針對DML和DDL,整理以下 :... 45

第七章: 管理undo. 49

7.1 undo做用... 49

7.2 undo 的管理模式:... 49

7.3 undo 表空間管理... 49

7.4 查看當前正在使用的undo tablespace. 50

7.5 切換undo. 51

7.6 刪除undo tablespace. 52

7.7 undo block的4種狀態... 52

7.8 關於undo_retention 參數... 53

7.9 undo 信息的查詢... 54

7.10 system表空間的undo. 55

7.11 測試:模擬數據庫open下的undo損壞和修復。... 55

第八章 檢查點(checkpoint) 59

8.1 什麼是checkpoint. 59

8.2 checkpoint主要2個做用:... 60

8.3 checkpoint分類... 60

8.4 設置合理的MTTR參數... 63

8.5 局部檢查點的觸發條件:... 64

第九章  實例恢復機制... 64

第二部分 Oracle的存儲架構... 65

第十章 數據字典... 65

10.1 數據字典... 65

10.2 動態性能表(V$)... 66

第十一章: Oracle的存儲架構... 67

11.1 TABLESPACE(表空間)特色... 67

11.2 SEGMENT(段)... 73

11.3 EXTENT(區)... 75

11.4 BLOCK(數據塊)... 79

11.5 臨時表空間... 84

11.6 如何調整表空間的尺寸(表空間的大小等同它下的數據文件大小之和)... 88

11.7 Oracle的Resumable功能... 90

第十二章: Oracle中表的幾種類型... 90

12.1 分區表及其種類(10g) 90

12.2 索引組織表... 95

12.3 簇表(cluster table):... 96

12.4 臨時表:... 97

12.5 只讀表 (11g新特性)... 97

第十三章: 數據庫審計audit. 98

13.4 審計的對象:... 99

13.5 舉例:... 99

第十四章: 數據裝載 sql loader. 101

第十五章: oracle 網絡... 105

15.1 Oracle Net 基本要素:... 105

15.2 客戶端連接:... 106

15.3 lisenter 註冊:... 106

第三部分: 管理ORACLE數據庫... 111

第十六章:Oracle ASM 管理(ppt-II:602-636) 111

16.1 什麼是ASM.. 111

16.2 系統級的磁盤管理... 111

16.3 ASM和LSM的比較... 111

16.4 ASM體系結構... 112

16.5 在Linux上建立ASM實例的範例... 114

第十七章:邏輯備份與恢復... 124

17.1 傳統的導入導出exp/imp:... 125

第十八章 物化視圖... 133

 

 

 

 

 

第一部分: Oracle體系架構

第一章:實例與數據庫

                       

 

一、Oracle 網絡架構及應用環境

 

看ppt,Oracle結構的基本單元、術語

 

二、Oracle 體系結構

 

  1)oracle server :database + instance

 

  2)database:data file 、control file 、 redolog file

 

  3)instance: an instance access a database

  //一個實例訪問一個數據庫

 

  4)oracle memory: sga + pga

 

  5)instance : sga + backgroud process

  //sga+後臺進程

 

  6)sga組成:sga 在一個instance只有一個sga,sga爲全部session共享,隨着instance啓動而分配,instance down ,sga被釋放。

  //system groble areas

 

三、 SGA

 

3.1 SGA的6個組件:

 

1) shared pool

 

共享池是對SQL、PL/SQL程序進行語法分析、編譯、執行的內存區域。

共享池由庫緩存(library cache),和數據字典緩存(data dictionary cache)組成。

共享池的大小直接影響數據庫的性能。

 

關於shared pool中的幾個重要概念

 

library cache: sql和plsql的解析場所,存放着全部編譯過的sql語句代碼,以備全部用戶共享。

 

sql語句解析過程:

 

硬解析:

1)分析:包括SQL語句的語法和語義檢驗,並檢查所執行活動的對象權限。

2)優化:Oracle優化程序在評估了幾種備選方案後,得出如何以最低成本(COST )處理相應語句的最終方案。

軟解析:

3)執行:Oracle執行這個執行計劃。(這個成本最低的執行計劃也包括訪問路徑,也存在庫緩存中)

4)取數據:只用於select語句,這個步驟在非查詢語句中不須要。

 

data dictionary cache:  存放重要的數據字典信息,以備數據庫使用

 

2) database buffer cache

 

用於存儲從磁盤數據文件中讀入的數據,全部用戶共享。

服務器進程(server process)將讀入的數據保存在數據緩衝區中,當後續的請求須要這些數據時能夠在內存中找到,則不須要再從磁盤讀取。

數據緩衝區中被修改的數據塊(髒塊)由後臺進程DBWR將其寫入磁盤。

數據緩衝區的大小對數據庫的讀取速度有直接的影響。

 

考點:服務器進程對數據文件執行讀操做,而DBWN負責對數據文件執行寫操做。

 

db buffer中的幾個cache參數:

 

       db_cache_size        //指定標準塊大小內存空間,好比標準塊是8k,LRU 默認數據塊放到default cache

       db_nk_cache_size     //指定非標準塊大小內存空間,好比2k、4k、16k、32k。

       db_keep_cache_size      //keep  存放常常訪問的小表或索引等

       db_recycle_cache_size   //與keep相反,存放偶爾作全表掃描的大表的數據

 

注意:

2.1)keep cache和recycle cache是可選的。所有buffer cache的大小就是以上參數的總合。即沒有分配到keep cache和recycle cache的任何數據庫對象都將分配給default cache。說的更清楚些就是default, keep, recycle 相互獨立,對於某一個對象(表)來講,它只能屬於它們之中的一種。

 

SQL> alter table scott.emp1 storage(buffer_pool keep);

 

SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';

 

SEGMENT_NAME                                                                      BUFFER_

--------------------------------------------------------------------------------- -------

EMP1                                                                              KEEP

 

2.2)default_cache_szie和標準塊default block是配套的,若是default block是8k, db_cache_size這個參數將代替db_8k_cache_size。

 

若是要創建非標準塊的表空間,先前要設定db buffer中的與之對應的nk_cache_size。

 

09:50:46 SQL> alter system set db_16k_cache_size=8m;        //改參數,先把db buffer裏的16k cache建上。

 

09:50:49 SQL> create tablespace tbs_16k datafile '/u01/oradata/timran11g/tbs16k01.dbf' size 10m blocksize 16k;

 

09:51:29 SQL> select TABLESPACE_NAME,block_size from dba_tablespaces;

 

TABLESPACE_NAME                BLOCK_SIZE

------------------------------ ----------

SYSTEM                               8192

UNDOTBS1                             8192

SYSAUX                               8192

TEMP                                 8192

USERS                                8192

EXAMPLE                              8192

TBS_16K                             16384

 

 

2.3)查看buffer cache命中率:

 

18:28:20  SQL>select (1-(sum(decode(name, 'physical reads',value,0))/(sum(decode(name, 'db block gets',value,0))+sum(decode(name,'consistent gets',value,0))))) * 100 "Hit Ratio" from v$sysstat;

 

 Hit Ratio

----------

97.6811923

 

3)redo log buffer

 

日誌條目(redo entries )記錄了數據庫的全部修改信息(包括DML和DDL),用於數據庫恢復,日誌條目首先產生於日誌緩衝區。

日誌緩衝區較小,它是以字節爲單位的,它極其重要。

 

18:29:04 SQL>  show parameter log_buffer

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

log_buffer                           integer     7057408

 

*考點:日誌緩衝區的大小是不變的,啓動時就是固定值,只能手動設置,不能由SGA自動管理!

 

若是想讓它是一個最小值,這樣能夠作:

 

 

18:30:24 SQL> alter system set log_buffer =1 scope=spfile;  //修改動態參數文件,下次啓動有效。

18:31:20 SQL> startup force                

18:31:35 SQL> show parameter log_buffer;       

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

log_buffer                           integer     2927616            //這就是最小值了

 

4) large pool(可選)

 

爲了進行大的後臺進程操做而分配的內存空間,與shared pool管理不一樣,主要用於並行查詢,RMAN備份恢復、以及共享鏈接方式等。

 

5) java pool(可選)

 

爲了java虛擬機及應用而分配的內存空間,包含大量JAVA代碼。

 

6) stream pool(可選)

 

爲了stream應用而分配的內存空間。stream技術是爲了在不一樣數據庫之間共享數據,所以,它只對使用了stream數據庫特性的系統是重要的。

 

3.2 sga的自動管理

 

從Oracle10g有了SGA自動管理,有關的pool能夠動態自動調整

 

a)sga_max_size:SGA最大物理空間

 

b)sga_target:  SGA實際可達最大空間,sga_target<=sga_max_size,設定這個值>0時就使能了SGA的自動管理。

      

c)granules(顆粒):組成oracle內存的最小單位

        

      sga_max_size <1G ,4m

      sga_max_size >1G ,16m

 

20:12:30 SQL> select name ,bytes/1024/1024 "Size(M)" from v$sgainfo;     //在oracle裏查看SGA分配狀況                                                               

NAME                                Size(M)

-------------------------------- ----------

Fixed SGA Size                    1.2401123

Redo Buffers                     1.84765625

Buffer Cache Size                        56

Shared Pool Size                        152

Large Pool Size                           4

Java Pool Size                           12

Streams Pool Size                         4

Shared IO Pool Size                       0

Granule Size                              4

Maximum SGA Size                 403.089844

Startup overhead in Shared Pool          40

Free SGA Memory Available               172

            

4 Oracle的進程:

 

三種process: 1)user process、 2)server process 、3)background process

 

user process:屬於客戶端的process,通常分爲三種形式,1)sql*plus, 2)應用程序,3)web方式(OEM)

 

客戶端請求,sqlplus是客戶端命令,oracle不允許user process直接訪問oracle server。

 

*考點:由user process形成的會話終止,系統將自動回滾這個會話上的處於活動狀態的事務。

 

若是windows做爲客戶端:能夠經過查看任務管理器看到sqlplus用戶進程:

 

C:\Documents and Settings\timran>sqlplus sys/system@timran11g as sysdba

 

linux做爲客戶端時能夠使用ps看到sqlplus關鍵字:

 

[oracle@timran ~]$ ps -ef |grep sqlplus

oracle    2353  2325  0 17:02 pts/0    00:00:00 rlwrap sqlplus / as sysdba

oracle    2354  2353  0 17:03 pts/1    00:00:00 sqlplus   as sysdba

oracle    2603  2445  0 17:25 pts/2    00:00:00 grep sqlplus

 

server process:這是服務器端的進程,user process不能直接訪問Oracle,必須經過相應的server process訪問實例,進而訪問數據庫。

 

[oracle@timran ~]$ ps -ef |grep LOCAL

oracle    2399  2354  1 17:03 ?        00:00:04 oracletimran11g (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle    2503     1  0 17:05 ?        00:00:00 oracletimran11g (LOCAL=NO)

oracle    2512  2445  0 17:07 pts/2    00:00:00 grep LOCAL

[oracle@timran ~]$

 

//注意:在linux下看到的server process, (LOCAL=YES)是本地鏈接,(LOCAL=NO)是遠程鏈接。

 

backgroud process :

 

很是重要!有許多後臺進程,先掌握六個。查看方法 ps  、v$process 、v$bgprocess

     

----------查看後臺進程

 

[oracle@timran ~]$ ps -ef |grep ora_

oracle    2617     1  0 01:26 ?        00:00:00 ora_pmon_timran

oracle    2619     1  0 01:26 ?        00:00:00 ora_psp0_timran

oracle    2621     1  0 01:26 ?        00:00:00 ora_mman_timran

oracle    2623     1  0 01:26 ?        00:00:00 ora_dbw0_timran

oracle    2625     1  0 01:26 ?        00:00:00 ora_lgwr_timran

oracle    2627     1  0 01:26 ?        00:00:00 ora_ckpt_timran

oracle    2629     1  0 01:26 ?        00:00:00 ora_smon_timran

oracle    2631     1  0 01:26 ?        00:00:00 ora_reco_timran

oracle    2633     1  0 01:26 ?        00:00:00 ora_cjq0_timran

oracle    2635     1  0 01:26 ?        00:00:01 ora_mmon_timran

oracle    2637     1  0 01:26 ?        00:00:00 ora_mmnl_timran

oracle    2639     1  0 01:26 ?        00:00:00 ora_d000_timran

oracle    2641     1  0 01:26 ?        00:00:00 ora_s000_timran

oracle    2645     1  0 01:26 ?        00:00:00 ora_p000_timran

oracle    2647     1  0 01:26 ?        00:00:00 ora_p001_timran

oracle    2649     1  0 01:26 ?        00:00:01 ora_arc0_timran

oracle    2651     1  0 01:26 ?        00:00:00 ora_arc1_timran

oracle    2653     1  0 01:26 ?        00:00:00 ora_arc2_timran

oracle    2655     1  0 01:26 ?        00:00:00 ora_qmnc_timran

oracle    2661     1  0 01:26 ?        00:00:00 ora_q000_timran

oracle    2663     1  0 01:26 ?        00:00:00 ora_q001_timran

oracle    2676     1  0 01:29 ?        00:00:00 ora_j000_timran

oracle    2678  2486  0 01:29 pts/2    00:00:00 grep ora_

 

六個後臺進程(background process)

     

smon:系統監控進程

 

   在實例崩潰以後,Oracle會自動恢復實例。另外一個做用是整理數據文件的自由空間,將相鄰區域結合起來。釋放再也不使用的臨時段。

 

pmon:進程監控進程

 

   process monitor(監控session)清理出現故障的進程。 釋放全部當前掛起的鎖定。釋放故障進程使用的資源。

 

dbwr: 數據寫入進程

        

   一、將修改後的緩衝區(髒buffer)數據寫入數據文件中。寫髒塊。

 

   二、釋放data buffer空間。

 

   注意:如下幾種狀況發生時 dbwr都會寫

 

   1)ckpt發生,2)髒塊太多時,3)db_buffer自由空間不夠時,4)延遲發生,5)表空間redo only/offline/backup等

 

考點:commit時dbwn有何舉動?答案是:它什麼也不作!

           

lgwr:寫日誌條目,從redo log buffer到redo logfile (必須在dbwr寫髒塊以前寫入日誌)

 

   負責將日誌緩衝區中的日誌條目寫入日誌文件。 系統有多個日誌文件,該進程以循環的方式將數據寫入文件。

 

   注意:如下5個情況發生時, lgwr都會寫

 

   1)commit, 2)三分之一滿,3)1m滿,4)3秒, 5)先於dbwr寫而寫(先記後寫,即dbwn正好要執行寫入前)

    

ckpt:生成檢查點, 通知或督促dbwr寫髒塊

 

   徹底檢查點:保證數據一致性。增量檢查點:不斷更新控制文件中的檢查點位置,當發生實例崩潰時,能夠儘可能縮短實例恢復的時間,。

 

arcn:歸檔模式下,發生日誌切換時,把當前日誌組中的內容寫入歸檔日誌,做爲備份歷史日誌。

 

考點:lgwr負責對聯機日誌文件寫操做,arcn負責讀取聯機日誌文件。其餘進程與日誌文件不接觸。

 

11g裏又強調了其餘幾個後臺進程,它們都和數據庫性能有關,有關內容將在053課程介紹:

 

MMON: oracle自我監視和自我調整的支持進程(與AWR有關)

 

MMNL:MMON的輔助進程(與ASH有關)

 

MMAN:內存自動管理,10g時推出,11g獲得增強,在11g裏這個進程負責Oracle內存結構(SGA+PGA)的自動調整。

 

CJQN: 與job隊列有關

 

5 PGA

 

屬於oracle內存結構,存放用戶遊標、變量、控制、數據排序、存放hash值。與SGA不一樣,PGA是獨立的,非共享

 

從Oracle9i開始有了pga 的自動管理:

 

       workarea_size_policy   =auto ;

       pga_aggregate_target   >0 

 

因爲是pga的自動管理 hash_area_size,sort_area_size   這兩個參數如今已經不用了。

 

六、用戶與Oracle服務器的鏈接方式

 

6.1 專用鏈接模式(dedicated server process):

對於客戶端的每一個user process,服務器端都會出現一個server process,會話與專用服務器之間存在一對一的映射。

 

對專用鏈接來講,用戶在客戶端啓動了一個應用程序,例如sql*plus,就是在客戶端啓動一個用戶進程;與oracle服務器端鏈接成功後,會在服務器端生成一個服務器進程,該服務器進程做爲用戶進程的代理進程,代替客戶端執行各類命令並把結果返回給客戶端。用戶進程一旦停止,與之對應的服務器進程馬上停止。

 

專用鏈接的PGA的管理方式是私有的。如今,大多狀況下,oracle缺省採用專用鏈接模式。

 

6.2 共享鏈接模式(shared server process):

 

多個user process共享一個server process。它經過調度進程(dispatcher)與共享服務器鏈接,共享服務器實際上就是一種鏈接池機制(connectionpooling),鏈接池能夠重用已有的超時鏈接,服務於其它活動會話。但容易產生鎖等待。此種鏈接方式如今已經不多見了,可是在OCP11g考試中有幾個考點與其有關:

 

 

               用戶進程1                用戶進程2             用戶進程3

           . |-----------------------| .                   |   .

               .            |              .                   |   .

             ....... 調度進程1............                   調度進程2

                    .  |                                    |   .

                    .  |---------------    -----------------|   .

                    .                 |    |                    .

                    .                 |    |                    .

                         調度響應隊列1       |    |              調度響應隊列2

                                         .            公共請求隊列              .

                       .                 |                  .

                       .                 |                  .

                                         .              服務器進程              .

                       .                 |                  .

                       ..................|...................

 

*考點:

1)全部調度進程共享一個公共的輸入隊列,可是每一個調度進程都有與本身響應的隊列。

2)在共享服務器中會話是在SGA中的(UGA)存儲信息,而不像專用鏈接那樣在PGA中存儲信息,這時的PGA的存儲結構爲堆棧空間。

 

 

6.3 駐留鏈接池模式(database resident connection pooling,簡稱DRCP):

適用於必須維持數據庫的永久鏈接。結合了專用服務器模式和共享服務器模式的特色,它提供了服務器鏈接池,可是放入鏈接池的是專用服務器。它使用鏈接代理(而不是專用服務器)鏈接客戶機到數據庫,優勢是能夠用不多的內存處理大量併發鏈接(11g新特性,特別針對Apache的PHP應用環境)。

 

     

第二章:實例管理及數據庫的啓動/關閉

  

  

2.1 實例和參數文件

 

   一、instance 功能:用於管理和訪問database。

  

   二、init parameter files :管理實例相關啓動參數 。位置:$ORACLE_HOME/dbs

 

 

   三、pfile :靜態參數文件。1)文本文件,能夠經過編輯器進行修改參數。 2)修改參數必須關閉實例,下次重啓實例才生效。

命名方式:init+SID.ora

  

   四、spfile :動態參數文件。 1)二進制文件,不能夠經過編輯器修改。 2)Linux 下strings能夠查看

命名方式: spfile+SID.ora

 

修改動態參數文件方式:

alter system set 參數=值  默認是第三種

alter session set 參數=值

 

第一種scope=memory 參數修改馬上生效,但不修改spfile文件。

第二種scope=spfile 修改了spfile文件,重啓後生效。

第三種scope=both 前兩種都要知足。

 

若是不寫scope,即缺省,那就是第三種。

 

*考點:若是不將scope=spfile,將沒法更改靜態參數。

 

經過查看v$parameter ,能夠肯定那些參數能夠在memory修改,制定scope

 

10:38:35 SQL> desc v$parameter;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 NUM                                                NUMBER

 NAME                                               VARCHAR2(80)

 TYPE                                               NUMBER

 VALUE                                              VARCHAR2(512)

 DISPLAY_VALUE                                      VARCHAR2(512)

 ISDEFAULT                                          VARCHAR2(9)

 ISSES_MODIFIABLE                                   VARCHAR2(5)

 ISSYS_MODIFIABLE                                   VARCHAR2(9)

 ISINSTANCE_MODIFIABLE                              VARCHAR2(5)

 ISMODIFIED                                         VARCHAR2(10)

 ISADJUSTED                                         VARCHAR2(5)

 ISDEPRECATED                                       VARCHAR2(5)

 DESCRIPTION                                        VARCHAR2(255)

 UPDATE_COMMENT                                     VARCHAR2(255)

 HASH                                               NUMBER

 

其中:

ISSYS_MODIFIABLE參數:對應alter system 命令,即系統級修改

 

 

10:38:35 SQL> select distinct issys_modifiable from v$parameter;

 

ISSYS_MODIFIABLE

----------------

IMMEDIATE           //對應scope=memory

FALSE               //只能scope=spfile,即修改spfile文件,下次啓動才生效。

DEFERRED            //其餘session有效

 

ISSES_MODIFIABLE參數:對應alter session命令,即session級修改

 

10:38:35 SQL> select distinct isses_modifiable from v$parameter;

 

ISSES_MODIFIABLE

----------------

TRUE                //表示能夠修改

FALSE               //表示不能修改

 

 

10:38:35 select isses_modifiable,issys_modifiable from v$parameter where lower(name)='log_buffer';

 

ISSES_MODIFIABLE ISSYS_MODIFIABLE

---------------- ----------------

FALSE            FALSE

 

這個結果表示 log_buffer參數在session方式不能改,

在system方式memory不能改,both固然也不行,只能是spfile下次有效。

 

   五、startup時讀取參數文件,找到$ORACLE_HOME/dvs目錄,順序是優先spfile啓動,沒有spfile 才從pfile啓動。

        

pfile和spfile能夠相互生成:

 

SQL>create pfile from spfile

SQL>create spfile from pfile(使用spfile啓動後不能在線生成spfile,ORA-32002: 沒法建立已由實例使用的 SPFILE)

 

*考點:若是使用pfile啓動,設置scope=spfile將失敗!

 

能夠經過當前內存參數生成pfile和spfile(11g新特性):

 

SQL>create pfile from memory;

SQL>create spfile from memory;

 

有了spfile,pfile通常留作備用,特殊狀況也能夠使用pfile啓動,命令以下:

 

10:38:35 SQL> startup pfile=$ORACLE_HOME/dbs/inittimran.ora

              

10:38:35 SQL> show parameter spfile                                                                                                     

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      /u01/app/oracle/product/10.2.0

                                                 /db_1/dbs/spfileprod.ora

 

//若是value有值,說明數據庫啓動時讀的是spfile           

              

2.2 數據庫啓動與關閉:

 

2.2.1啓動分爲三個階段

  

1)nomount階段:讀取init parameter

                          

10:38:35 SQL> select status from v$instance;   (這條命令很實用,是看當前數據庫啓動的狀態,有三個 stated,mounted,open.)                                                                                         

STATUS

------------

STARTED

 

2)mount階段:  讀取控制文件

20:32:53 SQL> select status from v$instance;                                                                                            

STATUS

------------

MOUNTED             

            

3)open階段:  一、檢查全部的datafile、redo log、 group 、password file。  

           二、檢查數據庫的一致性(controlfile、datafile、redo file的檢查點是否一致)

             

10:38:35 SQL> select file#,checkpoint_change# from v$datafile;     //從控制文件讀出                                                                      

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1             570836

         2             570836

         3             570836

         4             570836

         5             570836

         6             570836

 

6 rows selected.

 

10:38:35 SQL> select file#,checkpoint_change# from v$datafile_header;            //從datafile header 讀出來                                                       

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1             570836

         2             570836

         3             570836

         4             570836

         5             570836

         6             570836

 

6 rows selected.

 

數據庫open以前要檢查controlfile所記錄SCN和datafile header 記錄的SCN是否一致;一致就正常打開庫,不一致須要作media recover

 

10:38:35 SQL> select status from v$instance;                                                                                      

STATUS

------------

OPEN          

                                                       

2.2.2 實例關閉:

    shutdown normal: 拒絕新的鏈接,等待當前事務結束,等待當前會話結束,生成檢查點

    shutdown transaction :拒絕新的鏈接,等待當前事務結束,生成檢查點

    shutdown immediate:  拒絕新的鏈接,未提交的事務回滾,生成檢查點  //默認

    shutdown abort(startup force) :事務不回滾,不生成檢查點,下次啓動須要作instance  recovery   

 

*考點:shutdown abort 不會損壞database。 

           

2.3 告警日誌:alert_SID.log

 

10:38:35 SQL> show parameter dump      //這是Oracle11g的。                                                                                     

SQL> show parameter dump

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

background_core_dump                 string      partial

background_dump_dest                 string      /u01/diag/rdbms/timran11g/timr

                                                 an11g/trace

core_dump_dest                       string      /u01/diag/rdbms/timran11g/timr

                                                 an11g/cdump

max_dump_file_size                   string      unlimited

shadow_core_dump                     string      partial

user_dump_dest                       string      /u01/diag/rdbms/timran11g/timr

                                                 an11g/trace

 

 

在oracle 11g中,故障診斷及跟蹤的文件路徑改變較大,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。

這兩份log文件的位置分別是V$DIAG_INFO中的Diag Alert 和Diag Trace 對應的目錄。

 

SQL> select * from v$diag_info;

 

   INST_ID NAME                                 VALUE

---------- ----------------------------------------     -----------------------------------------------------------------

         1 Diag Enabled                                 TRUE

         1 ADR Base                                     /u01

         1 ADR Home                                     /u01/diag/rdbms/timran11g/timran11g

         1 Diag Trace                                  /u01/diag/rdbms/timran11g/timran11g/trace

         1 Diag Alert                                   /u01/diag/rdbms/timran11g/timran11g/alert

         1 Diag Incident                                /u01/diag/rdbms/timran11g/timran11g/incident

         1 Diag Cdump                                   /u01/diag/rdbms/timran11g/timran11g/cdump

         1 Health Monitor                           /u01/diag/rdbms/timran11g/timran11g/hm

         1 Default Trace File                       /u01/diag/rdbms/timran11g/timran11g/trace/timran11g_ora_3381.trc

         1 Active Problem Count                                             0

         1 Active Incident Count                                            0

 

 

其中Diag Trace對應的目錄爲文本格式的告警日誌,及咱們在10g中常常習慣使用的日誌

 

[oracle@timran trace]$ tail -f /u01/diag/rdbms/timran11g/timran11g/trace/alert_timran11g.log

space available in the underlying filesystem or ASM diskgroup.

Tue Sep 04 09:12:19 2012

Completed: ALTER DATABASE OPEN

Tue Sep 04 09:16:41 2012

Starting background process CJQ0

Tue Sep 04 09:16:41 2012

CJQ0 started with pid=29, OS id=2483

Tue Sep 04 10:19:11 2012

drop tablespace tb1

Completed: drop tablespace tb1

 

 

2.4 口令文件

 

oracle登陸認證方式有多種

 

sys的兩種經常使用的登陸認證方式:OS認證和口令文件認證,

 

1)OS認證:Oracle不驗證用戶密碼,條件:用戶必須屬於DBA組,且使用本地登陸

 

如:sqlplus / as sysdba

 

2)口令文件認證:是一種遠程認證方式,只有sysdba權限的用戶能夠使用口令文件,必須輸入密碼和網路鏈接符。

 

如:sqlplus sys/oracle@timran11g as sysdba

 

普通用戶,沒有sysdba權限的用戶,好比system 、scott,或者是tim什麼的,登陸時都必須輸入口令,無論是本地仍是遠程,它們的口令密碼不是以文件形式存放的,它們存放在oracle內部的數據字典裏。

經過設置這個參數爲TURE,可讓口令是大小寫敏感的(11g新特性)

 

本節討論的口令文件是sysdba用戶的遠程登陸認證密碼文件,主要用於sys用戶遠程登陸的認證。

 

位置:$ORACLE_HOME/dbs/orapwSID.

 

SQL> show parameter case

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sec_case_sensitive_logon             boolean     TRUE

 

因此口令文件,指的就是sys的口令文件,能夠經過remote_login_passwordfile參數控制是否生效

 

參數remote_login_passwordfile的三種模式:

 

  1) none 拒絕sys用戶從遠程鏈接

  2)exclusive sys用戶能夠從遠程鏈接

  3)share 多個庫能夠共享口令文件

           

 

[oracle@timran ~]$ cd /u01/oracle/dbs

[oracle@timran dbs]$ ll

總計 52

-rw-rw---- 1 oracle oinstall  1544 08-17 07:19 hc_timran11g.dat

-rw-r--r-- 1 oracle oinstall 12920 2001-05-03 initdw.ora

-rw-r--r-- 1 oracle oinstall  8385 1998-09-11 init.ora

-rw-r--r-- 1 oracle oinstall  1024 08-17 13:23 inittimran11g.ora

-rw-r----- 1 oracle oinstall    24 08-17 07:21 lkTIMRAN11

-rw-r----- 1 oracle oinstall    24 08-17 10:36 lkTIMRAN11G

-rw-r----- 1 oracle oinstall  1536 08-31 10:47 orapwtimran11g

-rw-r----- 1 oracle oinstall  3584 09-04 17:49 spfiletimran11g.ora

 

這裏是放參數文件和(sys)口令文件的地方,orapwtimran11g就是個人sys口令文件

 

使用orapwd命令建立sys口令文件:

 

你能夠先刪掉它,再建立它,在linux下作:

 

[oracle@timran dbs]$ rm orapwtimran11g      //把sys口令文件刪了

[oracle@timran dbs]$ ll

總計 48

-rw-rw---- 1 oracle oinstall  1544 08-17 07:19 hc_timran11g.dat

-rw-r--r-- 1 oracle oinstall 12920 2001-05-03 initdw.ora

-rw-r--r-- 1 oracle oinstall  8385 1998-09-11 init.ora

-rw-r--r-- 1 oracle oinstall  1024 08-17 13:23 inittimran11g.ora

-rw-r----- 1 oracle oinstall    24 08-17 07:21 lkTIMRAN11

-rw-r----- 1 oracle oinstall    24 08-17 10:36 lkTIMRAN11G

-rw-r----- 1 oracle oinstall  3584 09-04 17:54 spfiletimran11g.ora

 

[oracle@timran dbs]$orapwd file=orapwtimran11g password=oracle entries=5 force=y   //從新創建口令文件

 

注意:file=orapw+sid的寫法

 

entries的含義是表示口令文件中能夠存放的最大用戶數,對應於容許以SYSDBA/SYSOPER權限登陸數據庫的最大用戶數,若是用戶數超過這個值只能重建口令文件。

        

2.5 添加scott 案例

 

有時候,scott用戶被誤刪掉了,沒關係,能夠經過執行下列腳本從新創建。

 

10:38:35 SQL> @$ORACLE_HOME/rdbms/admin/utlsampl.sql

 

你們能夠試一下:先刪除scott用戶,再執行一下腳本便可。(不是全部案例都有恢復腳本,HR就沒有)

 

 

第三章:控制文件

 

3.1 控制文件的功能和特色:

       1)定義數據庫當前物理狀態

       2)維護數據的一致性

       3)二進制文件

       4)在mount階段被讀取

       5)記錄RMAN備份恢復信息

      

查看database控制文件位置:

 

19:02:27 SQL> show parameter control_file

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time        integer     7

control_files                        string      /u01/oradata/timran11g/control01.

                                                 ctl, /u01/oradata/timran11g/contr

                                                 ol02.ctl, /u01/oradata/timran11g/

                                                 control03.ctl

19:02:42 SQL> select name from v$controlfile;

 

NAME

-----------------------------------------------------------------------------------------------------

/u01/oradata/timran11g/control01.ctl

/u01/oradata/timran11g/control02.ctl

/u01/oradata/timran11g/control03.ctl

 

      

3.2 控制文件的內容

        

19:02:59 SQL> alter database backup controlfile to trace; //生成了重作控制文件腳本,存放的位置:注意10g和11g有很大不一樣。

 

19:03:18 SQL> show parameter dump

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

background_core_dump                 string      partial

background_dump_dest                 string      /u01/diag/rdbms/timran11g/timr

                                                 an11g/trace

core_dump_dest                       string      /u01/diag/rdbms/timran11g/timr

                                                 an11g/cdump

max_dump_file_size                   string      unlimited

shadow_core_dump                     string      partial

user_dump_dest                       string      /u01/diag/rdbms/timran11g/timr

                                                 an11g/trace

 

能夠看到11g的dump路徑和命名方式較10g改動較大,

10g中的bdump與udump合併到了一塊兒,目錄都是 /u01/diag/rdbms/timran11g/timran11g/trace

trace的內容存放在該目錄的最新的那個.trc裏。

                                   

[oracle@timran trace]$ $ ls -trl *.trc   //在linux下,-trl參數能夠按時間排列出.trc名字

[oracle@timran trace]$ $ cat timran11g_ora_2407.trc         //顯示出在這個.trc文件裏的一段內容

           

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "TIMRAN11" NORESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 '/u01/oradata/timran11g/redo01.log'  SIZE 50M,

  GROUP 2 '/u01/oradata/timran11g/redo02.log'  SIZE 50M,

  GROUP 3 '/u01/oradata/timran11g/redo03.log'  SIZE 50M

-- STANDBY LOGFILE

DATAFILE

  '/u01/oradata/timran11g/system01.dbf',

  '/u01/oradata/timran11g/sysaux01.dbf',

  '/u01/oradata/timran11g/undotbs01.dbf',

  '/u01/oradata/timran11g/users01.dbf',

  '/u01/oradata/timran11g/example01.dbf'

CHARACTER SET ZHS16GBK

;

     

3.3 控制文件多元化                                   

 

    1)配置多個control_files,控制文件最好有三個,是相互鏡像的(shutdown下cp命令複製便可),而後修改spfile中的control_files參數,Oracle建議分配在不一樣的物理磁盤上。

 

*考點:最多能夠有8個control files多路複用。

   

19:10:25 SQL> alter system set control_files='/u01/oradata/timran11g/control01.ctl','/u01/disk1/control02.ctl','/u01/disk1/control03.ctl' scope=spfile;

 

System altered.

 

    2)三個control文件要一致(同一版本,scn相同),原本就是鏡像關係

 

-rw-r----- 1 oracle oinstall    7356416 07-16 20:00 control01.ctl

-rw-r----- 1 oracle oinstall    7356416 07-16 20:01 control02.ctl

-rw-r----- 1 oracle oinstall    7356416 07-16 20:01 control03.ctl

 

 

    3)控制文件查看:v$controlfile 、show parameter controlfile、 v$parameter

              

3.4 控制文件的重建與備份

   

        1.trace: 用於控制文件重建 (生成的trace 文件在udump)

19:59:24 SQL> alter database backup controlfile to trace;

   

或者 SQL>alter database backup controlfile to trace as '/u01/oradata/timran11g/con.trace';  //存到本身起的文件名裏。

 

Database altered.           

   

        2.binary 文件:控制文件的備份

20:00:20 SQL> alter database backup controlfile to '/u01/oradata/timran11g/con.bak';

 

Database altered.

 

 

3.5 控制文件手工恢復

 

1)單個文件,假設使用的是spfile指定的控制文件之一損壞了:

數據庫關閉下,使用操做系統命令複製其副本到指定的位置。

 

2)全部的控制文件丟失,(正常關閉,shutdown immediate後刪除控制文件)

 

假設控制文件的備份也沒有,利用前面作的trace文件從新生成控制文件

 

在nomount 狀態下執行前面曾作過的trace腳本

 

15:37:16 SQL> startup force nomount

ORACLE instance started.

 

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size             113247848 bytes

Database Buffers          163577856 bytes

Redo Buffers                7168000 bytes

15:37:49 SQL> CREATE CONTROLFILE REUSE DATABASE "TIMRAN" NORESETLOGS  ARCHIVELOG

15:37:52   2      MAXLOGFILES 16

15:37:52   3      MAXLOGMEMBERS 3

15:37:52   4      MAXDATAFILES 100

15:37:52   5      MAXINSTANCES 8

15:37:52   6      MAXLOGHISTORY 292

15:37:52   7  LOGFILE

15:37:52   8    GROUP 1 '/u01/oradata/timran11g/redo01.log'  SIZE 50M,

15:37:52   9    GROUP 2 '/u01/oradata/timran11g/redo02.log'  SIZE 50M,

15:37:52  10    GROUP 3 '/u01/oradata/timran11g/redo03.log'  SIZE 50M

15:37:52  11  -- STANDBY LOGFILE

15:37:52  12  DATAFILE

15:37:52  13    '/u01/oradata/timran11g/system01.dbf',

15:37:52  14    '/u01/oradata/timran11g/undotbs01.dbf',

15:37:52  15    '/u01/oradata/timran11g/sysaux01.dbf',

15:37:52  16    '/u01/oradata/timran11g/users01.dbf',

15:37:52  17    '/u01/oradata/timran11g/example01.dbf',

15:37:52  18    '/u01/oradata/timran11g/test01.dbf'

15:37:52  19  CHARACTER SET ZHS16GBK

15:37:52  20  ;

 

Control file created.               //三個控制文件又從新創建了。

 

 

SQL> select file#,checkpoint_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            5629150

         2            5629150

         3            5629150

         4            5629150

         5            5629150

         6            5629150

 

 

SQL> select file#,checkpoint_change# from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            5629150

         2            5629150

         3            5629150

         4            5629150

         5            5629150

         6            5629150

 

 

15:39:49 SQL> alter database open;

 

2)全部的控制文件丟失,利用控制文件備份恢復控制文件(非正常關閉,shutdown abort 後刪除控制文件或直接操做系統下刪除,有點複雜,留在053備份恢復中再介紹吧)

 

 

第四章: redo 日誌

 

4.1 redo (重作) log 的功能:數據recovery

4.2 redo log 特徵:

     1)記錄數據庫的變化(DML、DDL)

     2) 用於數據塊的recover

     3)以組的方式管理redo file ,最少兩組redo ,循環使用

     4)和數據文件存放到不一樣的磁盤上,需讀寫速度快的磁盤(好比採用RAID10)

    

     日誌切換:

        1)歸檔模式:將歷史日誌進行保存

        2)非歸檔: 歷史日誌被覆蓋

        3)併產生checkpoint,通知redo log 所對應的 dirty block 從data buffer寫入到datafile,而且更新控制文件

       

4.3 redo 日誌組

     1)最少兩組(考點),最好每組有兩個成員(考點),並存放到不一樣的磁盤上,大小形同,互相鏡像

     2)日誌在組寫滿時發生切換,或手工切換: alter system switch logfile ;

     3)在歸檔模式,日誌進行歸檔,並把相關的信息寫入controlfile

 

4.4 如何添加日誌組

 

15:49:43 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1        143   52428800          1 YES INACTIVE               2144594 17-7月 -12

         2          1        144   52428800          1 NO  CURRENT                2145200 17-7月 -12

         3          1        142   52428800          1 YES INACTIVE               2113981 17-7月 -12

 

15:50:31 SQL> col member for a50;

15:50:47 SQL> select group#, member from v$logfile;

 

    GROUP# MEMBER

---------- --------------------------------------------------

         1 /u01/oradata/timran11g/redo01.log

         3 /u01/oradata/timran11g/redo03.log

         2 /u01/oradata/timran11g/redo02.log

 

增長一個組group4,

 

15:53:53 SQL> alter database add logfile '/u01/oradata/timran11g/redo04.log' size 50m;

 

15:53:56 SQL> select group#, member from v$logfile order by group#;

 

    GROUP# MEMBER

---------- --------------------------------------------------

         1 /u01/oradata/timran11g/redo01.log

         2 /u01/oradata/timran11g/redo02.log

         3 /u01/oradata/timran11g/redo03.log

         4 /u01/oradata/timran11g/redo04.log

 

 

15:55:27 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1        143   52428800          1 YES INACTIVE               2144594 17-7月 -12

         2          1        144   52428800          1 NO  CURRENT                2145200 17-7月 -12

         3          1        142   52428800          1 YES INACTIVE               2113981 17-7月 -12

         4          1          0   52428800          1 YES UNUSED                       0

 

//切換日誌組

alter system switch logfile;

 

4.5 如何添加日誌組的成員

 

加member爲每一個組(一共是4個組)

先建好目錄,準備放在/u01/disk2/timran/下

[oracle@timran timran]$ mkdir -p /u01/disk2/timran

[oracle@timran timran]$

 

16:00:39 SQL> alter database add logfile member

'/u01/disk2/timran/redo01b.log' to group 1,

'/u01/disk2/timran/redo02b.log' to group 2,

'/u01/disk2/timran/redo03b.log' to group 3,

'/u01/disk2/timran/redo04b.log' to group 4;

Database altered.

 

SQL> select group#,member,status from v$logfile;

 

    GROUP# MEMBER                                                                           STATUS

---------- -------------------------------------------------------------------------------- -------

         3 /u01/oradata/timran11g/redo03.log                                                

         2 /u01/oradata/timran11g/redo02.log                                               

         1 /u01/oradata/timran11g/redo01.log                                               

         4 /u01/oradata/timran11g/redo04.log                                               

         1 /u01/disk2/timran/redo01b.log                                                    INVALID

         2 /u01/disk2/timran/redo02b.log                                                    INVALID

         3 /u01/disk2/timran/redo03b.log                                                    INVALID

         4 /u01/disk2/timran/redo04b.log                                                    INVALID

 

 

 

 

16:01:54 SQL> select * from v$log;      //看到MEMBERS列已是2了

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1        143   52428800          2 YES INACTIVE               2144594 17-7月 -12

         2          1        144   52428800          2 NO  CURRENT                2145200 17-7月 -12

         3          1        142   52428800          2 YES INACTIVE               2113981 17-7月 -12

         4          1          0   52428800          2 YES UNUSED                       0

 

16:03:06 SQL> alter system switch logfile;  //多作幾回切換,消除invalid  //同步組裏的member,這步很重要。

 

4.6 如何查看日誌信息

 

16:03:13 SQL> select * from v$log;

                       歸檔日誌排的號

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1        143   52428800          2 YES INACTIVE               2144594 17-7月 -12

         2          1        144   52428800          2 YES ACTIVE                 2145200 17-7月 -12

         3          1        142   52428800          2 YES INACTIVE               2113981 17-7月 -12

         4          1        145   52428800          2 NO  CURRENT                2146613 17-7月 -12

 

 說明一下v$log這個重要的視圖

 

 status有四個狀態:

 

 unused:    新添加的日誌組,尚未使用

 inactive:  日誌組對應的髒塊已經從data buffer寫入到data file ,能夠覆蓋

 active:    日誌組對應的髒塊尚未從data buffer寫入到data file,不能被覆蓋

 current:   當前日誌組,日誌組對應的髒塊尚未從data buffer寫入到data file,不能被覆蓋

 

 thread:   線程(經過後臺進程lgwr 啓動),在單實例的環境下,thread# 永遠是1

 sequence: 日誌序列號。在日誌切換時會遞增。

 FIRST_CHANGE#: 在當前日誌中記錄的首個數據塊的scn。(當事務完成的時候會在數據塊上寫入一個scn,表明數據塊的變化)。

 

 

4.7 redo 日誌成員重命名或遷移

 

16:11:08 SQL> select group#,member from v$logfile order by 1;

 

    GROUP# MEMBER

---------- --------------------------------------------------

         1 /u01/oradata/timran11g/redo01.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/oradata/timran11g/redo02.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         3 /u01/oradata/timran11g/redo03.log

         4 /u01/disk2/timran/redo04b.log

         4 /u01/oradata/timran11g/redo04.log

 

假設/u01/oradata/timran11g/目錄下的4個log文件都損壞了,看如何遷移改名。

 

16:12:03 SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

16:12:30 SQL>

 

創建目錄/u01/disk3/timran/

 

[oracle@timran timran]$ mkdir -p /u01/disk3/timran

[oracle@timran timran]$

[oracle@timran timran]$ cp /u01/disk2/timran/redo01b.log /u01/disk3/timran/redo01a.log

[oracle@timran timran]$ cp /u01/disk2/timran/redo02b.log /u01/disk3/timran/redo02a.log

[oracle@timran timran]$ cp /u01/disk2/timran/redo03b.log /u01/disk3/timran/redo03a.log

[oracle@timran timran]$ cp /u01/disk2/timran/redo04b.log /u01/disk3/timran/redo04a.log

[oracle@timran timran]$

 

16:15:19 SQL> startup mount

ORACLE instance started.

 

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size             117442152 bytes

Database Buffers          159383552 bytes

Redo Buffers                7168000 bytes

Database mounted.

16:15:26 SQL>

 

16:16:05 SQL> col member for a50;

16:16:08 SQL> select group# ,member from v$logfile order by 1;

 

    GROUP# MEMBER

---------- --------------------------------------------------

         1 /u01/oradata/timran11g/redo01.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/oradata/timran11g/redo02.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         3 /u01/oradata/timran11g/redo03.log

         4 /u01/disk2/timran/redo04b.log

         4 /u01/oradata/timran11g/redo04.log

 

16:18:05 SQL> alter database rename file '/u01/oradata/timran11g/redo01.log' to '/u01/disk3/timran/redo01a.log';

 

16:18:34 SQL> alter database rename file '/u01/oradata/timran11g/redo02.log' to '/u01/disk3/timran/redo02a.log';

 

16:18:45 SQL> alter database rename file '/u01/oradata/timran11g/redo03.log' to '/u01/disk3/timran/redo03a.log';

 

16:20:16 SQL> alter database rename file '/u01/oradata/timran11g/redo04.log' to '/u01/disk3/timran/redo04a.log';

 

16:21:35 SQL> select group# ,member from v$logfile order by 1;

 

    GROUP# MEMBER

---------- --------------------------------------------------

         1 /u01/disk3/timran/redo01a.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/disk3/timran/redo02a.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         3 /u01/disk3/timran/redo03a.log

         4 /u01/disk2/timran/redo04b.log

         4 /u01/disk3/timran/redo04a.log

 

16:21:55 SQL> alter database open;

 

23:52:06 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1        143   52428800          2 YES INACTIVE               2144594 17-7月 -12

         2          1        144   52428800          2 YES INACTIVE               2145200 17-7月 -12

         3          1        142   52428800          2 YES INACTIVE               2113981 17-7月 -12

         4          1        145   52428800          2 NO  CURRENT                2146613 17-7月 -12

 

 

23:52:15 SQL> select group#,member,status from v$logfile;

 

    GROUP# MEMBER                                             STATUS

---------- -------------------------------------------------- -------

         1 /u01/disk3/timran/redo01a.log                    

         3 /u01/disk3/timran/redo03a.log                      STALE

         2 /u01/disk3/timran/redo02a.log

         4 /u01/disk3/timran/redo04a.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log                      STALE

         4 /u01/disk2/timran/redo04b.log

 

23:52:25 SQL> alter system switch logfile;          //出現stale沒關係,代表文件內容不徹底,作幾回切換就能夠了。

23:52:28 SQL> /

23:52:30 SQL> /

                   

23:52:32 SQL> select group#,member,status from v$logfile;

 

    GROUP# MEMBER                                             STATUS

---------- -------------------------------------------------- -------

         1 /u01/disk3/timran/redo01a.log

         3 /u01/disk3/timran/redo03a.log

         2 /u01/disk3/timran/redo02a.log

         4 /u01/disk3/timran/redo04a.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         4 /u01/disk2/timran/redo04b.log

 

 

4.八、日誌恢復

 

例一、多元化成員中,單個成員(inactive)丟失

 

00:06:15 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1          6   52428800          2 YES INACTIVE               2152079 18-7月 -12

         2          1          7   52428800          2 YES ACTIVE                 2152084 18-7月 -12

         3          1          8   52428800          2 NO  CURRENT                2152087 18-7月 -12

         4          1          5   52428800          2 YES INACTIVE               2152076 18-7月 -12

 

[oracle@timran ~]$ cd /u01/disk3/timran

[oracle@timran timran]$ ll

鎬昏 205040

-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo01a.log

-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo02a.log

-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo03a.log

-rw-r----- 1 oracle oinstall 52429312 07-17 23:52 redo04a.log

 

[oracle@timran timran]$ rm redo01a.log

00:10:11 SQL> startup force

00:18:29 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1          6   52428800          2 YES INACTIVE               2152079 18-7月 -12

         2          1          7   52428800          2 YES INACTIVE               2152084 18-7月 -12

         3          1          8   52428800          2 YES INACTIVE               2152087 18-7月 -12

         4          1          9   52428800          2 NO  CURRENT                2172107 18-7月 -12

 

00:19:02 SQL> select group#,member,status from v$logfile;

 

    GROUP# MEMBER                                             STATUS

---------- -------------------------------------------------- -------

         1                                       INVALID       //invalid代表該文件不可訪問

         3 /u01/disk3/timran/redo03a.log

         2 /u01/disk3/timran/redo02a.log

         4 /u01/disk3/timran/redo04a.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         4 /u01/disk2/timran/redo04b.log   

 

00:19:12 SQL>

 

告警日誌:

Linux Error: 2: No such file or directory

Additional information: 3

Wed Jul 18 00:16:25 2012

Errors in file /u01/admin/timran/bdump/timran_lgwr_2807.trc:

ORA-00321: log 1 of thread 1, cannot update log file header

ORA-00312: online log 1 thread 1: '/u01/disk3/timran/redo01a.log'

Wed Jul 18 00:16:25 2012

 

解決:

直接在open方式下複製這個member,爲什麼能夠?由於是這個group是inactive狀態!

 

[oracle@timran timran]$ cp /u01/disk2/timran/redo01b.log /u01/disk3/timran/redo01a.log

00:25:54 SQL> alter system switch logfile;      //切換時會同步,把invalid狀態消除掉。

00:25:57 SQL> select group#,member,status from v$logfile;

 

    GROUP# MEMBER                                             STATUS

---------- -------------------------------------------------- -------

         1 /u01/disk3/timran/redo01a.log

         3 /u01/disk3/timran/redo03a.log

         2 /u01/disk3/timran/redo02a.log

         4 /u01/disk3/timran/redo04a.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         4 /u01/disk2/timran/redo04b.log

 

 

例2 非當前日誌組全部成員丟失

 

00:32:47 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1         14   52428800          2 YES INACTIVE               2172644 18-7月 -12

         2          1         15   52428800          2 NO  CURRENT                2172646 18-7月 -12

         3          1         12   52428800          2 YES INACTIVE               2172247 18-7月 -12

         4          1         13   52428800          2 YES INACTIVE               2172250 18-7月 -12

 

 

00:33:45 SQL> shutdown immediate

[oracle@timran timran]$ rm /u01/disk3/timran/redo04a.log

[oracle@timran timran]$ rm /u01/disk2/timran/redo04b.log

 

SQL> startup

 

ORA-00313: open failed for members of log group 4 of thread 1

ORA-00312: online log 4 thread 1: '/u01/disk3/timran/redo04a.log'

ORA-00312: online log 4 thread 1: '/u01/disk2/timran/redo04b.log'

 

00:37:31 SQL> alter database clear logfile group 4;     //注意:這一步使剛纔在os裏刪掉的那兩個group4的文件又創建上了。

 

[oracle@timran timran]$ ll

總計 205040

-rw-r----- 1 oracle oinstall 52429312 07-18 00:44 redo01b.log

-rw-r----- 1 oracle oinstall 52429312 07-18 00:38 redo02b.log

-rw-r----- 1 oracle oinstall 52429312 07-18 00:38 redo03b.log

-rw-r----- 1 oracle oinstall 52429312 07-18 00:43 redo04b.log

 

00:45:02 SQL> alter database open;

 

SQL>  select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1         25   52428800          2 YES      INACTIVE               7025904 2013-2-19 2

         2          1         26   52428800          2 YES      INACTIVE               7025907 2013-2-19 2

         3          1         27   52428800          2 NO       CURRENT                7025955 2013-2-19 2

         4          1          0   52428800          2 YES      UNUSED                 7025902 2013-2-19 2

 

 

例3 當前日誌組丟失。非正常關庫,直接從os下刪除當前日誌組的全部member,模擬數據庫open狀態下 current log損壞

 

[oracle@timran timran]$ rm /u01/disk3/timran/redo01a.log

[oracle@timran timran]$ rm /u01/disk2/timran/redo01b.log

[oracle@timran timran]$

 

01:10:11 SQL> alter system switch logfile;  切一下,觸動它一下。

 

System altered.

 

告警日誌

Wed Jul 18 01:11:04 2012

Errors in file /u01/admin/timran/bdump/timran_arc1_3269.trc:

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: '/u01/disk2/timran/redo01b.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-00312: online log 1 thread 1: '/u01/disk3/timran/redo01a.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

 

 

01:13:33 SQL> select group#,member,status from v$logfile;

 

    GROUP# MEMBER                                             STATUS

---------- -------------------------------------------------- -------

         1 /u01/disk3/timran/redo01a.log

         3 /u01/disk3/timran/redo03a.log

         2 /u01/disk3/timran/redo02a.log

         4 /u01/disk3/timran/redo04a.log

         1 /u01/disk2/timran/redo01b.log

         2 /u01/disk2/timran/redo02b.log

         3 /u01/disk2/timran/redo03b.log

         4 /u01/disk2/timran/redo04b.log

 

01:13:40 SQL> alter system switch logfile;

 

System altered.

 

01:13:53 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------

         1          1          5   52428800          2 NO  ACTIVE                 2194945 18-7月 -12

         2          1          6   52428800          2 NO  ACTIVE                 2195228 18-7月 -12

         3          1          7   52428800          2 NO  CURRENT                2195296 18-7月 -12

         4          1          4   52428800          2 YES INACTIVE               2194943 18-7月 -12

 

暫時好像沒有什麼問題發生,繼續切換,當current 又轉會到group1時,死機!

 

01:17:44 SQL> startup force

 

ORA-00313: 沒法打開日誌組 1 (用於線程 1) 的成員

ORA-00312: 聯機日誌 1 線程 1: '/u01/disk3/timran/redo01a.log'

ORA-00312: 聯機日誌 1 線程 1: '/u01/disk2/timran/redo01b.log'

 

SQL> alter database clear logfile group 1;

alter database clear logfile group 1

*

第 1 行出現錯誤:

ORA-00350: 日誌 1 (實例 timran11g 的日誌, 線程 1) 須要歸檔

ORA-00312: 聯機日誌 1 線程 1: '/u01/disk3/timran/redo01a.log'

ORA-00312: 聯機日誌 1 線程 1: '/u01/disk2/timran/redo01b.log'

 

SQL> alter database clear unarchived logfile group 1;

 

SQL> alter database open;

 

說明以下:當前日誌損壞是一種嚴重的故障,面臨的狀況也比較複雜。

 

1)若是數據庫模式是archived的,當前日誌損壞,能夠先嚐試強制清除。

 

alter database clear unarchived logfile group n;

 

這步若是能成功,打開數據庫後要作數據庫全備(考點)。由於open前的當前日誌已經壞掉沒法真正歸檔,那麼未來的前滾可能會有問題。

 

2)若是clear unarchived不能成功嘗試,只好準備把當前日誌甩掉,去作基於日誌的不徹底恢復。

 

SQL> recover database until cancel;

SQL> alter database open resetlogs;

 

3)若是嚴重到使用resetlogs也不能打開數據庫,能夠試試下面的最後一招:

 

修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE 

該參數的含義是:容許在破壞一致性的狀況下強制重置日誌,打開數據庫。_allow_resetlogs_corruption將使用全部數據文件最舊的SCN打開數據庫,因此一般來說須要保證SYSTEM表空間擁有最舊的SCN。在強制打開數據庫以後,可能由於各類緣由會有ora-600錯誤。

 

[oracle@work dbs]$ vi inittest11g.ora

 

_allow_resetlogs_corruption=TRUE

*.background_dump_dest='$ORACLE_BASE/admin/test/bdump'

*.control_files='/u01/app/oracle/oradata/test/control01.ctl','/disk1/oradata/test/control02.ctl','/disk2/oradata/test/control03.ctl'

*.core_dump_dest='$ORACLE_BASE/admin/test/cdump'

*.db_block_size=8192

*.db_cache_size=80M#DEMO

*.db_file_multiblock_read_count=16

*.db_name='test'

*.optimizer_mode='choose'

*.parallel_threads_per_cpu=4#SMALL

*.pga_aggregate_target=10485760

*.query_rewrite_enabled='true'

*.query_rewrite_integrity='trusted'

*.shared_pool_size=60M#DEMO

*.star_transformation_enabled='true'

*.undo_management='auto'

*.undo_tablespace='rtbs'

*.user_dump_dest='$ORACLE_BASE/admin/test/udump'

 

//再以pfile 啓動instance 到mount狀態,而後 alter database open resetlogs

//這是在不一致狀態下強行打開了數據庫,建議作一個邏輯全備。

 

 

4.9 使日誌恢復到原來的配置

 

嘗試使用OEM方式恢復原狀。最後,驗證無誤後刪掉/u01/disk2和/u01/disk3目錄。

 

[oracle@timran timran]$ rm -rf /u01/disk2

[oracle@timran timran]$ rm -rf /u01/disk3

 

 

第五章: 歸檔日誌 archivelog

 

5.1 歸檔和非歸檔的區別

     1)歸檔會在日誌切換時,備份歷史日誌,用於OLTP(dml操做比較多),能夠進行冷備(mont下)份和熱備份(數據庫打開),能夠實現數據庫徹底恢復、不徹底恢復(基於時間點)

     2)歸檔會啓用arcn的後臺進程、佔用磁盤空間

     3)非歸檔用於OLAP/DSS,只能冷備份,只能恢復到最後一次備份狀態

補充:olap  (select操做比較多)

 

5.2 查看歸檔模式:

    

02:34:50 SQL>archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /u01/disk1/timran/

Oldest online log sequence     1

Next log sequence to archive   2

Current log sequence           2

 

5.3 設置歸檔模式

02:35:50 SQL> shutdown immediate    //這裏shutdown 必定要immediate方式

Database closed.

Database dismounted.

ORACLE instance shut down.

 

02:36:40 SQL> startup mount     //到mount下設置

 

02:37:50 SQL>alter database noarchivelog;

 

Database altered.

 

02:37:55 SQL> archive log list;

Database log mode              No Archive Mode     

Automatic archival             Disabled

Archive destination            /u01/disk1/timran/

Oldest online log sequence     1

Current log sequence           2

 

02:38:15 SQL> alter database archivelog;        //換回來,不要No Archive Mode

 

02:38:30 SQL> alter database open;

 

5.四、歸檔日誌的路徑及命名方法

 

指定歸檔日誌存放處及命名

 

注意:另外指定並不意味着你要取消閃回恢復區的參數,由於這個閃回恢復區不只歸檔日誌,還有RMAN的備份及閃回日誌等等。

 

02:39:20 SQL> show parameter archive

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                   integer     0

log_archive_config                   string

log_archive_dest                     string

log_archive_dest_1                   string      location=/u01/disk1/timran/ ma

                                                 ndatory

log_archive_dest_10                  string

log_archive_dest_2                   string

log_archive_dest_3                   string

log_archive_dest_4                   string

log_archive_dest_5                   string

log_archive_dest_6                   string

log_archive_dest_7                   string

log_archive_dest_8                   string

log_archive_dest_9                   string

log_archive_dest_state_1             string      enable

log_archive_dest_state_10            string      enable

log_archive_dest_state_2             string      enable

log_archive_dest_state_3             string      enable

log_archive_dest_state_4             string      enable

log_archive_dest_state_5             string      enable

log_archive_dest_state_6             string      enable

log_archive_dest_state_7             string      enable

log_archive_dest_state_8             string      enable

log_archive_dest_state_9             string      enable

log_archive_duplex_dest              string

log_archive_format                   string      arch_%t_%r_%s.log

log_archive_local_first              boolean     TRUE

log_archive_max_processes            integer     2

log_archive_min_succeed_dest         integer     1

log_archive_start                    boolean     FALSE

log_archive_trace                    integer     0

remote_archive_enable                string      true

standby_archive_dest                 string      ?/dbs/arch

 

 

主要看這兩個參數:

log_archive_dest_n

log_archive_format

 

log_archive_dest_n (n:1-10) 表示能夠有10個目標路徑存放歸檔日誌(鏡像關係),便可以多路複用10個歸檔日誌的備份。如上顯示我只使用了log_archive_dest_1,也就是說只有一套歸檔日誌,沒有作鏡像,如果生產系統最好能再作一個鏡像。

 

若是你沒有指定log_archive_dest_n,那麼系統隱含的將log_archive_dest_10指向了閃回恢復區(flashback revovery area),這個閃回恢復區不只默認的存放歸檔日誌,還有RMAN的備份及閃回日誌等等。

 

使用log_archive_dest_n就不要使用log_archive_dest參數了

 

SQL> alter system set log_archive_dest_1='location=/u01/disk1/timran';

 

//把歷史日誌歸檔到本機目錄下 (location 表明本機)

 

SQL> alter system set log_archive_dest_2='service=test';

 

//遠程備份,把歷史日誌備份到服務名爲test的另外的數據庫上。(service 表明遠程),配置雙機時有用。

 

SQL> alter system set log_archive_dest_1='location=/u01/disk1/timran mandatory';                                               

//mandatory 強制,日誌歸檔未完成以前不容許覆蓋redo log file。(考點)

//默認optional(日誌在沒有歸檔完成前能夠被覆蓋redo log file。

         

log_archive_format 是定義命名格式的,我使用了下面三個內置符號,其含義是:

 

%t ,thread# , 日誌線程號

%s ,sequence ,日誌序列號

%r ,resetlog ,表明數據庫的週期

 

SQL> alter system set log_archive_format ='arch_%t_%r_%s.log' scope=spfile;

 

5.5 在liunx下查看歸檔進程

 

[oracle@timran bdump]$ ps -ef |grep ora_|grep -v grep

 

oracle    3458     1  0 01:30 ?        00:00:00 ora_pmon_timran

oracle    3460     1  0 01:30 ?        00:00:00 ora_psp0_timran

oracle    3462     1  0 01:30 ?        00:00:00 ora_mman_timran

oracle    3464     1  0 01:30 ?        00:00:00 ora_dbw0_timran

oracle    3466     1  0 01:30 ?        00:00:00 ora_lgwr_timran

oracle    3468     1  0 01:30 ?        00:00:00 ora_ckpt_timran

oracle    3470     1  0 01:30 ?        00:00:01 ora_smon_timran

oracle    3472     1  0 01:30 ?        00:00:00 ora_reco_timran

oracle    3474     1  0 01:30 ?        00:00:00 ora_cjq0_timran

oracle    3476     1  0 01:30 ?        00:00:01 ora_mmon_timran

oracle    3478     1  0 01:30 ?        00:00:00 ora_mmnl_timran

oracle    3480     1  0 01:30 ?        00:00:00 ora_d000_timran

oracle    3482     1  0 01:30 ?        00:00:00 ora_s000_timran

oracle    3490     1  0 01:32 ?        00:00:00 ora_arc0_timran

oracle    3492     1  0 01:32 ?        00:00:00 ora_arc1_timran

oracle    3496     1  0 01:32 ?        00:00:00 ora_qmnc_timran

oracle    3506     1  0 01:32 ?        00:00:00 ora_q000_timran

oracle    3508     1  0 01:32 ?        00:00:00 ora_q001_timran

oracle    3542     1  0 01:41 ?        00:00:00 ora_j000_timran

 

ARCn就是歸檔進程,這裏啓動了兩個arc0和arc1,最多可達30個,由log_archive_max_processes參數指定。

 

5.6 日誌歸檔:

    1)自動歸檔,日誌切換時

    2)手工

    3)在歸檔時,會把歸檔信息寫入到控制文件

   

02:44:00 SQL> alter system switch logfile;      //手工歸檔方法一。

 

02:46:30 SQL> alter system archive log current;     //手工歸檔方法二,此方式僅限於Archive mode。 【此方法只能在歸檔模式下用】

                               

查看已經歸檔日誌:

02:48:08 SQL> select name from v$archived_log;

 

NAME

--------------------------------------------------------------------------------------------------------

/u01/disk1/timran/arch_1_782662700_141.log

/u01/disk1/timran/arch_1_782662700_142.log

/u01/disk1/timran/arch_1_782662700_143.log

/u01/disk1/timran/arch_1_782662700_144.log

/u01/disk1/timran/arch_1_782662700_145.log

/u01/disk1/timran/arch_1_788918717_1.log

/u01/disk1/timran/arch_1_788918717_2.log

/u01/disk1/timran/arch_1_788918717_3.log

05:47:10 SQL>

 

 

第六章 日誌挖掘 log miner

 

6.1 log miner的做用:

 

數據庫恢復中有時會須要對Redo log進行分析, 要會使用log miner,以便肯定要恢復的時間點

 

6.2 有兩種日誌挖掘方法 針對DML和DDL,整理以下 :

 

6.2.1 對語句DML進行日誌挖掘:

 

1)添加database補充日誌

SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS; //10g和11g中這一步仍是挺重要的。

                 

2)肯定要分析的日誌範圍,添加日誌,分析

SQL>

execute dbms_logmnr.add_logfile(logfilename=>'日誌',options=>dbms_logmnr.new);  

eg: /u01/disk1/timran/arch_1_804874397_20.log

//第一個要加載的日誌文件

 

SQL>

execute dbms_logmnr.add_logfile(logfilename=>'補充日誌',options=>dbms_logmnr.addfile);  //能夠反覆添加補充多個日誌文件

 

3)執行logmnr 分析

SQL>execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

 

4)查詢分析結果,能夠設置時間格式,也能夠在顯示方式裏再肯定格式.

                                                                         

SQL>select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='表名';

 

5)關閉日誌分析

SQL>execute dbms_logmnr.end_logmnr;

 

scott:

 

09:44:08 SQL> create table a (id int);

09:44:20 SQL> insert into a values(1);

09:44:29 SQL> update a set id=5;

09:44:45 SQL> commit;

09:44:47 SQL> delete a;

09:44:51 SQL> commit;

Commit complete.

 

sys:

 

 

11:32:12 SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1         26   52428800          2 NO       CURRENT                2257870 2012-7-23 9

         2          1         25   52428800          2 YES      INACTIVE               2257866 2012-7-23 9

         3          1         23   52428800          2 YES      INACTIVE               2257862 2012-7-23 9

         4          1         24   52428800          2 YES      INACTIVE               2257864 2012-7-23 9

 

//上面a 表的DML操做都寫進了current組裏,記住sequence#是26號。而後手工切換當前日誌進archive裏。

 

11:32:18 SQL> alter system switch logfile;

 

11:33:00 SQL> /

 

11:33:02 SQL> /

 

11:33:02 SQL> /

 

11:33:09 SQL> select name from v$archived_log;

 

/u01/disk1/timran/arch_1_789252862_21.log

/u01/disk1/timran/arch_1_789252862_22.log

/u01/disk1/timran/arch_1_789252862_23.log

/u01/disk1/timran/arch_1_789252862_24.log

/u01/disk1/timran/arch_1_789252862_25.log

/u01/disk1/timran/arch_1_789252862_26.log

/u01/disk1/timran/arch_1_789252862_27.log

/u01/disk1/timran/arch_1_789252862_28.log

/u01/disk1/timran/arch_1_789252862_29.log

 

62 rows selected

 

//切換後,sequence#26的日誌的應該對應的是/u01/disk1/timran/arch_1_789252862_26.log

 

11:33:20 SQL> alter database add supplemental log data;

 

11:33:48 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_789252862_26.log',options=>dbms_logmnr.new);

 

11:34:13 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

 

11:34:49 SQL>select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') timestamp,sql_redo from v$logmnr_contents where seg_name='A';

 

       SCN TIMESTAMP           SQL_REDO

---------- ------------------- --------------------------------------------------------------------------------

   2258232 2012-07-23 09:43:16 drop table a purge;

   2258334 2012-07-23 09:44:20 create table a (id int);

   2258341 2012-07-23 09:44:28 insert into "SCOTT"."A"("ID") values ('1');

   2258349 2012-07-23 09:44:46 update "SCOTT"."A" set "ID" = '5' where "ID" = '1' and ROWID = 'AAANBAAAEAAAAGEA

   2258353 2012-07-23 09:44:52 delete from "SCOTT"."A" where "ID" = '5' and ROWID = 'AAANBAAAEAAAAGEAAA';

 

另外,也能夠採用OEM方式進行logmnr,設定scn或timestamp一個範圍,查出須要的DML語句,比較方便。不過,OEM是針對已提交的事務的。

 

 

6.2.2 對DDL的操做的log miner:

 

1)若是是第一次作,先要建好logmnr目錄,

 

設置logmnr 參數,存放數據字典文件dict.ora

$ mkdir /home/oracle/logmnr

 

SQL> alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;                                                       

 

2)創建數據字典文件dict.ora

SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);                         

 

3)添加日誌分析

SQL> execute dbms_logmnr.add_logfile(logfilename=>'日誌文件',options=>dbms_logmnr.new);         

SQL> execute dbms_logmnr.add_logfile(logfilename=>'追加日誌',options=>dbms_logmnr.addfile);     

 

4)執行分析

SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);    

5)查看分析結果

                                                               

SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents WHERE USERNAME ='SCOTT' and lower(sql_redo) like '%table%';

                                                             

6)關閉日誌分析

SQL> execute dbms_logmnr.end_logmnr;

 

例子將在053的不徹底恢復一節中演示。

               

                                                                                    

第七章: 管理undo

 

7.1 undo做用

 

使用undo tablespace 存放從datafiles 讀出的數據塊的前鏡像【老值】,提供如下四種狀況所須要的信息

       

    1)回滾事務:rollback

    2)讀一致性:正在作DML操做的數據塊,事務結束前,其餘用戶讀undo裏面的數據前鏡像

    3)實例的恢復:instance recover(undo -------->rollback)

    4)閃回查詢 :flashback query、flashback table

 

7.2 undo 的管理模式:

   

    1)manaual 手工:roll segment  //做廢了

    2)auto  自動:undo tablespace (init parameter :undo_management  = auto)

      

7.3 undo 表空間管理

 

    1)能夠創建多個undo表空間,但一個時刻只有一個處於active

    2)處於active狀態的undo tablespace 不能offline 和 drop

 

01:08:31 SQL> select tablespace_name,status ,contents from dba_tablespaces; 

 

TABLESPACE_NAME                STATUS    CONTENTS

------------------------------ --------- ---------

SYSTEM                         ONLINE    PERMANENT

UNDOTBS1                       ONLINE    UNDO

SYSAUX                         ONLINE    PERMANENT

TEMP                           ONLINE    TEMPORARY

USERS                          ONLINE    PERMANENT

EXAMPLE                        ONLINE    PERMANENT

TEST                           ONLINE    PERMANENT

 

09:47:08

SQL>

create undo tablespace undotbs2 datafile '/u01/oradata/timran11g/undotbs02.dbf' size 100m autoextend on;                                                                                   

09:47:55 SQL> select tablespace_name,status,contents from dba_tablespaces;                                                             

 

SQL> select tablespace_name,status ,contents from dba_tablespaces; 

 

TABLESPACE_NAME                STATUS    CONTENTS

------------------------------ --------- ---------

SYSTEM                         ONLINE    PERMANENT

SYSAUX                         ONLINE    PERMANENT

UNDOTBS1                       ONLINE    UNDO

TEMP                           ONLINE    TEMPORARY

USERS                          ONLINE    PERMANENT

UNDOTBS2                       ONLINE    UNDO

EXAMPLE                        ONLINE    PERMANENT

TEST                           ONLINE    PERMANENT

 

7.4 查看當前正在使用的undo tablespace

 

09:48:00 SQL> show parameter undo                                                                                                       

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

 

00:20:50 SQL> SQL>  select * from v$rollname;

 

       USN NAME

---------- ------------------------------

         0 SYSTEM

        11 _SYSSMU11_1357956213$

        12 _SYSSMU12_1357956213$

        13 _SYSSMU13_1357956213$

        14 _SYSSMU14_1357956213$

        15 _SYSSMU15_1357956213$

        16 _SYSSMU16_1357956213$

        17 _SYSSMU17_1357956213$

        18 _SYSSMU18_1357956213$

        19 _SYSSMU19_1357956213$

        20 _SYSSMU20_1357956213$

11 rows selected.

 

7.5 切換undo

 

09:50:10 SQL> alter system set undo_tablespace=undotbs2;     //memory動態修改                                                

09:50:28 SQL> show parameter undo                                                                                                       

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS2

 

00:22:29 SQL> SQL>  select * from v$rollname;

 

       USN NAME

---------- ------------------------------

         0 SYSTEM

         1 _SYSSMU1_1363316212$

         2 _SYSSMU2_1363316212$

         3 _SYSSMU3_1363316212$

         4 _SYSSMU4_1363316212$

         5 _SYSSMU5_1363316212$

         6 _SYSSMU6_1363316212$

         7 _SYSSMU7_1363316212$

         8 _SYSSMU8_1363316212$

         9 _SYSSMU9_1363316212$

        10 _SYSSMU10_1363316212$

 

 

11 rows selected.

 

7.6 刪除undo tablespace

 

SQL> drop tablespace undotbs1 including contents and datafiles;                                               

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         4 USERS                          YES NO  YES

         6 EXAMPLE                        YES NO  YES

         8 TEST                           YES NO  YES

         3 TEMP                           NO  NO  YES

         5 UNDOTBS2                       YES NO  YES

 

7.7 undo block的4種狀態

 

1)active:  表示使用這個undo block的 transaction還未提交

2)unexpired: undo block上沒有活動事務,能夠被覆蓋(可是未過時expired)

3)expired:  undo block狀態爲inactive的時間 超過了undo_retention

4)free:     空閒的

 

7.8 關於undo_retention 參數   

 //這個參數只對已提交的undo狀態有效

 

01:10:46 SQL>

select tablespace_name,status,contents,retention from dba_tablespaces;

 

TABLESPACE_NAME                STATUS    CONTENTS  RETENTION

------------------------------ --------- --------- -----------

SYSTEM                         ONLINE    PERMANENT NOT APPLY

SYSAUX                         ONLINE    PERMANENT NOT APPLY

TEMP                           ONLINE    TEMPORARY NOT APPLY

USERS                          ONLINE    PERMANENT NOT APPLY

EXAMPLE                        ONLINE    PERMANENT NOT APPLY

TEST                           ONLINE    PERMANENT NOT APPLY

UNDOTBS2                       ONLINE    UNDO      NOGUARANTEE

 

guarantee屬性隨undo表空間創建, 能夠修改

 

09:52:22 SQL> alter tablespace undotbs2 retention guarantee;    //保證在retention 期間不容許被覆蓋

 

01:11:16 SQL> select tablespace_name,status ,contents,retention from dba_tablespaces;

 

TABLESPACE_NAME                STATUS    CONTENTS  RETENTION

------------------------------ --------- --------- -----------

SYSTEM                         ONLINE    PERMANENT NOT APPLY

SYSAUX                         ONLINE    PERMANENT NOT APPLY

TEMP                           ONLINE    TEMPORARY NOT APPLY

USERS                          ONLINE    PERMANENT NOT APPLY

EXAMPLE                        ONLINE    PERMANENT NOT APPLY

TEST                           ONLINE    PERMANENT NOT APPLY

UNDOTBS2                       ONLINE    UNDO      GUARANTEE

 

 

缺省配置下undo retention是 noguarantee,

 

SQL> alter tablespace undotbs2 retention noguarantee;

 

7.9 undo 信息的查詢

 

       1) v$session      查看用戶創建的session

       2) v$transaction  當前的事務

       3) v$rollname     undo段的名稱

       4) v$rollstat     undo段的狀態

       5)  dba_rollback_segs 數據字典裏記錄的undo段狀態

 

通常來講,一個session只能對應一個事務,創建了session未必有事務,只有事務處於中間態時,v$transaction才能看到這個事務。

換句話說,若是看到了事務(在 v$transaction裏),那必定有個session和它對應,將兩個視圖裏連在一塊兒,信息看得更爲清楚。

 

cmd下scott登陸:

   

10:03:28 SQL> select username,sid,serial# from v$session where username is not null;    //看看有幾個session連上來了。                                                                      

USERNAME                              SID    SERIAL#

------------------------------ ---------- ----------

SCOTT                                 131         18

SYS                                   170          5

 

cmd下 update emp set sal=1000 where empno=7788;       // 產生一個活動事務

 

SQL> select a.sid,a.serial#,a.username,b.xidusn,xidslot,b.ubablk,b.status from v$session a,v$transaction b where a.saddr=b.ses_addr;

 

10:08:29 SQL> col name for a10                                                                                                                                                                                                                 

    

     SID     SERIAL#  USERNAME                 XIDUSN    XIDSLOT     UBABLK STATUS          

---------- ---------- -------------------- ---------- ---------- ---------- ----------------

 

       131         18 SCOTT                         8         17        305 ACTIVE

 

 

//兩表聯查,sid和serial#在v$session裏,在v$transaction裏  XIDUSN是undo segment 的id ,XIDSLOT 是事務槽的id,UBABLK是undo塊號

 

 

對照上面看,下面語句顯示出_SYSSMU8$是一個活動段, 與XIDUSN=8吻合, 說明這個段被讀進buffer了.

 

SQL> select b.name,a.xacts from v$rollstat a, v$rollname b where a.usn=b.usn;

 

NAME                                XACTS

------------------------------ ----------

SYSTEM                                  0

_SYSSMU1_1363316212$                    0

_SYSSMU2_1363316212$                    0

_SYSSMU3_1363316212$                    0

_SYSSMU4_1363316212$                    0

_SYSSMU5_1363316212$                    0

_SYSSMU6_1363316212$                    0

_SYSSMU7_1363316212$                    0

_SYSSMU8_1363316212$                    1

_SYSSMU9_1363316212$                    0

_SYSSMU10_1363316212$                   0

 

7.10 system表空間的undo

 

默認system表空間會有一個undo segment(usn爲0)。system下的undo是系統須要的(好比數據字典),其餘表空間的事務不能使用它。缺省下undo tablespace 會被分配10個undo segment,若是數據庫啓動時碰到undo數據文件損壞或不一樣步,能夠將其offline,   只有一個系統表空間的undo也能進入系統,但不能作其餘表空間的DML操做。

 

7.11 測試:模擬數據庫open下的undo損壞和修復。

 

若是在數據庫打開的狀況下,當前undo壞掉的話,好比如今UNDOTBS2出現了介質損壞,那麼數據庫就不能作DML操做了。若是UNDOTBS2表空間上還有活動的事務,Oracle會將其下的全部段標誌爲NEEDS RECOVERY,這時若沒有備份或沒有可替代UNDO來切換的話,那麼這種錯誤將是嚴重的,會丟失了原來的事務。必須從新啓動,而後重建一個undo表空間,再將NEEDS RECOVERY處理後,纔可將該表空間刪除。咱們模擬一下這種狀況:

 

[oracle@timran timran]$ mv undotbs02.dbf undotbs02.bak

 

00:29:28 SQL>alter system checkpoint;

 

cmd端再作update 語句時會報錯

 

ORA-01116: 打開數據庫文件 3 時出錯

ORA-01110: 數據文件 3: '/u01/oradata/timran11g/undotbs02.dbf'

ORA-27041: 沒法打開文件

 

00:29:28 SQL> startup force

 

ORA-01157: 沒法標識/鎖定數據文件 3 - 請參閱 DBWR 跟蹤文件

ORA-01110: 數據文件 3: '/u01/oradata/timran11g/undotbs02.dbf'

 

SQL> select file#,checkpoint_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            6708724

         2            6708724

         3            6708724

         4            6708724

         5            6708724

         6            6708724

//磁盤上去讀數據文件

SQL> select file#,checkpoint_change# from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            6708724

         2            6708724

         3                  0

         4            6708724

         5            6708724

         6            6708724

 

SQL> alter database datafile 3 offline;

SQL> alter database open;

SQL> select * from v$rollname;

//只剩下系統表空間 undo端

 

       USN NAME

---------- ------------------------------

         0 SYSTEM

 

SQL>

create undo tablespace undotbs1 datafile '/u01/oradata/timran11g/undotbs01.dbf' size 100m autoextend on;

 SQL>  show parameter undo;

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         2 UNDOTBS1                       YES NO  YES

         4 USERS                          YES NO  YES

         3 TEMP                           NO  NO  YES

         6 EXAMPLE                        YES NO  YES

         8 TEST                           YES NO  YES

         5 UNDOTBS2                       YES NO  YES

 

SQL> alter system set undo_tablespace=UNDOTBS1;

 

注意:此時原有的事務可能仍然在UNDOTBS2, 只能刷掉了。

 

SQL> drop tablespace undotbs2 including contents and datafiles;

drop tablespace undotbs2 including contents and datafiles

*

第 1 行出現錯誤:

ORA-01548: 已找到活動回退段 '_SYSSMU1_1363316212$', 終止刪除表空間

 

//這個UNDOTBS2刪不掉是由於Oracle把其下的全部段都標誌成 NEEDS RECOVERY了,查看一下相關的數據字典:

 

SQL> select segment_name,status from dba_rollback_segs;

 

SEGMENT_NAME                   STATUS

------------------------------ ----------------

SYSTEM                         ONLINE

_SYSSMU20_1363319420$          ONLINE

_SYSSMU19_1363319420$          ONLINE

_SYSSMU18_1363319420$          ONLINE

_SYSSMU17_1363319420$          ONLINE

_SYSSMU16_1363319420$          ONLINE

_SYSSMU15_1363319420$          ONLINE

_SYSSMU14_1363319420$          ONLINE

_SYSSMU13_1363319420$          ONLINE

_SYSSMU12_1363319420$          ONLINE

_SYSSMU11_1363319420$          ONLINE

_SYSSMU10_1363316212$          NEEDS RECOVERY

_SYSSMU9_1363316212$           NEEDS RECOVERY

_SYSSMU8_1363316212$           NEEDS RECOVERY

_SYSSMU7_1363316212$           NEEDS RECOVERY

_SYSSMU6_1363316212$           NEEDS RECOVERY

_SYSSMU5_1363316212$           NEEDS RECOVERY

_SYSSMU4_1363316212$           NEEDS RECOVERY

_SYSSMU3_1363316212$           NEEDS RECOVERY

_SYSSMU2_1363316212$           NEEDS RECOVERY

_SYSSMU1_1363316212$           NEEDS RECOVERY

 

解決有兩個辦法:1)使用備份恢復,2)使用oracle提供的隱含參數_CORRUPTED_ROLLBACK_SEGMENTS

咱們使用第2種方法

 

SQL>create pfile from spfile;           //創建靜態參數文件

SQL>shutdown abort

 

#vi /u01/oracle/dbs/inittimran11g.ora       //在靜態參數文件裏第一行插入如下內容

_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1_1363316212$,_SYSSMU2_1363316212$,_SYSSMU3_1363316212$,_SYSSMU4_1363316212$,_SYSSMU5_1363316212$,_SYSSMU6_1363316212$,_SYSSMU7_1363316212$,_SYSSMU8_1363316212$,_SYSSMU9_1363316212$,_SYSSMU10_1363316212$)

 

而後存盤,再使靜態參數文件啓動數據庫

 

SQL> startup pfile='/u01/oracle/dbs/inittimran11g.ora'

 

SQL> drop rollback segment "_SYSSMU1_1363316212$";

 

回退段已刪除。

......

SQL> drop rollback segment "_SYSSMU10_1363316212$";

 

SQL> select segment_name,status from dba_rollback_segs;

 

SEGMENT_NAME                   STATUS

------------------------------ ----------------

SYSTEM                         ONLINE

_SYSSMU20_1363319420$          ONLINE

_SYSSMU19_1363319420$          ONLINE

_SYSSMU18_1363319420$          ONLINE

_SYSSMU17_1363319420$          ONLINE

_SYSSMU16_1363319420$          ONLINE

_SYSSMU15_1363319420$          ONLINE

_SYSSMU14_1363319420$          ONLINE

_SYSSMU13_1363319420$          ONLINE

_SYSSMU12_1363319420$          ONLINE

_SYSSMU11_1363319420$          ONLINE

 

已選擇11行。

 

SQL> drop tablespace undotbs2 including contents and datafiles;

 

表空間已刪除。

 

若是還刪除不了,則嘗試修改字典

 

select * from v$tablespace;  記下要刪除的undo對應的ts#號,好比是=2,則執行下行語句:

update seg$ set type# = 3 where ts#=2;

 

而後再刪除該表空間便可。

第八章 檢查點(checkpoint)

 

8.1 什麼是checkpoint

checkpoint是數據庫的一個內部事件,檢查點激活時會觸發數據庫寫進程(DBWR),將數據緩衝區裏的髒數據塊寫到數據文件中。

 

因爲DBWR與事務提交的無關性,數據庫在某個時刻會存在已提交的事務沒有來及寫到磁盤,而未提交的事務卻已經寫到了磁盤的狀況,也就是說內存中的數據和磁盤中的數據不一致。

 

8.2 checkpoint主要2個做用:

                 

1)保證數據庫的一致性,這是指將髒數據寫出到硬盤,保證內存和硬盤上的數據是同樣的;

                           

2)縮短實例恢復的時間,實例恢復要把實例異常關閉前沒有寫出到硬盤的髒數據經過日誌進行恢復。若是髒塊過多,實例恢復的時間也會很長,檢查點的發生能夠減小髒塊的數量,從而提升實例恢復的時間。

 

8.3 checkpoint分類

 

徹底檢查點 full checkpoint

增量檢查點 incremental checkpoint

局部檢查點 partial checkpoint

 

8.3.1 徹底檢查點工做方式:

記下當前的scn, 將此scn以前全部的髒塊一次性寫完,再將該scn號同步更新控制文件和數據文件頭。

 

能夠引發徹底檢查點的兩個動做 

 

a)正常關閉數據庫:shutdown immediate

b)手動檢查點切換:alter system checkpoint;

補充:實例b   

查詢:當前文件scn號

select file#,checkpoint_change# from v$datafile_header;

alter system checkpoint;

select file#,checkpoint_change# from v$datafile_header;

 

8.3.2 增量檢查點概念及相關參數:

 

8.3.2.1概念:

 

1)通常來講增量檢查點不會更新數據文件頭和控制文件的SCN,它只是根據策略計算一個SCN(未必是當前SCN),將此SCN前的髒塊刷新到磁盤,這個SCN點也叫檢查點位置,而後將與此scn有關的信息記錄到控制文件。

 

2)當增量檢查點發生時,Oracle會寫一部分髒塊,使檢查點位置前移。進而縮短實例恢復時運用日誌起點和終點之間的距離,也就意味着縮短了實例恢復時間

 

如下相關知識已超出OCP考試範疇,僅供參考吧:

 

什麼是檢查點隊列?

被修改過的塊,在oracle中都被統稱爲髒塊.全部的髒塊被一個雙向鏈表串起來,稱作檢查點隊列.

 

什麼是檢查點位置?

 

髒塊按照首次變髒的時間順序排列,DBWR每到必定的時機,就會被觸發,沿着檢查點隊列的順序將髒塊刷新到磁盤上。檢查點位置以前的塊,都是已被DBWR刷新到磁盤上的塊。而最後的檢查點位置(也就是最後的RBA)老是被記錄在控制文件中。若是發生系統崩潰的話,這個最後一次的檢查點位置就是實例恢復的起點。

 

什麼是RBA? LRBA? HRBA? TARGET RBA?

 

RBA就是redo塊地址,好比說,用戶發出了一條update命令,更新了塊A,塊A如今變成了髒塊,oracle會爲他生成一條redo條目.這個條目在redo日誌文件中的位置就是rba(redo byte address).過了一下子,假如:塊A依然仍是髒塊,此時.用戶又發出一條更新塊A的命令,這又會生成一條redo條目.第一條更新命令對應的redo條目的RBA被稱爲塊A的LRBA(low rba),第二條更新命令對應的RBA,被稱爲HRBA(high rba).

其實,按照LRBA來排列,就是按照塊首次被修改的順序來排列. LRBA在髒塊的塊頭有指針。

TARGET RBA是增量檢查點發生時要求髒塊寫到一個RBA爲止,這個RBA就是Target RBA。

 

8.3.2.2 與觸發增量檢查點有關的幾個參數

 

1)FAST_START_MTTR_TARGET:

 

這個參數是考點。如何有效的縮短最近檢查點位置與聯機重作日誌尾部之間的距離,正是設計此參數目的。

 

此參數單位爲秒,缺省值900,範圍0-3600秒,斷定依據是當內存中產生的dirty buffer所需的日誌恢復時間 (estimated_mttr)若是到達該參數指定時間,則增量檢查點進程被觸發。fast_start_mttr_target若是爲0,這時是根據DBWN進程自身須要儘可能減小寫入量。雖然實現性能最大化,但實例恢復時間可能後比較長。

 

*考點:若是將fast_start_mttr_target設置爲非0,將啓用檢查點自動調整機制。

 

驗證以上概念的一個有效的方法,能夠研究一下日誌切換:alter system switch logfile; 這個動做比較特殊,其特徵是徹底檢查點和增量檢查點綜合的效果。

 

若是FAST_START_MTTR_TARGET有值,v$log視圖中的active狀態幾分鐘後會變成inactive狀態,而後更新了控制文件和日誌文件頭部的SCN(這彷佛是徹底檢查點的特徵)

 

若是FAST_START_MTTR_TARGET=0,在沒有檢查點機制的狀況下,只能靠DBWN進程自身機制寫髒塊,若是沒有事務發生active很長時間狀態不變。

 

還有如下三個參數,它們是:

2)FAST_START_IO_TARGET:  實例恢復所須要讀取的redo blocks數量,

3)LOG_CHECKPOINT_TIMEOUT:2次增量檢查點的時間間隔。

4)LOG_CHECKPOINT_INTERVAL:最後一次增量檢查點與當前日誌文件末尾所差的redo block數量。(淘汰)

 

這三個參數已經被FAST_START_MTTR_TARGET取代了。若是fast_start_io_target or log_checkpoint_interval被指定,他們會自動覆蓋由fast_start_mttr_target參數計算出來的值。

 

演示:

ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;

alter system set LOG_CHECKPOINT_TIMEOUT=30;

增量checkpoint信息將會被記錄到告警日誌alert_$SID.log文件中

 

注意:並非將髒列表中的全部髒塊都寫出到數據文件中,而是寫出一部分,保證知足條件便可。

 

5)90% OF SMALLEST REDO LOG(Oarcle 內部參數),將重作日誌文件末尾前面90%的位置設爲檢查點位置。

 

6)每3s檢查checkpoint隊列,查看髒塊的寫入狀況,記錄此刻的那個RBA,並將其做爲檢查點位置寫入到controlfile

 

8.3.3實例恢復有關的顧問叫作MTTR Advisory 須要設置兩個參數

 

1)STATISTICS_LEVEL         -->置爲typical(缺省) 或者all

2)FAST_START_MTTR_TARGET   -->置爲非零值

 

8.4 設置合理的MTTR參數

 

有兩個視圖可供參考

v$instance_recovery

v$mttr_target_advice

 

SQL>select recovery_estimated_ios,actual_redo_blks,target_redo_blks,target_mttr,

estimated_mttr from v$instance_recovery;

 

RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR

---------------------- ---------------- ---------------- ----------- --------------

                    72              333             3700          33             12

//系統計算出來的target_mttr爲33秒,當前估算的恢復時間是12秒。

 

SQL>select mttr_target_for_estimate tar_est,dirty_limit,estd_cache_writes est_c_w,

estd_cache_write_factor est_c_w_f,estd_total_writes est_t_w,estd_total_write_factor est_t_w_f from v$mttr_target_advice;

 

 

   TAR_EST DIRTY_LIMIT    EST_C_W  EST_C_W_F    EST_T_W  EST_T_W_F

---------- ----------- ---------- ---------- ---------- ----------

        16        1821       7659     1.0635       7659     1.0635

        20        4516       7202          1       7202          1

        22        5825       7202          1       7202          1

        25        7616       7202          1       7202          1

        18        3208       7202          1       7202          1

 

//mttr_target_for_estimate裏的25秒(最接近設定的目標時間30秒)那行記錄的有關字段,值得參考。

 

8.5 局部檢查點的觸發條件:

 

對於某些操做,局部檢查點是必須的,並會自動執行。

好比:表空間offline,數據文件offline,刪除extent,表truncate,begin backup(將表空間置於備份模式)等。Oracle會根據須要自動執行。

 

 

第九章  實例恢復機制

SQL> select file#,checkpoint_change#,last_change# from v$datafile;

 

 

有了redo,undo和ckpt概念後,有助於更好的理解實例恢復(ppt:404-408)

 

因爲引入了增量檢查點,當實例須要恢復的時候,oracle首先從控制文件裏找到最後一次檢查點位置,這個位置就是實例恢復的起點

 

而後是smon的一系列動做:

 

 1) roll forward :利用redo,將檢查點位置之後的更改,包括提交的和未提交的數據重作一遍。

 2) open:

 3) roll back :經過undo機制 把寫入磁盤裏的未提交的事務回滾掉。

 

重點理解實例恢復的概念

 

爲什麼要使用redo前滾?由於abort時有可能丟失了在內存中(未寫到數據文件)的已提交的事務。

爲什麼要使用undo回滾?由於abort前有可能有未提交的事務已經寫到了數據文件裏。

爲什麼要open? 打開數據庫意味着用戶會話能夠創建了。

 

第二部分 Oracle的存儲架構

 

第十章 數據字典

 

Oracle提供了大量的內部表,它們記錄了數據庫對象的更改和修正。能夠將這些內部表劃分爲兩種主要類型:靜態數據字典表和動態性能表。

這些內部表是由oracle維護的,能夠說它們是隻讀表。用戶包括sys都不能修改,只能查看。

 

10.1 數據字典

10.1.1 數據字典的功能(Data dictionary)

      1) central of database  //數據庫的核心

      2)read_only table and views

      3)owner :sys

      4)oracle server  維護,ddl操做會更新

      5)經過select 訪問

      6)記錄數據庫的物理、邏輯結構和全部對象的定義的信息

      7)存放在system tablesapce

 

經過dict view 能夠了解數據字典的組成

                                                              

SQL> select * from dict where table_name='DBA_OBJECTS';

 

TABLE_NAME                  COMMENTS

---------------------------------------------   ------------------------------------------------------------

DBA_OBJECTS                 All objects in the database

 

SQL> select count(*) from dict;

 

  COUNT(*)

----------

      2323

 

   

10.1.2 數據字典的組成:

           

10.1.3 數據字典的內容

        1)數據庫的邏輯和物理的架構

        2)用戶及對象的定義和存儲信息

        3)權限、角色、審計等

        4)database的狀態

       

10.1.4 數據字典:靜態(static)視圖

 

      static :在數據庫open狀態下訪問,能夠經過靜態視圖瞭解database的架構(記錄database的架構,object的數據定義和存儲等信息)

     

        dba_ : 存儲全部用戶對象的信息(默認只能有sys/system 用戶訪問)

        all_ : 存儲當前用戶可以訪問的對象(包括用戶所擁有的對象和別的用戶受權訪問的對象)的信息。

        user_:存儲當前用戶所擁有的對象的相關信息。

 

10.2 動態性能表(V$)

 

是維護當前實例信息的,因爲不斷的更新,因此也叫動態視圖。其底層是一組虛擬的動態表稱爲X$表,oracle不容許直接訪問X$表,而是在這些表上建立視圖,而後再建立這些視圖的同義詞。

Eg:

SQL> set autotrace on;  //打開解析

 SQL> set autotrace off; //關閉解析

 

基表(x$)-------------視圖(v_$)--------------同義詞v$-------User access

 

能夠經過v$fixed_table 視圖  查到全部的動態視圖的名稱;用於調優和數據庫監控。從Oracle8開始, GV$視圖開始被引入,其含義爲Global V$,GV$的產生是爲了知足OPS環境的須要,除了一些特例之外,每一個V$視圖都有一個GV$視圖存在。

SQL> desc v$fixed_table;

SQL> select count(object_id) from v$fixed_table;

SQL> select name from v$fixed_table where name like'V$%DATA%';

SQL> select checkpoint_change# from v$database;

SQL> select checkpoint_change# from v$datafile;

 

*考點:動態性能視圖填充了來自實例和控制文件的信息,前綴爲DBA_、ALL_、_USER_的視圖則填充了來自數據字典的信息,此差別決定了能夠  在不一樣啓動階段查詢那些視圖。

          

補充:

 

第十一章: Oracle的存儲架構

 

DATABASE-->TABLESPACES-->SEGMENTS-->EXENTS-->BLOCKS (DBA-I-PPT36-)

 

11.1 TABLESPACE(表空間)特色

 

11.1.1 表空間的管理方式主要有兩種:

1)字典管理:在數據字典中管理表空間的空間分配。Oracle 8i之前只有經過uet$和fet$的字典管理。

 

缺點:某些在字典管理方式下的存儲分配有時會產生遞歸操做,而且容易產生碎片,從而影響了系統的性能,如今已經淘汰了。

 

2)本地管理:在每一個數據文件中使用位圖管理空間的分配。表空間中全部區(extent)的分配信息都保存在該表空間對應的數據文件的頭部。

                

優勢:速度快,存儲空間的分配和回收只是簡單地改變數據文件中的位圖,而不像字典管理方式還須要修改數據庫。無碎片,更易於DBA維護。

 

 

03:32:36

SQL> select tablespace_name,contents ,extent_management,segment_space_management from dba_tablespaces;

 

TABLESPACE_NAME                CONTENTS  EXTENT_MAN SEGMEN

------------------------------ --------- ---------- ------

SYSTEM                         PERMANENT DICTIONARY MANUAL

SYSAUX                         PERMANENT LOCAL      AUTO

TEMP                           TEMPORARY LOCAL      MANUAL

USERS                          PERMANENT LOCAL      AUTO

EXAMPLE                        PERMANENT LOCAL      AUTO

UNDO_TBS01                     UNDO      LOCAL      MANUAL

TMP01                          TEMPORARY LOCAL      MANUAL

TBS_16K                        PERMANENT LOCAL      AUTO

BIG_TBS                        PERMANENT LOCAL      AUTO

TEST                           PERMANENT DICTIONARY MANUAL

 

 

注意兩點:

1)若是system表空間是數據字典管理,其餘表空間能夠是數據字典管理或local管理(默認)

2)字典管理能夠轉換成本地管理,可是對於系統表空間,要求執行一些附加步驟,比較麻煩。

 

execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');

 

11.1.2 表和表空間的關係

 

建一個最簡單的表空間

SQL> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m;

 

利用oracle提供的dbms_metadata.get_ddl包看看缺省值都給的是什麼?

 

SQL> set serverout on;

//把顯示打開

SQL>

declare

aa  varchar2(2000);

begin

select dbms_metadata.get_ddl('TABLESPACE','A') into aa FROM dual;

dbms_output.put_line(aa);

end;

/

 

結果:

  CREATE TABLESPACE "A" DATAFILE

  '/u01/oradata/timran11g/a01.dbf' SIZE 10485760

  LOGGING ONLINE PERMANENT BLOCKSIZE

8192

  EXTENT MANAGEMENT LOCAL AUTOALLOCATE

//區是自動

 SEGMENT SPACE MANAGEMENT AUTO

//段自動

PL/SQL 過程已成功完成。

 

 

關注最後一行,兩個重要信息是:(1)區本地管理且自動分配空間,(2)段自動管理。  

 

區默認本地管理,並且我也沒法指定它爲字典管理,由於個人system表空間是本地管理

 

SQL>

create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m

extent management local uniform size 128k

segment space management manual;

 

同上,調dbms_metadata.get_ddl包看oracle對該語句的ddl操做是:

 

  CREATE TABLESPACE "A" DATAFILE

  '/u01/oradata/timran11g/a01.dbf' SIZE 10485760

  LOGGING ONLINE PERMANENT BLOCKSIZE

8192

  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 131072 SEGMENT SPACE MANAGEMENT MANUAL

 

最後一行信息是:區本地管理且統一分配128K, 段手動管理。若是在建表時使用缺省說明,則該表將服從其表空間的這些定義,

 

SQL>create table scott.t1(id int) tablespace a;

 

調dbms_metadata.get_ddl包看oracle對SCOTT.T1表的ddl操做是:

 

SQL> set serverout on;

 

 

SQL>

declare

aa  varchar2(2000);

begin

select dbms_metadata.get_ddl('TABLE','T1','SCOTT') into aa FROM dual;

dbms_output.put_line(aa);

end;

/

 

結果:

  CREATE TABLE "SCOTT"."T1"

   (    "ID" NUMBER(38,0)

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS

LOGGING

  STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST

GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "A"

 

注意兩個地方:1)由於表空間指定了MSSM方式,表這邊就有了PCTUSED值,缺省是40,存儲子句(storage)沿用了表空間的uniform 128k.

 

11.1.3 刪除表空間

can not drop :

1)system 

2)active undo tablespace

3) default temporary tablespace

4)default的永久表空間

  

09:43:11 SQL> DROP TABLESPACE SYSTEM;

DROP TABLESPACE SYSTEM

*

ERROR at line 1:

ORA-01550: cannot drop system tablespace

 

09:44:38 SQL> drop tablespace test including contents and datafiles;

 

Tablespace dropped.

 

09:44:59

//產看數據文件和表空間的關係

SQL> select file_id,file_name,tablespace_name,AUTOEXTENSIBLE ,bytes/1024/1024 "size" from dba_data_files;

SQL> col file_name format a50;

//修改某一列顯示寬度

 

   FILE_ID FILE_NAME                                  TABLESPACE_NAME                AUTOEXTENSIBLE       size

---------- ------------------------------------------ ------------------------------ -------------- ----------

        4 /u01/oradata/timran11g/users01.dbf              USERS                          YES                 51.25

        3 /u01/oradata/timran11g/sysaux01.dbf             SYSAUX                         YES                   260

        2 /u01/oradata/timran11g/undotbs01.dbf            UNDOTBS1                       YES                   100

        1 /u01/oradata/timran11g/system01.dbf             SYSTEM                         YES                   480

        5 /u01/oradata/timran11g/example01.dbf            EXAMPLE                        YES                   100

 

查看錶空間空閒大小

 

09:47:04 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;

 

TABLESPACE_NAME                SUM(BYTES)/1024/1024

------------------------------ --------------------

UNDOTBS1                                    98.4375

SYSAUX                                       14.625

USERS                                       48.1875

SYSTEM                                        1.875

EXAMPLE                                       31.25

 

 

11.1.4 大文件(bigfile)表空間(默認small file)

 

1)small file,在一個表空間能夠創建多個數據文件

2)bigfile :在一個表空間只能創建一個數據文件  (8k的block ,datafile maxsize 能夠 32T),能夠簡化對數據文件管理

   

09:54:49

SQL>

 create bigfile tablespace big_tbs datafile '/u01/oradata/timran11g/bigtbs01.dbf' size 100m;

 

Tablespace created.

 

09:55:01

SQL> alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m;

alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m

*

ERROR at line 1:

ORA-32771: cannot add file to bigfile tablespace

 

 

09:55:46 SQL> select name,bigfile from v$tablespace;

 

NAME                           BIG

------------------------------ ---

SYSTEM                         NO

UNDOTBS1                       NO

SYSAUX                         NO

USERS                          NO

TEMP                           NO

EXAMPLE                        NO

TBS_16K                        NO

BIG_TBS                        YES

 

11.2 SEGMENT(段)

 

11.2.1 SEGMENT(段)的特色:

 

 

一個段屬於一個表,一個表能夠有多個段(帶有段、大對象)。

 

一個segment只屬於一個模式(schema)對象,模式對象如表、索引,一個段比較大時能夠跨多個數據文件。

建立一個模式對象時,ORACLE爲這個對象建立一個(或多個)段,在這個段中保存這個對象的全部數據,當這個段數據增長時,爲這個段分配新的區(extent)存儲數據。段中至少有一個初始區。

 

段管理也有兩種方式:

 

1)自動管理方式(ASSM(Auto Systemt Space Management))      --採用位圖管理段的存儲空間

 

   簡單說就是每一個段的段頭都有一組位圖(5個位圖),位圖描述每一個塊的滿度,根據滿度的不一樣將每一個塊對應到相應的位圖上,位圖自動跟蹤每一個塊的使用空間,這5個位圖的滿度按以下定義:一個位圖位於滿塊,其他位圖分別用於滿度爲75%-100%、50%-75%、25%-50%和0%-25%的塊,好比塊大小爲8k,你要插入一行是3k的錶行,那麼oracle就給你對應到25%-50%的那個位圖指定的塊上去。

 

2)手工管理方式(MSSM(Manual Segment Space Management))    --採用FREELIST(空閒列表)管理段的存儲空間

 

這個是傳統的方法,如今仍然在使用,未被淘汰,它與pctfree和pctused的概念有關,後面再介紹block時再討論。

 

段的管理方式只有在建立表空間時設置,一經肯定不能改變。

在ORACLE9I中,缺省狀態爲自動管理方式

segment space management { manual | auto}

 

 

11.2.2 表和段(segment)的關係

 

通常來說 一個單純的表就分配一個段,但每每表沒那麼單純,好比表上常常會有主鍵約束,那麼就會有索引,索引也是表,要求單獨分一個段,還有,例如分區表,每一個分區會有獨立的段,再有就是oracle的大對象, 若是你的表裏引用blob,clob,那麼這個表就又被分出多個段來。

 

SQL> conn / as sysdba

SQL> create user tim identified by tim;

SQL> grant connect,resource to tim;

 

SQL> conn tim/tim

SQL> select * from user_segments;

 

未選定行

 

SQL> create table t1 (id int);

 

SQL> select segment_name from user_segments;

 

SEGMENT_NAME

---------------------------------------------------------------------------------

T1

 

SQL> create table t2 (id int constraint pk_t2 primary key, b blob, c clob);

 

SQL> select segment_name from user_segments;

 

SEGMENT_NAME

---------------------------------------------------------------------------------

T1

T2

SYS_LOB0000074368C00002$$

SYS_IL0000074368C00002$$

SYS_LOB0000074368C00003$$

SYS_IL0000074368C00003$$

PK_T2

 

 

11.3 EXTENT(區)

 

11.3.1 EXTENT(區)的特色:

 

區是ORACLE進行存儲空間分配的最小單位。是由一系列邏輯上連續的Oracle數據塊組成的邏輯存儲結構。段中第一個區叫初始區,隨後分配的區叫後續區。當段中全部的空間使用完後,ORACLE自動爲該段分配一個新的區。

 

根據表空間的管理方法不一樣,區的分配方法也不一樣。

 

1)本地管理方式下的區的分配方法。

 

自動分配和統一分配(見表空間一節)

 

2)字典管理方式下的區的分配方法。逐步淘汰了

 

考點:區分配管理方式在建立表空間時肯定,建完後,不容許更改。

 

 

11.3.2 表和區(extent)的關係:

      

當創建表的時候,創建段,而後自動分配相應的extent(1個或者多個),亦能夠手工提早分配extent(用於需大量插入數據的表)

              

區是段分配存儲的單位。當創建一個表段時,Oracle爲該段分配初始區,初始區究竟是多少個block?實驗代表:

 

ASSM下autoallocat方式通常是8個block,而uniform能夠使它最小5個block,MSSM方式下uniform最小能夠是2個block,一句話,所謂initial_extent最小能夠5個或2個必定是uniform形式下的。

 

SQL> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 1m extent management local uniform size 40k segment space management auto;

 

SQL> select * from dba_tablespaces;    //看initial_extent是多少

 

SQL> create tablespace b datafile '/u01/oradata/timran11g/b01.dbf' size 1m extent management local uniform size 5k segment space management manual;

 

SQL> select * from dba_tablespaces;    //看initial_extent是多少?我只給了5k(一個block是8k) oracle隱性補全到16k。

 

若是以後因爲數據的插入,初始區裝滿後,將繼續分配下一個區。

 

 

11.3.3 實驗:查看段的初始區分配狀況

 

scott:

 

SQL> create table t1 tablespace test as select * from dept;

SQL> col segment_name for a20;  

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';

 

SEGMENT_NAME          EXTENT_ID      BYTES

-------------------  ----------      ----------

T1                           0       65536

 

能夠看到段T1的初始區ID爲0,大小爲 65536 bytes;  

 

向表段中自插表數據,看Oracle爲該段分配更多的區

 

SQL> insert into t1 select * from t1;

已建立2048行。

   

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';

 

SEGMENT_NAME          EXTENT_ID       BYTES

--------------------  ----------      ----------

T1                        0       65536

T1                        1       65536

T1                            2       65536

 

此時看到隨着數據的插入,T1段動態擴展爲三個區;

 

SQL> delete t1;

 

已刪除4096行。

 

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';

 

          SEGMENT_NAME                    EXTENT_ID               BYTES

          --------------------            ----------        ----------

                    T1                            0               65536

                    T1                            1               65536

                    T1                            2               65536

 

此時表段的數據已經刪除,但全部extent依然健在,沒法回收T1段的區(這是高水位線問題);

 

能夠再擴展表:

 

sys:

alter table scott.t1 allocate extent (datafile '/u01/oradata/timran11g/test01.dbf' size 5m);

 

查看

 

SQL> select segment_name,extent_id,file_id,bytes from dba_extents where segment_name='T1';

 

SEGMENT_NAME          EXTENT_ID    FILE_ID      BYTES

-------------------- ---------- ---------- ----------

T1                            0          6      65536

T1                            1          6      65536

T1                            2          6      65536

T1                            3          6    1048576

T1                            4          6    1048576

T1                            5          6    1048576

T1                            6          6    1048576

T1                            7          6    1048576

 

回收空閒extent

 

SQL> alter table scott.t1 deallocate unused;

 

表已更改。

 

SQL> select segment_name,extent_id,file_id,bytes from dba_extents where segment_name='T1';

 

SEGMENT_NAME          EXTENT_ID    FILE_ID      BYTES

-------------------- ---------- ---------- ----------

T1                            0          6      65536

T1                            1          6      65536

T1                            2          6      65536

 

順便提一句:如何查看一個表所對應的數據文件及表空間的關係呢?

 

抓住上面dba_extents中的file_id字段(user_extents裏沒有這個字段),而後;

 

SQL> select file_id,file_name,tablespace_name from dba_data_files;

補充:

 

查看視圖

11.4 BLOCK(數據塊)

 

11.4.1 BLOCK(數據塊)的特色:

Block 是 oracle進行IO操做的最小單位,block 的管理方法是區的管理和段管理的具體體現。

數據塊的管理方法也分兩種:

 

一、自動管理方式  如建立表空間時設置爲本地管理方式,而且將段的存儲空間方式設置爲AUTO(即ASSM),該表空間的全部塊均採用自動管理方式。這是系統默認的。

 

二、手工管理方式  是傳統的管理方式,主要經過PCTFREE和PCTUSED兩個存儲參數控制可用存儲區的大小,避免行遷移現象的發生。這兩個參數可在建立表空間時設置,也可在創建數據庫的模式對象(表,索引)中設置。模式對象中設置的優先級比表空間的要高。就是說;如表和索引中沒有設置,則按表空間的設置,如表空間也沒設置,則按自動管理方式管理塊。

 

data block :oracle 11g 標準塊:8k,支持2-32k,

有block header 、free space 、data 組成

 

 

               

  數據塊併發訪問:由數據塊的事務槽來分配

ITL :事務槽,能夠有多個ITL以支持併發事務,每當一個事務要更新數據時,必須先獲得一個ITL槽,而後將當前事務ID,事務所用的undo塊兒,

  initrans :初始化事務槽的個數(1·255),表默認1,index 默認爲2;

  maxtrans: 最大的事務槽個數 (默認255)

  pctfree:預留給update 操做的空間,free space 大於pctfree 能夠insert,小於,不容許insert

 

數據塊的free space 管理:

 

  pctfree:用來爲一個塊保留的空間百分比,以防止在從此的更新操做中增長一列或多列值的長度。達到該值,從freelist清除該塊信息。

 

  pctused:一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操做。達到該值,該塊信息加入freelist

 

  freelist:可用列表中登記了能夠插入數據的可用塊,位置在段頭,插入錶行數據時首先查找該列表。

 

 

  行連接:指一行存儲在多個塊中的狀況,這是由於該行的長度超過了一個塊的可用空間大小,即行連接是跨越多塊的行。

 

  行遷移:指一個數據行因爲update語句致使當前塊被從新定位到另外一個塊(那裏有充足的空間)中,但在原始塊中保留一個指針的情形。原            始塊中的指針是必需的,由於索引的ROWID項仍然指向原始位置。(pctfree問題)注意行遷移與insert和delete語句無關(考點)。

 

如何可以知道發生了行連接或行遷移?

 

查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,當CHAIN_CNT有值時,看AVG_ROW_LEN,它表示行的平均長度,若是小於塊大小,那麼行是遷移行,若是大於塊大小,那麼是連接行。

 

SQL> create table t1 (c1 varchar2(20));

 

SQL> begin

  2    for i in 1..1000 loop

  3    insert into t1 values(null);

  4    end loop;

  5  end;

  6  /

 

分析t1表肯定無行遷移

 

SQL> analyze table t1 compute statistics;

SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';

 

AVG_ROW_LEN  CHAIN_CNT

----------- ----------

          3          0

 

填充這些空列,再分析t1,有了行遷移

SQL> update t1 set c1='timran is my name';

SQL> analyze table t1 compute statistics;

SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';

 

AVG_ROW_LEN  CHAIN_CNT

----------- ----------

         26        865

 

使用段重組(即move),再分析t1,行遷移消失

SQL> alter table t1 move;

SQL> analyze table t1 compute statistics;

SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';

 

AVG_ROW_LEN  CHAIN_CNT

----------- ----------

         21          0

 

考點:對於大部分目的而言,應該用DBMS_STATS包中的過程分析表,但要查看行連接或行遷移信息,只能經過ANALYZE命令檢測。

 

11.4.2 表和數據塊(block)的關係

 

1)什麼是高水位線?

 

高水位線(high-water mark,HWM)

顧名思義,高水位線有點類型於水文監測站裏測水深度的標杆同樣,當水漲的時候,水位線隨之上升,並在標杆留下一個水印痕,這個水印痕就是高水位線。在數據庫中,上述比喻很恰當。若是把表想象成一個平面結構,或者想象成從左到右依次排開的一系列塊,高水位線就是包含了數據的最右邊的塊。

 

原則上HWM只會增大,不會縮小,即便將表中的數據所有刪除,HWM仍是爲原值。

 

HWM對數據庫的操做有以下影響:

   

a) 全表掃描一般要讀出直到HWM標記的全部的屬於該表數據庫塊,即便該表中沒有任何數據。

b) 即便HWM如下有空閒的數據庫塊,鍵入在插入數據時使用了append關鍵字,則在插入時使用HWM以上的數據塊,此時HWM會自動增大。

 

2)兩個解決辦法

 

2.1)移動表move, 從一個表空移動到另外一個表空間(也能夠在本表空間內move), 能夠清除表裏的碎片。

 

語法:alter table t1 move [tablespace users];

 

優勢:能夠清除數據塊中的碎片,下降高水位線

缺點:move過程當中,表上的不能作DML或DDL操做。

      move以後, 相關索引都不可用了,表上的索引須要重建(考點)。

 

create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 100m;

create table scott.t2 tablespace timran as select * from dba_objects;

select max(rownum) from t2;

select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T2';

analyze table t2 compute statistics;

delete t2 where rownum<=40000;

commit;

analyze table t2 compute statistics for table;

select table_name, blocks, num_rows from user_tables where table_name='T2';

 

這時候,num_rows已經減掉了40000條, 但 blocks 並無減小, 說明HWM沒有降低。

 

alter table t2 move tablespace users;

select * from user_tables where table_name='T2';

select table_name, blocks, num_rows from user_tables where table_name='T2';

 

能夠看到blocks減小了,

 

2.2)收縮表shrink,將數據行從一個數據塊移動到另外一個數據塊。

     表收縮的底層實現的是經過匹配的INSERT和DELETE操做,它分兩個不一樣的階段:壓縮階段和DDL命令階段。

    

語法:alter table t2 shrink space [cascade][compact];

 

前提:1)表所在的表空間使用了ASSM,由於位圖方法才記錄有關塊實際有多滿的信息(考點)。2)表上啓用了row movement

 

drop table t2 purge;

 

....重複上面步驟

 

alter table t2 enable row movement;

alter table t2 shrink space;

analyze table t2 compute statistics for table;

 

考點1:表收縮操做生成undo和redo數據,索引能夠獲得維護,由於收縮實現爲一組DML事務,在壓縮期間不鎖表,但在移動單獨行時將鎖行。

考點2:SHRINK SPACE COMPACT 命令重組段的內容,它執行第一階段,不返回空間給表空間。

考點3:表必須遵照前面所說的兩個前提,不然不能收縮,若是不知足前提,MOVE就是重組表的惟一方式。

考點4:使用位圖管理塊,不能收縮MSSM管理,或有LONG列表或是有refresh_on_commit物化視圖的表。

 

11.5 臨時表空間

 

11.5.1 temporary tablespace用途:

 

用於排序,能夠創建多個臨時表空間,但默認的臨時表空間也只能有一個,default temporary tablespace不能offline和drop。若是未指定默認的臨時表空間,oracle 將會使用system做爲臨時表空間。 只有temp表空間是nologing  其餘表空間都是logging的。

 【當臨時表空間爲空時】 

09:00:53

SQL> alter tablespace temp add tempfile '/u01/oradata/timran11g/temp01.dbf' size 100m reuse;

 

這等於在原地重置了臨時表空間

 

09:01:14 SQL>  select file_id,file_name,tablespace_name from dba_temp_files;

 

   FILE_ID FILE_NAME                                          TABLESPACE_NAME

---------- -------------------------------------------------- ------------------------------

         1 /u01/oradata/timran11g/temp01.dbf                  TEMP

 

09:01:17 SQL> col name for a60;

09:01:19 SQL> select file#,name ,bytes/1024/1024 from v$tempfile;

 

     FILE# NAME                                               BYTES/1024/1024

---------- -------------------------------------------------- ---------------

         1 /u01/oradata/timran11g/temp01.dbf                              100

 

 

11.5.2 創建臨時表空間temp2並查看

09:04:18

SQL> create temporary tablespace temp2 tempfile '/u01/oradata/timran11g/temp02.dbf' size 10m extent management local uniform size 128k;

 

09:06:17 SQL> select file#,name from v$tempfile;

 

     FILE# NAME

---------- --------------------------------------------------

         1 /u01/oradata/timran11g/temp01.dbf

         2 /u01/oradata/timran11g/temp02.dbf

 

 

11.5.3 查看默認的臨時表空間

 

09:06:52 SQL> col PROPERTY_VALUE for a30

09:06:59 SQL> col description for a40

09:07:04 SQL> select * from database_properties;

 

PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION

------------------------------ ------------------------------ ----------------------------------------

DICT.BASE                      2                              dictionary base tables version #

DEFAULT_TEMP_TABLESPACE        TEMP                           Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE   USERS                          Name of default permanent tablespace

DEFAULT_TBS_TYPE               SMALLFILE                      Default tablespace type

NLS_LANGUAGE                   AMERICAN                       Language

NLS_TERRITORY                  AMERICA                        Territory

.....

 

27 rows selected.

 

11.5.4 用戶指定臨時表空間

 

20:55:00 SQL> alter user scott temporary tablespace temp2;                                                                             

11.5.5 切換默認的臨時表空間

 

09:07:05 SQL> alter database default temporary tablespace temp2;

09:07:34 SQL> select * from database_properties;

 

PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION

------------------------------ ------------------------------ ----------------------------------------

DICT.BASE                      2                              dictionary base tables version #

DEFAULT_TEMP_TABLESPACE        TMP01                          Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE   USERS                          Name of default permanent tablespace

DEFAULT_TBS_TYPE               SMALLFILE                      Default tablespace type

NLS_LANGUAGE                   AMERICAN                       Language

NLS_TERRITORY                  AMERICA                        Territory

NLS_CURRENCY                   $                              Local currency

NLS_ISO_CURRENCY               AMERICA 

...

 

09:07:41 SQL>

           

11.5.6 創建臨時表空間組 (10g新特性)

 

在不少狀況下,會有多個session 使用一個用戶名去訪問Oracle,而臨時表空間又是基於用戶的,那麼能夠創建一個臨時表空間組,其中若干臨時表空間組成,從而能夠提升表空間的使用效率。

 

1)臨時表空間組沒法顯式建立,當第一個臨時表空間分配給該組時自動建立。

 

09:07:41 SQL> alter tablespace temp tablespace group tmpgrp;

 

09:09:33 SQL> alter tablespace temp2 tablespace group tmpgrp;

 

09:09:38 SQL> select * from dba_tablespace_groups;

 

GROUP_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

TMPGRP                         TEMP

TMPGRP                         TEMP2

 

2)將臨時表空間組設成默認臨時表空間,能夠實現負載均衡。

 

09:09:52 SQL> alter database default temporary tablespace tmpgrp;

 

Database altered.

 

09:10:10 SQL> select * from database_properties;

 

PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION

------------------------------ ------------------------------ ----------------------------------------

DICT.BASE                      2                              dictionary base tables version #

DEFAULT_TEMP_TABLESPACE        TMPGRP                         Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE   USERS                          Name of default permanent tablespace

DEFAULT_TBS_TYPE               SMALLFILE                      Default tablespace type

NLS_LANGUAGE                   AMERICAN                       Language

NLS_TERRITORY                  AMERICA                        Territory

 

3)要移除表空間組時,該組不能是缺省的臨時表空間。

 

SQL>alter database default temporary tablespace temp;

 

05:36:11 SQL> select * from database_properties;

 

PROPERTY_NAME                  PROPERTY_VALUE                 DESCRIPTION

------------------------------ ------------------------------ ----------------------------------------

DICT.BASE                      2                              dictionary base tables version #

DEFAULT_TEMP_TABLESPACE        TEMP                           Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE   USERS                          Name of default permanent tablespace

DEFAULT_TBS_TYPE               SMALLFILE                      Default tablespace type

NLS_LANGUAGE                   AMERICAN                       Language

 

05:38:11 SQL> alter tablespace temp tablespace group '';

05:38:16 SQL> alter tablespace tmp01 tablespace group '';

 

Tablespace altered.

 

4)當組內全部臨時表空間被移除時,組也被自動刪除。

 

05:38:23 SQL> select * from dba_tablespace_groups;

no rows selected

 

SQL> drop tablespace tmp01 including contents and datafiles;

   【乾淨刪除表空間】

11.6 如何調整表空間的尺寸(表空間的大小等同它下的數據文件大小之和)

  

當發生表空間不足的問題時經常使用的3個解決辦法:

 

1)增長數據文件大小(resize),

 

alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 5m;

 

2)增長數據文件(add datafile),

 

alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m;

 

3)設置表空間自動增加(autoextend),

 

alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m;

 

 

SQL> create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 5m;

 

05:46:08 SQL> create table scott.test1 (id int) tablespace timran;

05:47:11 SQL> insert into scott.test1 values(1);

05:47:15 SQL> insert into scott.test1 select * from scott.test1;

05:47:19 SQL> /

05:47:29 SQL> /

 

32768 rows created.

 

05:47:23 SQL> /

insert into scott.test1 select * from scott.test1

*

ERROR at line 1:

ORA-01653: unable to extend table SCOTT.TEST1 by 8 in tablespace TIMRAN

 

//用第一種方法擴充表空間

05:47:23 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 10m;

 

05:48:18 SQL> insert into scott.test1 select * from scott.test1;

 

05:48:25 SQL> /

 

131072 rows created.

 

05:48:26 SQL> /

insert into scott.test1 select * from scott.test1

*

ERROR at line 1:

ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN

 

//用第二種方法擴充表空間:

 

05:48:57 SQL> alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m;

 

05:49:04 SQL> insert into scott.test1 select * from scott.test1;

 

05:49:13 SQL> /

 

524288 rows created.

 

05:49:14 SQL> /

insert into scott.test1 select * from scott.test1

*

ERROR at line 1:

ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN

 

 

//用第三種方法擴充表空間:

 

05:49:15 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m;

 

05:49:33 SQL> insert into scott.test1 select * from scott.test1;

 

05:49:37 SQL> drop tablespace timran including contents and datafiles;

 

11.7 Oracle的Resumable功能

 

當咱們執行一個事務操做,好比要創建一個大表,或往表裏面插入大量數據時,若是中途由於表空間剩餘空間不足而且沒有開啓自動擴展的話,會報 OUT-OF-SPACE錯誤,事務會中斷,白白浪費了時間及數據庫資源。那麼,Oracle還爲咱們提供了一個很好的功能:resumable。

在resumable開啓的狀況下,若是Oracle執行某一個SQL申請不到空間了,會停頓下來(時間能夠由TIMEOUT來控制),將相關事務的該語句掛起(suspended),可是不會報OUT-OF-SPACE這個錯誤。等你把空間的問題解決了,事務自動恢復運行,Oracle會繼續從停下來的部分開始剛纔的SQL。

待補充 :例子

第十二章: Oracle中表的幾種類型

 

一、表的功能:存儲、管理數據的基本單元(二維表:有行和列組成)

二、表的類型:

   1)普通表:heap table :數據存儲時,無序的,對它的訪問採用全表掃描。

   2)分區表:(>2G)對大表進行優化   (Range Partitioning,Hash Partitioning,List Partitioning,Composite Partitioning)

 

12.1 分區表及其種類(10g)

1.表的功能 ,存儲、管理數據的的基本單位(二維表:有行和列組成)

二、表的類型:

1) 堆表:heap table,數據存儲時,無序的,對它的訪問採用全表掃描

2)分區表  表>2G

3)索引組織表(IOT)

4)簇表

5)臨時表

6)嵌套表

三、如何將普通錶轉換爲分區表:

 

1)range分區

 

create table sale(

product_id varchar2(5), sales_count number(10,2)

)

partition by range(sales_count)

(

  partition p1 values less than(1000),

  partition p2 values less than(2000),

  partition p3 values less than(3000)

);

查看信息:

 

select * from user_tab_partitions where table_name='SALE';

 

insert into sale values('1',600);

insert into sale values('2',1000);

insert into sale values('3',2300);

insert into sale values('4',6000);

commit;

 

select * from sale partition(p1);

select * from sale partition(p2);

 

增長一個分區

alter table sale add partition p4 values less than(maxvalue);

 

再看一下, 能夠插入6000值了

select * from user_tab_partitions where table_name='SALE';

insert into sale values('4',6000);

 

12.1.1 默認狀況下,若是對分區表的分區字段作超範圍update操做,

會報錯——ORA-14402: 。若是必定要改,能夠經過打開表的row movement屬性來完成。

 

SQL> select rowid,t1.* from sale partition(p1) t1;

 

ROWID              PRODU SALES_COUNT

------------------ ----- -----------

AAASvUAAEAAAAGVAAA 1             600

 

SQL> update sale set sales_count=1200 where sales_count=600;

update sale set sales_count=1200 where sales_count=600

       *

第 1 行出現錯誤:

ORA-14402: 更新分區關鍵字列將致使分區的更改

 

SQL> alter table sale enable row movement;

SQL> update sale set sales_count=1200 where sales_count=600;

 

已更新 1 行。

 

SQL> select rowid,t1.* from sale partition(p2) t1;

 

ROWID              PRODU SALES_COUNT

------------------ ----- -----------

AAASvVAAEAAAAGdAAA 2            1000

AAASvVAAEAAAAGdAAB 1            1200

 

12.1.2 關於創建分區索引

 

SQL>create index sale_idx on sale(sales_count) local;

SQL>select * from user_ind_partitions;

 

若是還想建全表索引(不分區)則(不能與分區表索引同時存在)

 

SQL>create index sale_idx on sale(sales_count) global

SQL>select * from user_indexes;

 

 

12.1.2 散列分區 (也叫hash分區) 實現均勻的負載值分配

 

create table my_emp(

  empno number, ename varchar2(10)

)

partition by hash(empno)

(

  partition p1, partition p2

);

 

select * from user_tab_partitions where table_name='MY_EMP';

 

插入幾個值,看是否均勻插入。

 

insert into my_emp values(1,'A');

insert into my_emp values(2,'B');

insert into my_emp values(3,'C');

 

select * from my_emp partition(P1);

select * from my_emp partition(P2);

 

12.1.3 列表分區: 將不相關的數據組織在一塊兒

 

create table personcity(

  id number, name varchar2(10), city varchar2(10)

)

partition by list(city)

(

  partition east values('tianjin','dalian'),

  partition west values('xian'),

  partition south values ('shanghai'),

  partition north values ('herbin'),

  partition other values (default)

);

 

insert into personcity values(1,'sohu','tianjin');

insert into personcity values(2,'sina','herbin');

insert into personcity values(3,'yahoo','dalian');

insert into personcity values(4,'360','zhengzhou');

insert into personcity values(5,'baidu','xian');

 

看結果

 

select * from personcity partition(east);

 

12.1.4 複合分區

 

把範圍分區和散列分區相結合或者 範圍分區和列表分區相結合。

 

create table student(

   sno number, sname varchar2(10)

)

partition by range(sno)

subpartition by hash(sname)

subpartitions 4

(

  partition p1 values less than(1000),

  partition p2 values less than(2000),

  partition p3 values less than(maxvalue)

);

 

有三個range分區,對每一個分區會有4個hash分區,共有12個分區。

 

SQL> select * from user_tab_partitions where table_name='STUDENT';

 

SQL> select * from user_tab_subpartitions where table_name='STUDENT';

 

用OEM查看,看scott的student table子分區裏的名字是oracle取名。

 

Oracle11g新增分區

 

Partition(分區),一直是Oracle數據庫引覺得傲的一項技術,正是分區的存在讓Oracle高效的處理海量數據成爲可能。在Oracle11g在10g的分區技術基礎上又有了新的發展,使分區技術在易用性和可擴展性上再次獲得了加強。

 

12.1.5 Interval Partitioning

 

也稱爲間隔分區,其實是由range分區引伸而來,最終實現了range分區的自動化。

 

間隔分區的特色:

 

1).以定長寬度建立分區(好比年、月、具體的數字(好比100、500等))

2).分區字段必須是number或date類型

3).必須至少指定一個range分區(永久分區)

4).當有記錄插入時,系統根據須要自動建立新的分區和本地索引

5).已有的範圍分區可被轉換成間隔分區(經過ALTER TABLE SET INTERVAL選項完成)

 

12.1.6 System Partitioning

 

又一我的性化的分區類型,System Partitioning,在這個新的類型中,咱們不須要指定任何分區鍵,數據會進入哪一個分區徹底由應用程序決定,實際上也就是由SQL來決定,終於,咱們在Insert語句中能夠指定插入哪一個分區了。

 

12.1.7 More Composite Partitioning

在10g中,咱們知道複合分區只支持Range-List和Range-Hash,而在在11g中複合分區的類型大大增長,如今Range,List,Interval均可以做爲Top level分區,而Second level則能夠是Range,List,Hash,也就是在11g中能夠有3*3=9種複合分區,知足更多的業務需求。

 

12.1.8 Virtual Column-Based Partitioning

所謂的虛擬列,是指該列數據並不實際存儲於磁盤上,只有當讀取的時候才實時計算。

 

12.2 索引組織表

(IOT表:若是表常常以主鍵爲索引查詢,可創建索引組織表,加快表的訪問速度

 

heap table 數據的存放也是隨機的,獲取表中的數據時沒有明確的前後之分,在進行全表掃描的時候,並非先插入的數據就先獲取。而IOT 就是相似一個全是索引的表,表結構按照索引(主鍵)有序組織,所以數據存放是按照嚴格規定的,在數據插入之前就已經肯定了其位置,因此無論插入的前後順序,它在那個物理上的那個位置與插入的前後順序無關。

 

因爲IOT表是把普通表與其索引合二而一了,這樣在進行查詢的時候就能夠少訪問不少blocks,可是插入的時候,速度就比普通的表要慢一些。

 

IOT表的葉子節點存儲了全部表列,由於按主鍵排序,不須要存儲rowid。

 

設置溢出段將主鍵和溢出數據分開來存儲以提升效率。

 

說明:pctthreshold制定了在葉子節點中主鍵和其餘列的百分比,當行數據在葉子節點佔用大小超出時,將該行的其餘列放入溢出段,即overflow到指定的存儲空間去,溢出段不是必選的。

 

create table iot_timran(id int, name char(50), sal int,

constraint pk_timran primary key (id))

organization index pctthreshold 30 overflow tablespace users;

 

使用select * from user_indexes 查看是否單獨有索引。

 

SQL> select index_name,index_type,table_name from user_indexes;

 

INDEX_NAME                     INDEX_TYPE                  TABLE_NAME

------------------------------ --------------------------- ------------------------------

PK_TIMRAN                      IOT - TOP                   IOT_TIMRAN

PK_EMP                         NORMAL                      EMP

PK_DEPT                        NORMAL                      DEPT

 

12.3 簇表(cluster table):

 

兩個相互關聯的表的數據,同時放到一個簇數據塊中,當之後進行關聯讀取時,只要掃描一個數據塊就能夠了,極大地提升了效率。

 

創建簇表的三個步驟:

 

1)創建簇段cluster segment

2)基於簇,建立兩個相關表,每一個表都關聯到cluster segment上。

3)爲簇建立索引。

 

create cluster cluster1(code_key number);

create table student(sno1 number, sname varchar2(10)) cluster cluster1(sno1);

create table address(sno2 number,zz varchar2(10)) cluster cluster1(sno2);

create index index1 on cluster cluster1;

 

查看簇的信息:

select * from user_clusters;

select * from user_clu_columns;

 

刪除簇:

drop table student;

drop table address;

drop cluster cluster1;

 

 

12.4 臨時表:

用於電子商務的網上購物

 

臨時表用於存放臨時數據, 臨時表被每一個session單獨使用,即:不一樣session看到的臨時表中的數據可能不同。

 

臨時表在臨時表空間中存儲。沒有約束,索引,日誌,節省資源,訪問數據快。

 

兩種模式:

1)在事務提交時,就會自動刪除記錄,on commit delete rows。

2)當用戶退出session 時,纔會自動刪除記錄, on commit preserve rows。

 

例:scott:

create global temporary table tmp_student(sno int,sname varchar2(10), sage int) on commit preserve rows;

 

再用Scott開一個session

兩邊插入記錄看看, 你能夠在兩個session裏插入一樣的記錄,井水不犯河水!

 

要刪除臨時表,先要斷開鏈接,使用disconnect命令,這時臨時表消失了,再來刪除。

 

drop table tmp_table

 

12.5 只讀表 (11g新特性)

 

在之前版本中,有隻讀表空間但沒有隻讀表。11g中增長了新特性----只讀表。

 

SQL> alter table t read only;

SQL> update t set id=2;

update t set id=2

       *

第 1 行出現錯誤:

ORA-12081: 不容許對錶 "SCOTT"."T" 進行更新操做

 

SQL> alter table t read write;

 

 

第十三章: 數據庫審計audit

 

13.1 審計的功能:監控用戶在database 的 action (操做)

  

13.2 審計分類:

   1) session :在同一個session,相同的語句只產生一個審計結果(默認)

   2) access : 在同一個session,每個語句產生一個審計結果

       

13.3 啓用審計(默認不啓用)

09:54:18 SQL> show parameter audit                                                                                                    

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_file_dest                      string      /u01/admin/timran/adump

                                                

audit_sys_operations                 boolean     FALSE

audit_syslog_level                   string

audit_trail                          string      NONE (不啓用)

 

09:54:56 SQL> alter system set audit_trail=db  scope=spfile;                                                                  

 

09:55:02 SQL> startup force;                                                                                                 

 

09:55:23 SQL> show parameter audit                                                                                                      

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_file_dest                      string      /u01/admin/timran/adump                                            

audit_sys_operations                 boolean     FALSE

audit_syslog_level                   string

audit_trail                          string      DB

09:55:29 SQL>

 

audit_trail參數三個選項 

        

  1)none  不啓用audit

  2)db 將審計結果放在數據字典裏(database),只有dba 能夠訪問

  3)os 將審計結果存放到操做系統的文件裏(由audit_file_dest指定的位置)

        

啓用audit ,默認不審計sys用戶的action

 

audit_sys_operations=true ,啓用對於sys 用戶的審計

         

13.4 審計的對象:

(默認狀況:session ,對成功和不成功的同時審計)

                                                                                                               

oracle 提供的審計種類:語句審計、權限審計、對象審計、精細審計(FGA)、應用審計(觸發器審計)等。

 

13.5 舉例:

精細審計Fine Grained Auditing (FGA),操做能夠使用dbms_fga包或OEM。

 

1)添加一個精細度審計策略

sys:

 

begin

dbms_fga.add_policy(

object_schema=>'scott',

object_name=>'emp',

policy_name=>'chk_emp',

audit_condition =>'deptno=20',

audit_column =>'sal',

statement_types =>'update,select');

end

/

 

11:31:28 SQL> conn scott/scott

 

2)測試一下步驟,再查看審計結果                                                                                              

 

11:31:35 SQL> select * from emp;                                                                                                         

11:31:41 SQL> select * from emp where deptno=20;                                                                                        

11:31:48 SQL> update emp set deptno=10 where empno=7788;                                                                                 

11:32:12 SQL> update emp set sal=8000 where deptno=20;                                                                       

 

16:04:54 SQL> update emp set sal=8000 where deptno=10;

 

11:32:21 SQL> commit;                               

                                                                                    

3)驗證審計結果

 

11:32:24 SQL> conn /as sysdba                                                                                                           

11:33:52 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;                      

DB_USER    time                SQL_TEXT

---------- ------------------- --------------------------------------------------

SCOTT      2011-08-11 11:31:42 select * from emp

SCOTT      2011-08-11 11:31:49 select * from emp where deptno=20

SCOTT      2011-08-11 11:32:12 update emp set sal=8000 where empno=7788

SCOTT      2011-08-11 11:32:21 update emp set sal=8000 where deptno=20

 

精細審計結果存放到fga_log$的基表裏,經過dba_fga_audit_trail 查看。

 

11:34:36 SQL> select count(*) from fga_log$;                                                                                            

  COUNT(*)

----------

         4

 

11:36:20 SQL> delete from fga_log$;                                                                                          

 

11:36:26 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;          

 

no rows selected

 

4)禁止、激活、刪除FGA的PL/SQL API命令

 

禁止精細審計

04:08:08 SQL>

exec dbms_fga.disable_policy(-

object_schema=>'scott',

object_name=>'emp',-

policy_name=>'chk_emp');

 

PL/SQL procedure successfully completed.

 

激活精細審計

04:10:33 SQL>

exec dbms_fga.enable_policy(-

object_schema=>'scott',

object_name=>'emp',-

policy_name=>'chk_emp');

 

PL/SQL procedure successfully completed.

 

刪除FGA策略

04:11:52 SQL>

exec dbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'chk_emp');

 

PL/SQL procedure successfully completed.

 

刪除精細審計的結果

04:12:43 SQL> delete from sys.fga_log$;

commit;

 

 

第十四章: 數據裝載 sql loader

 

14.1 sql*loader:將外部數據

(好比文本型)數據導入oracle database。(用於數據導入、不一樣類型數據庫數據遷移)

  

14.2 sql*loader 導入數據原理:

在段(segment 表)insert 記錄

    

     1)normal:將記錄插入到segment的HWM(高水位線)如下的塊,要首先訪問bitmap ,來肯定那些block 有free space

     2)direct: 將記錄插入到segment的HWM(高水位線)以上的從未使用過的塊,加快插入速度

       

14.3 sql*loader 用法

 

SQLLDR keyword=value [,keyword=value,...]

 

看幫助信息  

$/u01/oracle/bin/sqlldr(回車)

 

*考點:sql*loader與data dump的一個區別:data dump只能讀取由它導出的文件,而sql*loader能夠讀取任何它能解析的第三方文件格式

 

 

14.4 例子:

 

1)模擬生成數據源

 

SQL> set time on

11:02:13

SQL>select empno||','||ename||','||job||','||mgr||','||hiredate||','||sal||','||comm||','||deptno from scott.emp;

 

EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||DEPTNO

------------------------------------------------------------------------------------------------------------------------

7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20

7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30

7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30

7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20

7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30

7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30

7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10

7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20

7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10

7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30

7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20

7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30

7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20

7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10

 

14 rows selected.

 

2)建個目錄

 

[oracle@timran]$mkdir -p /home/oracle/sqlload

[oracle@timran]$cd /home/oracle/sqlload

[oracle@timran sqlload]$vi emp.dat      --生成外部表

                                                                                                    

--------查看數據源

 

[oracle@timran sqlload]$ more emp.dat

7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20

7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30

7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30

7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20

7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30

7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30

7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10

7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20

7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10

7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30

7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20

7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30

7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20

7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10

 

 

3)普通模式導入

 

創建控制文件

[oracle@work sqlldr]$ vi emp.ctl

 

load data

infile '/home/oracle/sqlload/emp.dat'

insert              --insert 插入表必須是空表,非空表用append

into table emp1

fields terminated  by   ','

optionally enclosed by '"'

(

empno,

ename,

job,

mgr,

hiredate,

comm,

sal,

deptno)

 

4)在scott下創建emp1表(內部表),只要結構不要數據

 

11:10:13 SQL> create table emp1 as select * from emp where 1=2;

 

5)執行導入(normal)

[oracle@timran timran]$ sqlldr scott/scott control=emp.ctl log=emp.log

   

SQL*Loader: Release 10.2.0.1.0 - Production on Thu Aug 11 12:18:36 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Commit point reached - logical record count 14

 

5)驗證:

11:07:12 SQL>

11:07:12 SQL> select * from emp1;

 

 

上例的另外一種形式是將數據源和控制文件合併在.ctl裏描述

 

[oracle@work sqlldr]$ vi emp.ctl

load data

infile *

append

into table emp1

fields terminated  by   ','

optionally enclosed by '"'

(

empno,

ename,

job,

mgr,

hiredate,

comm,

sal,

deptno)

begindata

7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20

7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30

7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30

7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20

7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30

7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30

7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10

7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20

7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10

7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30

7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20

7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30

7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20

7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10

 

[oracle@timran sqlload]$ sqlldr scott/scott control=emp.ctl log=emp.log

 

Commit point reached - logical record count 15

[oracle@timran sqlload]$

[oracle@timran sqlload]$

[oracle@timran sqlload]$

[oracle@timran sqlload]$ ll

總計 12

-rw-r--r-- 1 oracle oinstall    1 07-17 11:09 emp.bad

-rw-r--r-- 1 oracle oinstall  782 07-17 11:09 emp.ctl

-rw-r--r-- 1 oracle oinstall 2055 07-17 11:09 emp.log

[oracle@timran sqlload]$ more emp.bad

 

11:09:34 SQL>SQL> select count(*) from emp1;

 

  COUNT(*)

----------

        28

 

  

第十五章: oracle 網絡

 

15.1 Oracle Net 基本要素:

 

15.1.1 服務器端的listener (監聽器)

1)listener:在oracle server 上啓動,負責接收client process 並派生server process ,與client process 創建session

2)創建listener :經過 netca

3)listener 配置

4)lsnrctl start|stop|status

5)$ORACLE_HOME/network/admin/listener.ora 配置程序,動態註冊能夠不使用這個配置程序。

 

 

15.2 客戶端連接:

 

1)$ORACLE_HOME/network/admin/tnsnames.ora 配置文件。

如:

myoracle =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = timran11g)

    )

  )

 

2) 注意幾個地方

2.1 HOST=目標機的IP,若是是windows平臺,習慣使用主機名。PORT=1521這是動態註冊的默認端口號。

2.2 SERVICE_NAME 是目標機的instance名,不能寫錯。

2.3 myoracle是鏈接符,表明的是等號後面整個網絡鏈接字符串,爲了便於記憶,它經常和SERVICE_NAME同名。但含義不一樣。

 

C:\Documents and Settings\timran>sqlplus sys/oracle@myoracle as sysdba

 

15.3 lisenter 註冊:

告訴listener ,database的instance name 和 service name   

    

1)動態註冊:listener 採用的是默認端口(1521),當實例啓動時,由pmon 自動將instance name 和service name 註冊到listener

2)靜態註冊:當listener 使用的是非標準端口(1521),在listener.ora的文件裏手工註冊(添加instance name 和 service name)

 

15.3.1 動態註冊和靜態註冊的區別

 

靜態註冊:

1)靜態註冊不須要監聽器啓動,數據庫關閉時能夠完成靜態註冊,於是能夠進行遠程啓動/關閉數據庫的任務。

2)靜態註冊使用用戶指定的端口號(非1521),相對隱蔽,安全。

3)靜態註冊須要listener.ora描述。

 

動態註冊:

1)須要監聽器啓動,而監聽器依賴數據庫打開才能開啓。因此動態註冊沒法遠程啓動數據庫。

2)使用標準1521端口,自動註冊。

3)能夠不使用listener.ora

 

例子:動態註冊和靜態註冊搭配使用

 

[oracle@timran admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/oracle/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

LSN2 =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1522))

    )

  )

 

SID_LIST_LSN2 =

    (SID_LIST =

    (SID_DESC =

        (GLOBAL_DBNAME= timran11g)

        (ORACLE_HOME = /u01/oracle)

        (SID_NAME = timran11g)

      )

)

 

--以上是靜態監聽描述

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = /u01/oracle)

      (PROGRAM = extproc)

    )

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = timran.localdomain)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

    )

  )

--以上是動態監聽默認描述

 

[oracle@timran admin]$

 

--啓動lsn2

 

[oracle@timran admin]$ netstat -an|grep 1522

tcp        0      0 0.0.0.0:1522                0.0.0.0:*                   LISTEN     

tcp        0      0 192.168.8.240:1522          192.168.8.248:3371          ESTABLISHED

tcp        0      0 192.168.8.240:33187         192.168.8.240:1522          ESTABLISHED

tcp        0      0 192.168.8.240:1522          192.168.8.240:33187         ESTABLISHED

 

啓動靜態監聽器

 

[oracle@timran admin]$ lsnrctl start lsn2

 

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-AUG-2011 11:13:33

 

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...

 

TNSLSNR for Linux: Version 10.2.0.1.0 - Production

System parameter file is /u01/oracle/network/admin/listener.ora

Log messages written to /u01/oracle/network/log/lsn2.log

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))

STATUS of the LISTENER

------------------------

Alias                     lsn2

Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date                12-AUG-2011 11:13:33

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/oracle/network/admin/listener.ora

Listener Log File         /u01/oracle/network/admin/log/lsn2.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))

Services Summary...

Service "prod" has 1 instance(s).

  Instance "prod", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

 

----------查看lsn2 status

 

[oracle@timran admin]$ lsnrctl status lsn2

 

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-AUG-2011 11:16:18

 

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))

STATUS of the LISTENER

------------------------

Alias                     lsn2

Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date                12-AUG-2011 11:13:33

Uptime                    0 days 0 hr. 2 min. 44 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/oracle/network/admin/listener.ora

Listener Log File         /u01/oracle/network/log/lsn2.log

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))

Services Summary...

Service "prod" has 1 instance(s).

  Instance "prod", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

 

//status unknown 表示instance 是以靜態註冊方式註冊

 

 

客戶端的tnsnames.ora配置文件

 

lsn2 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.88)(PORT = 1522))

    )

    (CONNECT_DATA =

      (SERVICE_NAME =timran11g)

    )

  )

 

timran11g =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = timran11g)

    )

  )

 

EXTPROC_CONNECTION_DATA =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

    )

    (CONNECT_DATA =

      (SID = PLSExtProc)

      (PRESENTATION = RO)

    )

  )

 

說明:lsn2是靜態註冊連接,端口號1522。timran11g是動態註冊連接,端口號1521.

 

*考點:

 

1)若是沒有使用RAC,那麼監聽器必須與實例在同一臺主機上運行。在RAC環境下,集羣中任何主機的任何監聽器均可以任何主機的任何實例。

2)若是監聽器中止運行,那麼不能啓動任何新的服務器進程,但不會影響先前已經創建的會話。

3)共享鏈接方式下,會話與調度進程在會話期間持久存在,而與監聽器的鏈接是短暫的。        

    

第三部分: 管理ORACLE數據庫

 

第十六章:Oracle ASM 管理(ppt-II:602-636)

 

16.1 什麼是ASM

 

自動存儲管理即ASM(Automatic Storage Management),是Oracle提供的一項管理磁盤的功能,它是一種以純軟件方式實現的邏輯卷管理器,功能上提供了基於Oracle數據文件的條帶化和可選的鏡像。ASM的知識同時涉及了數據庫管理和系統管理兩大領域。

 

16.2 系統級的磁盤管理

 

物理卷:指的是獨立磁盤,或磁盤分區或磁盤RAID結構。

邏輯卷:LVM(Logical Volume Manager),以軟件方式將虛擬磁盤呈現給用戶,LVM是操做系統級別的。提供了磁盤管理的靈活性,可靠性,具        有條帶,鏡像和快照等功能。

磁盤陣列上的RAID技術:但願經過多個物理卷加強性能和容錯性,經常使用的有4個級別,RAID0,RAID1,RAID5,RAID0+1。

 

16.3 ASM和LSM的比較

 

1)ASM瞭解Oracle特性,它提供的條帶和鏡像功能是基於文件的,而不像LVM是基於物理卷的。因此ASM能夠作到不一樣的數據文件有不一樣的條帶大小,這對提升系統性能來講是一個優點。

2)因爲基於文件的條帶,ASM能夠針對數據文件制定不一樣的容錯方案,好比system表空間的數據文件能夠採用3個副本的鏡像,而臨時表空間的數據文件根本不須要鏡像。

3)ASM增長/刪除磁盤後會使磁盤組上的文件從新均衡分佈,這個過程是自動完成的。除了高級存儲如EMC或EVA之外,通常的LVM是不提供的,

4)ASM是Oracle綁定的,不一樣的平臺上可移植性好,不像LVM依賴硬件廠商提供的OS,各有各的LVM技術,而有些OS上並無捆綁LVM,那麼要使用的話還要從第三方購買。

 

16.4 ASM體系結構

(如下概念全是考點)

 

16.4.1 ASM實例

ASM數據庫須要啓動ASM實例,非ASM數據庫實例(又叫標準實例)的默認參數INSTANCE_TYPE是RDBMS,此參數設置成ASM將啓動ASM實例,ASM實例負責定位數據文件,注意僅僅是定位,數據文件的IO讀寫操做仍是由RDBMS實例完成的。

 

ASM實例合法參數不多,應該設置ASM_DISKTRING表示ASM磁盤和ASM_DISKGROUP參數來標識ASM磁盤組,這些參數在RDBMS實例中是沒有的。

 

16.4.2 ASM文件

ASM能夠管理的文件有數據文件,臨時文件,控制文件,聯機和歸檔日誌文件,spfile,及RMAN備份集和映像副本等,ASM不支持口令文件、跟蹤文件、告警文件和Oracle二進制文件(考點)。

 

16.4.3 ASM磁盤和磁盤組

 

ASM磁盤能夠是實際的磁盤,也能夠是磁盤的某個分區,或LVM管理的邏輯卷,ASM磁盤應該使用沒有文件系統的磁盤(就是說未格式化的磁盤)

 

ASM磁盤組由ASM磁盤組成,能夠包含一個或多個ASM磁盤

磁盤組中建立的文件由跨越組中全部的ASM磁盤分佈的1M大小的分配單元(AU)構成。注意,AU是基於ASM磁盤的。

只能使用RMAN備份ASM文件,操做系統命令對ASM文件不可知。

能夠向磁盤組動態添加磁盤,磁盤組會自動再平衡,即會從新條帶化文件的分配單元,注意,條帶(stripting)是基於ASM文件的。

能夠經過ALTER DISKGROUP MOUNT手動加載ASM磁盤,也能夠經過指定參數ASM_DISKGROUP動態加載。

 

16.4.4 AU和striping不是一回事

 

AU是創建磁盤組時肯定的,缺省是1M,能夠指定爲1,2,4,8,16,32或64M。

striping分爲粗粒度條帶(coarse),細粒度條帶(fine),相對1M的AU,粗粒度也是1U,而細粒度是128K,它們是針對不一樣的數據文件制定的不一樣的條帶策略,這些策略已由Oracle模板缺省定義了,好比datafile是粗粒度,control file是細粒度,如有特殊需求,可自定義模板,而後在創建表空間時引用自定義模板,

 

AU是跨一個磁盤組中的全部磁盤。

striping是跨一個磁盤組中全部磁盤文件。

 

ASM的鏡像是創建在striping上的,是extent級的。這也是對LVM的一個優點。

 

16.4.5 ASM鏡像和故障組

 

缺省ASM容錯有點相似RAID0+1,磁盤鏡像是normal redundancy(兩個副本),還能夠調整爲EXTERNAL REDUNDANCY(無鏡像),以及HIGH REDUNDANCY(三個副本)。ASM不能禁用條帶化。

 

一個磁盤組能夠由兩個或多個故障組(failgroup)組成,一個故障組由一個或多個ASM磁盤組成

 

故障組是在標準冗餘的基礎上指定鏡像策略,它是一種鏡像功能的補充,此考慮經常是出於想指定一對鏡像分配在兩路磁盤控制器下,以便在提供了更安全的共享相同資源的冗餘,

 

假定有磁盤組DG1,且建立了兩個故障組fgroup1,fgroup2,每一個故障組由個ASM磁盤組成,則對標準冗餘而言,指定兩個故障組互爲鏡像

 

failgroup1  --> asmdiskA , asmdiskB

failgroup2  --> asmdiskC , asmdiskD

 

注意:failgroup1和failgroup2互爲鏡像,這是以每一個組中全部磁盤統一考慮的,內部工做機制是鏡像extent。

 

假定文件datafileA大小爲4MB,則個4extent均勻分佈到asmdiskA,asmdiskB,一樣asmdiskC,asmdiskD也包含該文件的每一個extent

即只要有一個extent在故障組fgroup1中存在,一定有一個鏡像的extent存在於fgroup2中,反之亦然,兩個組的extent互爲鏡像。

當一個故障組中的某個磁盤損壞,假定爲asmdiskA ,則asmdiskA中原來保存的extent將會從failgroup2中複製到asmdiskB中。

總之,故障組failgroup1和failgroup2一定有相同的extent副本

 

16.4.6 ASM的同步集羣服務

要求claster服務,即便不是RAC配置,單實例工做方式也要使用CSS部分功能,另外還須要瞭解ASM也有後臺進程,如SMON,PMON,LGWR,DBWR,CKPT等,此外還增添了兩個新進程,一個是RBAL,一個是ARBn

 

RBAL:用於協調和管理磁盤組之間的動態平衡

ARBn:能夠爲多個,用於完成AU的移動

 

特別注意 RBAL在ASM實例和RDBMS實例中各有一個,但功能不一樣,前者是負責協調ASM再平衡活動,後者負責打開和關閉ASM磁盤。

 

16.4.7 關於ASM實例和RDBMS實例的啓動和關閉

1)只能在nomount 下啓動ASM實例,它永遠不能mount控制文件,也不能打開datafile

2)啓動:ASM實例先啓動,RDBMS實例後啓動。退出:RDBMS實例先shutdwon immediate,ASM實例後退出.

3) 若是ASM實例崩潰,RDBMS也崩潰。若是RDBMS shutdown abort,ASM實例什麼也不作。

 

16.4.8 關於ASM文件

 

1)創建條帶是必須的,而鏡像則是可選的。但ASM文件的默認特性是:同時條帶化和鏡像文件。

 

2)ASM文件是由RDBMS實例打開,不是ASM實例打開。

 

 

16.5 在Linux上建立ASM實例的範例

 

1).Oracle ASMlib 安裝

 

ASMlib是Oracle針對linux 操做系統作的ASM管理套件,ASMlib 簡化磁盤管理,取代原來咱們在linux 上經常使用rawdevices 服務。

 

根據linux不一樣的內核版本,對應有不一樣的ASMlib包,下載地址:http://www.oracle.com/technetwork/server-storage/linux/asmlib/index-101839.html

 

真正須要安裝的ASMlib通常是三個包,以下:

 

oracleasm-kernel-version.arch.rpm

oracleasmlib- version .arch.rpm

oracleasm-support-version.arch.rpm

 

好比,個人linux內核版本是:

[root@timran ~]# uname -a

Linux timran.localdomain 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 athlon i386 GNU/Linux

根據上面的kernel版本,我找到的三個對應的ASMlib包應該是:

 

oracleasm-2.6.18-53.el5-2.0.4-1.el5.i686.rpm

oracleasmlib-2.0.4-1.el5

oracleasm-support-2.1.7-1.el5

 

將這三個包加載到linux kernel中

 

[root@timran oracle]# rpm -qa |grep asm

 

[root@timran oracle]# rpm -ivh *.rpm

warning: oracleasmlib-2.0.4-1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159

Preparing...                ########################################### [100%]

   1:oracleasm-support      ########################################### [ 33%]

   2:oracleasm-2.6.18-53.el5########################################### [ 67%]

   3:oracleasmlib           ########################################### [100%]

[root@timran oracle]# reboot        //重啓一下,看看主控臺顯示ASM驅動可否正常加載.

 

Broadcast message from root (pts/1) (Thu Nov 15 16:23:30 2012):

 

The system is going down for reboot NOW!

 

ASMlib包裝好後會在/etc/init.d/下出現oracleasm這個service,它能夠支持不少關於ASM的操做。

 

 

2).啓用css服務(Cluster Synchronization Services ),用於同步ASM實例與RDBMS實例

 

   使用root賬戶進行配置,配置程序位於$ORACLE_HOME/bin

 

[root@timran ~]# /u01/oracle/bin/localconfig add

 

/u01/oracle/bin/localconfig add

/etc/oracle does not exist. Creating it now.

Successfully accumulated necessary OCR keys.

Creating OCR keys for user 'root', privgrp 'root'..

Operation successful.

Configuration for local CSS has been initialized

 

Cleaning up Network socket directories

Setting up Network socket directories

Adding to inittab

Startup will be queued to init within 30 seconds.

Checking the status of new Oracle init process...

Expecting the CRS daemons to be up within 600 seconds.

Cluster Synchronization Services is active on these nodes.

        timran

Cluster Synchronization Services is active on all the nodes.

Oracle CSS service is installed and running under init(1M)

[root@timran ~]#

 

3).建立ASM參數文件(使用VI或VIM)

 

[root@timran dbs]# cat /u01/oracle/dbs/init+ASM.ora

#*.asm_diskgroups='DG1'   --這行先註釋掉,等到建完磁盤組後再去掉#號

*.asm_diskstring=''   --這裏有個技巧,設成空表示能夠搜索任意的ASM磁盤

*.diagnostic_dest='/u01'

*.instance_type='ASM'

*.instance_name='+ASM'

*.large_pool_size=12M

*.remote_login_passwordfile='SHARED'

*.asm_power_limit=1

 

存盤後改一下屬主:

[root@timran dbs]# chown oracle:oinstall init+ASM.ora

 

4).建立密碼文件

 

[oracle@timran ~]$orapwd file=$ORACLE_HOME/dbs/orapw+ASM password=redhat entries=5

 

[oracle@timran ~]$export ORACLE_SID=+ASM

[oracle@timran ~]$sqlplus / as sysdba

Connected to an idle instance.

 

SQL> startup

ASM instance started

 

Total System Global Area  284565504 bytes

Fixed Size                  1299428 bytes

Variable Size             258100252 bytes

ASM Cache                  25165824 bytes

ORA-15110: no diskgroups mounted

 

實例啓動了,能夠在linux下看一下+ASM進程

[root@timran dbs]# ps -ef |grep +ASM

oracle    3993     1  0 14:31 ?        00:00:00 asm_pmon_+ASM

oracle    3995     1  0 14:31 ?        00:00:00 asm_vktm_+ASM

oracle    3999     1  0 14:31 ?        00:00:00 asm_diag_+ASM

oracle    4001     1  0 14:31 ?        00:00:00 asm_psp0_+ASM

oracle    4005     1  0 14:31 ?        00:00:00 asm_dia0_+ASM

oracle    4007     1  0 14:31 ?        00:00:00 asm_mman_+ASM

oracle    4009     1  0 14:31 ?        00:00:00 asm_dbw0_+ASM

oracle    4011     1  0 14:31 ?        00:00:00 asm_lgwr_+ASM

oracle    4013     1  0 14:31 ?        00:00:00 asm_ckpt_+ASM

oracle    4015     1  0 14:31 ?        00:00:00 asm_smon_+ASM

oracle    4017     1  0 14:31 ?        00:00:00 asm_rbal_+ASM

oracle    4019     1  0 14:31 ?        00:00:00 asm_gmon_+ASM

oracle    4021  3988  0 14:31 ?        00:00:00 oracle+ASM (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

root      4032  3235  0 14:37 pts/2    00:00:00 grep +ASM

 

若是實例不能啓動,能夠使用DBCA工具中-Configure Automatic-Storage-Management項去建立一個+ASM實例。

 

5).建立ASM磁盤及配置ASMlib驅動

       

建立ASM磁盤能夠基於三種平臺,1)磁盤,2)磁盤分區,3)邏輯卷。

此例我就選磁盤分區的示例一下:

 

在Vbox裏增長一塊4G虛盤,(注意,Vbox不支持熱插虛盤,加盤須要將linux關閉)而後啓動linux,看是否已經認出了/dev/sdb這個盤。

 

使用fdisk /dev/sdb 命令將/dev/sdb作四個同等大小的分個,分別是sdb1,sdb2,sdb3,sdb4.(linux基礎知識,這裏很少述)

你也能夠接下來作格式化,(如:mkfs.ext3 /dev/sdb*)將四個分區分別格式化成ext3文件系統,可是咱們作的是基於分區的,格式化就沒必要作了。

 

Command (m for help): p

 

Disk /dev/sdb: 4294 MB, 4294967296 bytes

255 heads, 63 sectors/track, 522 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1         123      987966   83  Linux

/dev/sdb2             124         246      987997+  83  Linux

/dev/sdb3             247         369      987997+  83  Linux

/dev/sdb4             370         492      987997+  83  Linux

 

Command (m for help): w

The partition table has been altered!

 

[root@timran init.d]# /etc/init.d/oracleasm configure

Configuring the Oracle ASM library driver.

 

This will configure the on-boot properties of the Oracle ASM library

driver.  The following questions will determine whether the driver is

loaded on boot and what permissions it will have.  The current values

will be shown in brackets ('[]').  Hitting <ENTER> without typing an

answer will keep that current value.  Ctrl-C will abort.

 

Default user to own the driver interface []: oracle

Default group to own the driver interface []: dba

Start Oracle ASM library driver on boot (y/n) [n]: y

Scan for Oracle ASM disks on boot (y/n) [y]: y

Writing Oracle ASM library driver configuration: done

Initializing the Oracle ASMLib driver: [OK]

[root@timran init.d]# reboot

 

若是你前面加的ASMlib包正確的話,你將有上面的顯示,不然有初始化ASMlib driver失敗的提示。

 

[root@timran dev]#ls /dev/oracleasm/disks   //如今尚未建立ASM磁盤,因此沒有顯示。

 

建立ASM磁盤,執行下面四行命令:

 

[root@timran disks]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb1

Marking disk "VOL1" as an ASM disk: [  OK  ]

[root@timran disks]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdb2

Marking disk "VOL2" as an ASM disk: [  OK  ]

[root@timran disks]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb3

Marking disk "VOL3" as an ASM disk: [  OK  ]

[root@timran disks]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdb4

Marking disk "VOL4" as an ASM disk: [  OK  ]

[root@timran disks]#

[root@timran dev]# ls /dev/oracleasm/disks

VOL1  VOL2  VOL3  VOL4

 

此時ASM磁盤已經建好,接下來能夠建ASM磁盤組了。

 

6).建立ASM磁盤組

 

建磁盤組有兩個辦法,一個是使用DBCA工具,另外一個是使用sqlplus命令

 

使用sqlplus命令:

 

注意:加磁盤組必須在+ASM啓動之後

#su - oracle

$export ORACLE_SID=+ASM

$sqlplus / as sysdba

SQL>

 

SQL> startup

[oracle@timran ~]$export ORACLE_SID=+ASM

[oracle@timran ~]$sqlplus as sysdba

Connected to an idle instance.

SQL> startup    

ASM instance started

ORA-15110: no diskgroups mounted       

 

加磁盤組前要改一下這個參數

 

SQL> alter system set asm_diskstring='/dev/oracleasm/disks/VOL*';

 

create diskgroup DG1 normal redundancy

failgroup FG1 disk '/dev/oracleasm/disks/VOL1'name VOL1,'/dev/oracleasm/disks/VOL2' name VOL2

failgroup FG2 disk '/dev/oracleasm/disks/VOL3'name VOL3,'/dev/oracleasm/disks/VOL4' name VOL4;

 

SQL> col name for a10;

SQL> select NAME,STATE,FREE_MB,REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB from v$asm_diskgroup;

 

NAME       STATE          FREE_MB USABLE_FILE_MB

---------- ----------- ---------- --------------

DG1        MOUNTED           3750            964

 

SQL> col failgroup for a10;

SQL> select GROUP_NUMBER,DISK_NUMBER,NAME,FAILGROUP,STATE,TOTAL_MB from v$asm_disk;

 

GROUP_NUMBER DISK_NUMBER NAME       FAILGROUP  STATE      TOTAL_MB

------------ ----------- ---------- ---------- -------- ----------

           1           3 VOL4       FG2        NORMAL          964

           1           2 VOL3       FG2        NORMAL          964

           1           1 VOL2       FG1        NORMAL          964

           1           0 VOL1       FG1        NORMAL          964

 

從新啓動前將參數文件的第一行#去掉

 

[root@timran dbs]# vi /u01/oracle/dbs/init+ASM.ora

*.asm_diskgroups='DG1'

 

到此,創建ASM的基本內容已經完成了。重啓系統,檢查一下看看磁盤組是否可以自動mounted了。

 

SQL> exit

 

[oracle@timran ~]$ export ORACLE_SID=timran11g

[oracle@timran ~]$ sqlplus / as sysdba

 

 

[root@timran ~]# su - oracle

[oracle@timran ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 15 21:11:29 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

Connected to an idle instance.

 

SQL> startup

ORA-32004: obsolete and/or deprecated parameter(s) specified

ASM instance started

 

Total System Global Area  284565504 bytes

Fixed Size                  1299428 bytes

Variable Size             258100252 bytes

ASM Cache                  25165824 bytes

ASM diskgroups mounted

SQL>

 

7)測試ASM是否能夠工做

 

啓動了+ASM實例正常後,再啓動RDBMS實例,而後創建一個+ASM上的表空間testasm作測試。

SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 15 21:26:00 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

Connected to an idle instance.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size                  1300352 bytes

Variable Size             339740800 bytes

Database Buffers           75497472 bytes

Redo Buffers                6131712 bytes

Database mounted.

Database opened.

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         2 UNDOTBS1                       YES NO  YES

         4 USERS                          YES NO  YES

         3 TEMP                           NO  NO  YES

         6 EXAMPLE                        YES NO  YES

 

6 rows selected.

 

SQL> create tablespace testasm datafile '+DG1';

 

Tablespace created.

 

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         2 UNDOTBS1                       YES NO  YES

         4 USERS                          YES NO  YES

         3 TEMP                           NO  NO  YES

         6 EXAMPLE                        YES NO  YES

         7 TESTASM                        YES NO  YES

 

7 rows selected.

 

 

SQL>select file#,name from v$datafile;

 

     FILE# NAME

---------- --------------------------------------------------

         1 /u01/oradata/timran11g/system01.dbf

         2 /u01/oradata/timran11g/sysaux01.dbf

         3 /u01/oradata/timran11g/undotbs01.dbf

         4 /u01/oradata/timran11g/users01.dbf

         5 /u01/oradata/timran11g/example01.dbf

         6 +DG1/timran11g/datafile/testasm.256.803235039

 

6 rows selected.

 

SQL> conn scott/scott

SQL> create table test(id int) tablespace testasm;

SQL> insert into test values(1);

SQL> commit;

SQL> select * from test;

 

        ID

----------

         1

 

 

8)刪除ASM

 

SQL> drop tablespace testasm including contents and datafiles;

 

[root@timran ~]# su - oracle

[oracle@timran ~]$ export ORACLE_SID=+ASM

[oracle@timran ~]$ sqlplus / as sysdb

 

SQL> drop diskgroup dg1 including contents;      //刪除ASM組和ASM磁盤要在實例啓動時作。

 

#/etc/init.d/oracleasm listdisks

VOL1

VOL2

VOL3

VOL4

 

#/etc/init.d/oracleasm deletedisk vol1

#/etc/init.d/oracleasm deletedisk vol2

#/etc/init.d/oracleasm deletedisk vol3

#/etc/init.d/oracleasm deletedisk vol4

 

 

SQL>shutdown abort      //關閉ASM實例

 

#/u01/oracle/bin/localconfig delete      //刪除css信息

 

#rm /u01/oracle/dbs/*ASM*       //刪除ASM參數文件及口令文件

 

#vi /etc/oratab                 //刪除/etc/oratab文件中的ASM實例相關行

 

[root@timran init.d]# rpm -qa |grep asm   //查詢asm有關的rpm包,

oracleasm-2.6.18-53.el5-2.0.4-1.el5

oracleasm-support-2.1.7-1.el5

oracleasmlib-2.0.4-1.el5

 

[root@timran init.d]# rpm -e oracleasmlib-2.0.4-1.el5           //刪除這三個rpm包

[root@timran init.d]# rpm -e oracleasm-2.6.18-53.el5-2.0.4-1.el5

[root@timran init.d]# rpm -e oracleasm-support-2.1.7-1.el5

[root@timran init.d]#

 

[root@timran init.d]# ll /etc/init.d/oracleasm          //確信oracleasm文件刪掉了

ls: /etc/init.d/oracleasm: No such file or directory

 

[root@timran init.d]# shutdown -h now   關閉系統, 去window下直接刪除小魔方(後加入的虛盤)。

 

重啓系統  看看sdb已經沒有了。

 

[root@timran dev]# ll /dev/sd*

brw-r----- 1 root disk 8, 0 Dec 28 17:35 sda

brw-r----- 1 root disk 8, 1 Dec 28 17:35 sda1

brw-r----- 1 root disk 8, 2 Dec 28 17:35 sda2

[root@timran dev]#

 

9)安裝測試完成後碰到了一個問題:當啓動ASM實例後再啓動RDBMS實例時報錯:

ORA-00845: MEMORY_TARGET not supported on this system

 

這個問題是因爲設置SGA的大小超過了操做系統/dev/shm的大小:

 

查看並更改/etc/fstab文件後,問題解決。

 

[root@timran ~]# df -h /dev/shm

Filesystem            Size  Used Avail Use% Mounted on

tmpfs                 506M  158M  348M  32% /dev/shm

[root@timran ~]#

[root@timran ~]#

[root@timran ~]#

[root@timran ~]# vi /etc/fstab

 

LABEL=/                 /                       ext3    defaults        1 1

tmpfs                   /dev/shm      tmpfs   defaults,size=800m        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

LABEL=SWAP-sda2         swap                    swap    defaults        0 0

 

*再強調一下如下考點:

1)ASM只能存儲數據庫文件,不能存儲二進制文件。即只能用於數據庫和恢復文件,所以Oracle的主目錄以及跟蹤、告警、口令及靜態參數文   件務必保存在常規文件系統上。

2)ASM使用RAC,但不是必須的,由於能夠使用第三方的集羣卷管理器,ASM不只僅使用RAC,由於它一樣適用於單實例的非集羣數據庫。

3)ASM鏡像默認是單鏡像,可是能夠設置爲無鏡像或雙鏡像,不能禁用條帶化。

4)常規的磁盤活動不涉及ASM實例,ASM的功能是實現對文件可用性管理和控制,它不執行實際的I/O操做。

 

第十七章:邏輯備份與恢復 

 

17.1 傳統的導入導出exp/imp:

expdp/impdp:數據泵

傳統的導出導入程序指的是exp/imp,用於實施數據庫的邏輯備份和恢復。

 

導出程序exp將數據庫中的對象定義和數據備份到一個操做系統二進制文件中。

導入程序imp讀取二進制導出文件並將對象和數據載入數據庫中

 

傳統的導出導入程序是客戶端工具。在$ORACLE_HOME/bin下

 

導出和導入實用程序的特色有:

 

1)能夠按時間保存表結構和數據

2)容許導出指定的表,並從新導入到新的數據庫中

3)能夠把數據庫遷移到另一臺異構服務器上

4)在兩個不一樣版本的Oracle數據庫之間傳輸數據

5)在聯機狀態下進行備份和恢復

6)能夠從新組織表的存儲結構,減小連接及磁盤碎片

 

使用如下三種方法調用導出和導入實用程序:

 

1,交互提示符:以交互的方式提示用戶逐個輸入參數的值。

2,命令行參數:在命令行指定執行程序的參數和參數值。

3,參數文件:容許用戶將運行參數和參數值存儲在參數文件中,以便重複使用參數

 

導出和導入數據庫對象的四種模式是:

 

1,數據庫模式:導出和導入整個數據庫中的全部對象

2,表空間模式:導出和導入一個或多個指定的表空間中的全部對象

3,用戶模式:導出和導入一個用戶模式中的全部對象

4,表模式:導出和導入一個或多個指定的表或表分區

 

17.1.1 導入導出表

 

1)scott導入導出本身的表,通常是從服務器導出到客戶端(在cmd下操做)

 

SQL> create table emp1 as select * from emp;

SQL> create table dept1 as select * from dept;

 

C:\Documents and Settings\timran>exp scott/scott@timran11g file=d:empdept1.dmp tables=(emp1,dept1)

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

已導出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集

 

即將導出指定的表經過常規路徑...

. . 正在導出表                            EMP1導出了          14 行

. . 正在導出表                           DEPT1導出了           4 行

成功終止導出, 沒有出現警告。

sysdba下導入導出其餘用戶的表

 

再導入server裏

 

SQL> drop table emp1 purge;

SQL> drop table dept1 purge;

 

C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:empdept1.dmp

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

 

經由常規路徑由 EXPORT:V10.02.01 建立的導出文件

已經完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的導入

. 正在將 SCOTT 的對象導入到 SCOTT

. 正在將 SCOTT 的對象導入到 SCOTT

. . 正在導入表                          "EMP1"導入了          14 行

. . 正在導入表                         "DEPT1"導入了           4 行

成功終止導入, 沒有出現警告。

 

使用sys導出scott的兩個表

 

C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:scott.dmp tables=(scott.emp1, scott.dept1)

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

已導出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集

 

即將導出指定的表經過常規路徑...

當前的用戶已更改成 SCOTT

. . 正在導出表                            EMP1導出了          14 行

. . 正在導出表                           DEPT1導出了           4 行

成功終止導出, 沒有出現警告。

 

SQL> drop table emp1 purge;

SQL> drop table dept1 purge;

 

使用sys再導入scott的這兩個表

 

C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott

Import: Release 11.1.0.6.0 - Production on 星期一 7月 30 21:59:58 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

 

經由常規路徑由 EXPORT:V10.02.01 建立的導出文件

已經完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的導入

. 正在將 SYS 的對象導入到 SYS

. 正在將 SCOTT 的對象導入到 SCOTT

. . 正在導入表                          "EMP1"導入了          14 行

. . 正在導入表                         "DEPT1"導入了           4 行

成功終止導入, 沒有出現警告。

 

sys導出scott表, scott導入(報錯)

 

C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:sysscott.dmp tables=(scott.emp1,scott.dept1)

 

Export: Release 11.1.0.6.0 - Production on 星期五 8月 3 14:34:52 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

已導出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集

 

即將導出指定的表經過常規路徑...

當前的用戶已更改成 SCOTT

. . 正在導出表                            EMP1導出了          14 行

. . 正在導出表                           DEPT1導出了           4 行

成功終止導出, 沒有出現警告。

 

scott導入

 

C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:sysscott.dmp

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

 

經由常規路徑由 EXPORT:V10.02.01 建立的導出文件

IMP-00013: 只有 DBA 才能導入由其餘 DBA 導出的文件

IMP-00000: 未成功終止導入

 

C:\Documents and Settings\timran>

 

17.1.2 導入導出用戶

 

當前用戶scott導出本身的全部對象, 注意僅僅導出的是schema的object,也就是說這個導出不包括數據字典中的信息,好比用戶帳戶,及原有的一些系統權限等等。

 

C:\Documents and Settings\timran>exp scott/scott@timran11g file=d:scott.dmp owner=scott

 

SQL> drop user scott cascade;

SQL> create user scott identified by scott;

SQL> grant connect,resource to scott;

 

C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:scott.dmp

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

 

經由常規路徑由 EXPORT:V10.02.01 建立的導出文件

已經完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的導入

. 正在將 SCOTT 的對象導入到 SCOTT

. . 正在導入表                         "BONUS"導入了           0 行

. . 正在導入表                          "DEPT"導入了           4 行

. . 正在導入表                         "DEPT1"導入了           4 行

. . 正在導入表                           "EMP"導入了          14 行

. . 正在導入表                          "EMP1"導入了          14 行

. . 正在導入表                      "SALGRADE"導入了           5 行

即將啓用約束條件...

成功終止導入, 沒有出現警告。

 

//若是用sys來完成也能夠使用以下命令:

 

C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott touser=scott

 

//sys用戶也能夠將導出的scott的內容導入給其餘用戶

 

C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp  fromuser=scott touser=tim

 

17.1.3 導入導出表空間

 

Oracle10g後,引入了導入導出可傳輸表空間技術,使表空間的遷移更加快速高效

 

模擬場景:xp/orcl到linux/timran11g(中文字符集)可傳輸表空間的導入導出:

 

1)在xp/orcl上創建表空間

 

sys:

create tablespace tb1 datafile 'd:/mytb1.dbf' size 5m;

scott:

create table 測試 (姓名 char(10),年齡 int) tablespace tb1;

insert into 測試 values('張三',20);

insert into 測試 values('王小二',18);

commit;

 

2)導出tb1表空間,先設爲只讀;

sys:

alter tablespace tb1 read only;

 

xp:cmd下

exp 'sys/system@orcl as sysdba' tablespaces=tb1 transport_tablespace=y file=d:\exp_tb1.dmp

 

Export: Release 11.1.0.6.0 - Production on 星期五 8月 3 16:11:25 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

已導出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

注: 將不導出表數據 (行)

即將導出可傳輸的表空間元數據...

對於表空間 TB1...

. 正在導出簇定義

. 正在導出表定義

. . 正在導出表                            測試

. 正在導出引用完整性約束條件

. 正在導出觸發器

. 結束導出可傳輸的表空間元數據

成功終止導出, 沒有出現警告。

 

3)以xmanager把exp_tb1.dmp和MYTB1.DBF都傳輸到linux/timran裏

目錄以下:/u01/oradata/timran11g

 

4)在linux的$下執行導入

 

[oracle@timran ~]$ imp userid=\'sys/system as sysdba\' tablespaces=tb1 file=/u01/oradata/timran11g/exp_tb1.dmp transport_tablespace=y datafiles=/u01/oradata/timran11g/MYTB1.DBF

 

Import: Release 11.1.0.6.0 - Production on 星期五 8月 2 22:19:50 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

Connected to: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

 

Export file created by EXPORT:V10.02.01 via conventional path

About to import transportable tablespace(s) metadata...

import done in ZHS16GBK character set and UTF8 NCHAR character set

export server uses AL16UTF16 NCHAR character set (possible ncharset conversion)

. importing SYS's objects into SYS

. importing SYS's objects into SYS

. importing SCOTT's objects into SCOTT

. . importing table                         "測試"

. importing SYS's objects into SYS

Import terminated successfully without warnings.

 

5)進入linux/timran下驗證

sys:

select tablespace_name,status from dba_tablespaces;

 

6)重設回讀寫方式

alter tablespace tb1 read write;

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

SYSTEM                         ONLINE

UNDOTBS1                       ONLINE

SYSAUX                         ONLINE

TEMP                           ONLINE

USERS                          ONLINE

EXAMPLE                        ONLINE

TB1                            ONLINE

TEXT                           ONLINE

TEST1                          ONLINE

TIMRAN                         ONLINE

 

6)驗證

scott:

select * from tab;

select * from 測試;

select table_name,tablespace_name from user_tables;

 

17.1.4 導出整個數據庫的對象

 

C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:full.dmp full=y //這個過程太長,就不作了。

 

17.2 數據泵的導入導出--expdp/impdp(10g/11g新特性)

 

exp/imp的缺點是速度太慢,在大型生產庫中尤爲明顯。從10g開始,Oracle設計了數據泵,這是一個服務器端的工具,它爲Oracle提供了高速並行的大數據遷移方法。

   

expdp/impdp的工做方式體如今須要在server端建立一個 Directory 即操做MT表。

      

舉例

 

1)server端先建好一個存放MT表的物理目錄

[oracle@timran ~]$mkdir -p /u01/oradata/timran11g/dir1

       

2)server端用SYS創建目錄對象:

 

SQL> create directory MY_DIR as '/u01/oradata/timran11g/dir1';    

 

3)爲scott授予目錄權限

 

SQL> grant read,write on directory MY_DIR to scott;

 

4)導出scott的emp dept表, 導出過程當中在server端有MT表出現SYS_EXPORT_TABLE_01,導出完成後MT表自動消失

 

C:\Documents and Settings\timran>expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,dept)

 

Export: Release 11.1.0.6.0 - Production on 星期二, 31 7月, 2012 9:54:45

 

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

Starting "SCOTT"."SYS_EXPORT_TABLE_01":  scott/********@timran directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,de

pt)

Estimate in progress using BLOCKS method...

Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 128 KB

Processing object type TABLE_EXPORT/TABLE/TABLE

Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX

Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

. . exported "SCOTT"."DEPT"                              5.648 KB       4 rows

. . exported "SCOTT"."EMP"                               7.812 KB      14 rows

Master table "SCOTT"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded

******************************************************************************

Dump file set for SCOTT.SYS_EXPORT_TABLE_01 is:

  /u01/oradata/timran11g/dir1/expdp_scott1.dmp

Job "SCOTT"."SYS_EXPORT_TABLE_01" successfully completed at 09:51:14

 

看看目錄下的導出的文件

[oracle@timran dir1]$ ll / 

總計 132

-rw-r----- 1 oracle oinstall 126976 07-30 09:51 expdp_scott1.dmp

-rw-r--r-- 1 oracle oinstall   1387 07-30 09:51 export.log

[oracle@timran dir1]$

 

5)導入expdp_scott1.dmp實驗 先刪掉原來的emp,dept 兩個表

 

SQL> conn scott/scott

SQL> drop table emp purge;

SQL> drop table dept purge;

 

C:\Documents and Settings\timran>impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp

 

Import: Release 11.1.0.6.0 - Production on 星期二, 31 7月, 2012 10:16:04

 

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

 

鏈接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP and Data Mining options

Master table "SCOTT"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SCOTT"."SYS_IMPORT_FULL_01":  scott/********@timran directory=MY_DIR dumpfile=expdp_scott1.dmp

Processing object type TABLE_EXPORT/TABLE/TABLE

Processing object type TABLE_EXPORT/TABLE/TABLE_DATA

. . imported "SCOTT"."DEPT"                              5.648 KB       4 rows

. . imported "SCOTT"."EMP"                               7.812 KB      14 rows

Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX

Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

Job "SCOTT"."SYS_IMPORT_FULL_01" successfully completed at 10:04:37

 

6)導出scott的emp detp的數據,但不導出結構

 

expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,dept) content=data_only reuse_dumpfiles=y

impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp

 

7)導出scott用戶

 

expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp1.dmp schemas=scott   //注意與exp的區別,schemas代替了owner的寫法

impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp1.dmp

                                                     

 

 

第十八章 物化視圖

 

18.一、物化視圖做用

 

1)  數據倉庫中的物化視圖主要用於預先計算並保存錶鏈接或彙集等耗時較多的操做的結果,這樣,在執行查詢時,就能夠避免進行這些耗時的操做,從而快速的獲得結果。

 

2)  物化視圖和表同樣能夠直接進行查詢。物化視圖還用於複製、移動計算等方面。

 

18.2 物化視圖建立時的權限

 

若是建立基於主鍵的物化視圖,則必須具備訪問主表、訪問主表的日誌、create MATERIALIZED VIEW這三個權限。

若是建立基於rowid的物化視圖,則必須具備訪問主表、create MATERIALIZED VIEW這兩個權限。

 

18.3 建立物化視圖語法

 

create materialized view [view_name]

refresh [fast|complete|force]

[

on [commit|demand] |

start with (start_time) next (next_time)

]

as

{建立物化視圖用的查詢語句}

 

18.4 物化視圖建立時的選項

 

1)  查詢重寫(Query Rewrite):查詢重寫是指當對物化視圖的基表進行查詢時,Oracle會自動判斷可否經過查詢物化視圖來獲得結果。默認爲DISABLE QUERY REWRITE。

 

2)  物化視圖日誌:若是須要進行快速刷新,則須要創建物化視圖日誌。物化視圖日誌根據不一樣物化視圖的快速刷新的須要,能夠創建爲ROWID或PRIMARY KEY類型的。

 

3)  刷新(Refresh):指當基表發生了DML操做後,物化視圖什麼時候採用哪一種方式和基表進行同步。刷新的模式有兩種:ON DEMAND和ON COMMIT。ON DEMAND指物化視圖在用戶須要的時候進行刷新,能夠手工經過DBMS_MVIEW.REFRESH等方法來進行刷新,也能夠經過JOB定時進行刷新。ON COMMIT指出物化視圖在對基表的DML操做提交的同時進行刷新。刷新的方法有四種:FAST、COMPLETE、FORCE和NEVER。FAST刷新採用增量刷新,只刷新自上次刷新之後進行的修改。COMPLETE刷新對整個物化視圖進行徹底的刷新。若是選擇FORCE方式,則Oracle在刷新時會去判斷是否能夠進行快速刷新,若是能夠則採用FAST方式,不然採用COMPLETE的方式。NEVER指物化視圖不進行任何刷新。默認值是FORCE ON DEMAND。

 

18.5 示例

 

測試環境:生產庫(linux)+備份庫(xp)

 

1)創建link鏈接

 

備份庫:

 

C:\Documents and Settings\timran>sqlplus sys/system@orcl as sysdba

 

sys:

 

SQL> create public database link my_link connect to scott identified by scott using 'timran11g';

 

//若是之前創建過,提示重名的話能夠使用下面語句刪掉 SQL> drop public database link my_link;

 

若想查看全部的數據庫連接,進入系統管理員SQL>操做符下,運行命令:

   

SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';

 

OWNER                   OBJECT_NAME

----------------------------------      ---------------------------------------

PUBLIC                  MY_LINK.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

2)在備份庫上測試與生產庫(啓動監聽)的訪問鏈接是否成功。

 

scott:

SQL> select * from tab;     //看備份庫(本身)

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

測試                           TABLE

 

SQL> select * from tab@my_link;  //看生產庫(別人)

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

 

範例1 基於主鍵的物化視圖

 

生產庫:(遠端linux)

 

scott:

SQL>create table test(id int primary key,name char(10));

SQL>create materialized view log on test;

 

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

MLOG$_TEST                     TABLE

RUPD$_TEST                     TABLE

SALGRADE                       TABLE

TEST                           TABLE

 

備份數據庫(本地xp)

sys:

SQL>grant create materialized view to scott;

 

scott:

SQL>create materialized view test_view refresh

fast

start with sysdate

next sysdate+1/2880

with primary key

as select * from scott.test@my_link;

 

//1440分鐘時24小時,1/1440是1分鐘,1/2880是30秒。

 

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

TEST_VIEW                      TABLE

測試                           TABLE

 

生產庫 scott:

SQL>insert into test values(1,'sina');

SQL>commit;

 

備份庫 scott:

SQL> select * from test_view;

 

未選定行

 

---30秒之後...

SQL> select * from test_view;

 

        ID NAME

---------- ----------

         1 sina

 

生產庫 scott:

SQL> insert into test values(2,'sohu');

SQL> commit;

 

 

備份庫 scott:

 

SQL> select * from test_view;

 

        ID NAME

---------- ----------

         1 sina

         2 sohu

 

範例2 基於rowid的物化視圖

 

生產庫 scott:

SQL>drop table test purge;

 

SQL>SQL> create table emp1 as select * from emp;

 

備份庫 scott:

SQL>drop materialized view test_view;

 

SQL>create materialized view emp1_view refresh with rowid

start with sysdate

next sysdate+1/2880

as select deptno,sum(sal),avg(sal) from scott.emp1@my_link group by deptno;

 

 

備份庫 scott:

SQL> select * from emp1_view;

 

    DEPTNO   SUM(SAL)   AVG(SAL)

---------- ---------- ----------

        30       9400 1566.66667

        20      10875       2175

        10       8750 2916.66667

 

生產庫 scott:

SQL> update emp1 set sal=sal+100;

SQL>commit;

 

備份庫 scott:

 

SQL> select * from emp1_view;

 

    DEPTNO   SUM(SAL)   AVG(SAL)

---------- ---------- ----------

        30      10000 1666.66667

        20      11375       2275

        10       9050 3016.66667

 

 

 

範例3 使用job, 執行基於primary key 的物化視圖

 

生產庫 scott:

SQL>drop table test purge;

 

SQL>create table test(id int primary key,name char(10));

SQL>create materialized view log on test;

 

備份庫 scott:

SQL>drop materialized view test_view

 

SQL>create materialized view test_view

as select * from scott.test@my_link;

 

create or replace procedure testview as

begin

  dbms_mview.refresh('TEST_VIEW');

end;

/

 

variable job1 number;

begin

  dbms_job.submit(:job1,'testview;',sysdate,'sysdate+1/2880');

end;

/

 

begin

  dbms_job.run(:job1);

end;

/

 

測試結果:

 

生產庫 scott:

SQL> insert into test values(1,'tim');

SQL> commit;

 

備份庫 scott:

SQL> select *from test_view;

 

        ID NAME

---------- ----------

         1 tim

 

生產庫 scott:

SQL> insert into test values(2,'ran');

SQL> commit;

 

備份庫 scott:

SQL> select *from test_view;

SQL> commit;

 

        ID NAME

---------- ----------

         1 tim

         2 ran

生產庫 scott:

 

SQL> delete test where id=2;

SQL> update test set name='timran' where id=1;

SQL> commit;

 

備份庫 scott:

SQL> select * from test_view;

 

        ID NAME

---------- ----------

         1 timran

相關文章
相關標籤/搜索