2020年9月14日 星期一

5.1 Oracle 資料庫架構

Oracle 資料庫架構大體上可以分為實體結構 (Physical Structure) 與邏輯結構 (Logical Structure) 兩種,其中的差異並不難理解,所謂的實體結構表示這些東西是實際存放在 Server 上,而且我們可以直接從系統上看到這些檔案,例如 Data file、Spfile…等都可以直接在作業系統上看到,這些就是屬於實體結構;而相反的,邏輯結構是不能直接在作業系統上看到的東西,我們必須花些想像力來理解這些東西,例如 Tablespace 就是屬於邏輯結構的一種。


Oracle 實體結構與邏輯結構之間存在著一定的關聯性:

邏輯結構當中的最小單位為 Oracle data block,所有的資料都是存放在 Oracle data block 當中,相對於實體結構則是為作業系統上的 OS block,Oracle 資料庫在使用 OS block 之前必須將他格式化為 Oracle data block 這種邏輯結構才能夠開始存放資料。 Oracle data block 預設大小為 8k,必須在建立資料庫的時候就要決定 block 大小,資料庫建立完成後就沒有辦法更改 block size。 Oracle data block size 最小可以設定為 2k 最大為 32k,由參數 db_block_size 所決定,以現在來說,一般使用預設的 8k 便是最適合所有類型的系統了,在建立資料庫的時候不太會特別去調整 block size。


邏輯結構的單位由小至大分別為 Oracle data block、Extent、Segment,以及 Tablespace。多個 Oracle data block 會構成一個 Extent ,多個 Extent 構成一個 Segment ,最後多個 Segment 則是組成一個 Tablespace 。 Tablespace 這個邏輯結構相對於實體結構則是為 Data file,一個 Tablespace 可能由一個或多個 Data file 所組成,而 Tablespace 是所有資料庫物件存放的基礎,在建立任何資料庫物件之前必須建立一個 Tablespace 來存放它,而建立 Tablespace 則是要由建立實體的 Data file 來組成。


例如一個表格(Table)存放在 Oracle 資料庫的邏輯意識圖如下:

首先必須由實體結構的 Data file 來搭建一個 Tablespace,然後就可以在這個 Tablespace 裡面來建立一個表格(Table),在 Table 建立的當下,就會在這個 Tablespace 當中建立一個 Data Segment 來供這個 Table 所使用。未來對這個表格新增的任何一筆資料我們稱作 Row Piece ,當有一筆 Row Piece 新增進來,這個 Data Segment 就必須要搜尋底下的 Extent 當中有哪些 Data Block 是具有空閒的位置來存放這筆 Row Piece ,找到之後就把這筆 Row Piece 存放在 Oracle Data Block 當中,這樣就完成了一筆資料的操作。


Oracle 資料庫的實體結構與邏輯結構存在著密不可分的關係,因此我們在使用 Oracle 資料庫之前必須先了解實體與邏輯結構。



2020年9月3日 星期四

4.9 Automatic Diagnostic Repository (ADR)

自從 Oracle 11g 開始,推出了 Automatic Diagnostic Repository (ADR) 這個功能,目的是用來集中化管理資料庫所有的 log 與 trace file,以往 Oracle 資料庫所產生的 trace file 共分開三個地方存放,分別為 background_dump_dest 、 core_dump_dest 、 user_dump_dest ,預設是放在 $ORACLE_BASE/admin/<SID> 底下的 bdump 、 cdump 、 udump 目錄,而 ADR 則是把這些目錄下的所有檔案集中到一個 $ADR_BASE 底下的目錄結構來管理:

 

預設 ADR Base 為 $ORACLE_BASE,而資料庫參數 diagnostic_dest 則是可以指定此資料庫的 log 檔要放在哪一個 ADR Base 底下:

 

ADR Base 底下分別存放著不同種類的 log ,例如 DB 相關的 log 放在 diag/rdbms 目錄底下;ASM 相關的 log 放在 diag/asm 目錄,listener log 則是放在 diag/tnslsnr 底下…等。以往的 bdump 、 cdump 、 udump 則是都集中在 diag/rdbms 底下,最大的改變是 DB 的 alert log 由原本的 budmp 目錄改放到 diag/rdbms/<db_name>/<SID>/trace 底下:

ADR 雖然將所有的 log 集中化起來,但卻造成目錄結構冗長的狀況,也因此產生了新的命令 adrci ,用來幫助我們快速檢視 ADR 底下的內容。


執行 adrci 會進入 adrci> 並自動帶入預設的 ADR Base:

執行 help 可以查閱所有 adrci 可執行的命令。


假如 ADR Base 不是使用預設的 $ORACLE_BASE,可以在進入 adrci 之後使用 show base 與set base 來查看與設定 ADR Base:

 

透過 ADR 最常使用的功能不外乎是查看 DB 的 alert log,進入 adrci 後使用 show alert 會列出所有 log 的路徑,然後再選擇我們要看的那個 db 就好了:

選擇好之後會以文字編輯器 (Unix 系統為 vi) 開啟所要查看的 log。


另外還可以使用 tail –f 的方式來檢視 alert log,需先使用 set home設定要查閱的 home 目錄:


ADR 底下的檔案維護分為 SHORTP_POLICY 與 LONGP_POLICY ,SHORTP_POLICY 預設為 720 (單位:小時,30天) 自動清理 trace files 、Core dump files 與 Packaging information ; LONGP_POLICY 預設為 8760 (單位:小時,365天) 自動清理 Incident information 、 Incident dumps 與 alert logs。可以透過 set control 來修改,例如將 SHORTP_POLICY 改為 360、LONGP_POLICY 改為 4380 如下:


adrci> set control (SHORTP_POLICY = 360)

adrci> set control (LONGP_POLICY = 4380)


要查看設定則是使用 show control 指令:


除此之外也可以直接使用 purge 指令來手動清理 ADR 底下的檔案,一般 purge 指令會加上 –age 參數來指定要清理幾天以前的檔案,例如要清空三天前的所有檔案:

adrci> purge –age 3

 

值得額外一提的是,如果是有安裝 RAC ,在 11g 的時候 crs log 還是存放在 $GRID_HOME/log 底下,到了 12c 以後 crs log 才改放到 ADR 目錄底下。




2020年8月31日 星期一

4.8 自動啟動與關閉資料庫

先前介紹過 Oracle 資料庫的啟動與關閉必須進入 sqlplus 執行 startup 或是 shutdown ,在作業系統開機時並不會自動執行這些命令,所以每次主機重新開機之後必須要再手動將資料庫開啟,那麼要如何在主機開機之後自動地將 Oracle 資料庫啟動 ? 如果是 Windows 平台,在資料庫建立好的同時會在 Windows 服務上建立一個 Oracle 服務,隨著主機的開機與關機,這些服務也會自動控制 Oracle 資料庫的啟動與關閉,但是如果是 Unix 平台,在沒有 CRS 服務(RAC或 Oracle Restart)的狀態下,就必須自己寫 script 來設定資料庫的啟動與關閉。


Oracle 資料庫在安裝完成的同時已經在 $ORACLE_HOME/bin 底下幫我們建立好 DB 啟動與關閉的腳本了,分別為 dbstart (開啟 DB) 與 dbshut (關閉 DB),我們只需要在開機與關機的同時呼叫這個腳本就可以協助我們開啟與關閉資料庫了。


dbstart 與 dbshut 會去檢查 /etc/oratab 的內容來決定要開啟與關閉那些資料庫,/etc/oratab 內容裡面有三個區塊分別用 “:” 分開

這三個區塊分別表示 <ORACLE_SID>:<ORACLE_HOME>:<是否開啟>

dbstart / dbshut 會去判斷最後一個區塊是否為 “Y” ,如果為 “Y”,那麼就從指定的 ORACLE_HOME 底下來啟動這個資料庫,如果為 “N” 就表示不啟動這個資料庫。


了解 dbstart 與 dbshut 之後就可以簡單利用它來建立兩個腳本,start_db.sh 與 stop_db.sh 如下:


start_db.sh

ORA_HOME=/opt/app/oracle/product/11.2.0.4/dbhome_1

ORA_OWNER=oracle

su - $ORA_OWNER -c "dbstart $ORA_HOME"


stop_db.sh

ORA_HOME=/opt/app/oracle/product/11.2.0.4/dbhome_1

ORA_OWNER=oracle

su - $ORA_OWNER -c "dbshut $ORA_HOME"


建立完畢後授予執行權限:

# chmod 755 /etc/init.d/start_db.sh

# chmod 755 /etc/init.d/stop_db.sh


接下來我們只需要把它放入啟動程序就可以了,以 Linux 為例,啟動一般為 3或5,關閉一般為0或6,所以把 start_db.sh 放入 rc3.d與rc5.d,stop_db.sh 放入 rc0.d 與 rc6.d:

# cd /etc/rc3.d

# ln -s /etc/init.d/start_db.sh K99STARTDB

# cd /etc/rc5.d

# ln -s /etc/init.d/start_db.sh K99STARTDB

# cd /etc/rc0.d

# ln –s /etc/init.d/stop_db.sh K10STOPDB

# cd /etc/rc6.d

# ln –s /etc/init.d/stop_db.sh K10STOPDB


另一個方式則可以把資料庫啟動與關閉的腳本放入 Linux 服務當中,這樣就不需要自行連結至 run level 了。


首先於 /etc/init.d 建立 dbora 腳本:

#!/bin/sh

# chkconfig: 35 99 10

# description: Oracle auto start-stop script.


ORA_HOME=/opt/app/oracle/product/11.2.0.4/dbhome_1

ORA_OWNER=oracle

case $1 in

'start')

        su - $ORA_OWNER -c "dbstart $ORA_HOME"

        ;;

'stop')

        su - $ORA_OWNER -c "dbshut $ORA_HOME"   

       ;;

esac


前面 chkconfig 是用來設定 run level ,35 表示此服務會在 run level 3與5的時候啟動,在其他 level 的時候關閉;99表示此服務會在最後的順位啟動;10表示此服務會在最前面的順位停止。


接下來將此腳本註冊於 Linux 服務當中就可以了:

# chmod 755 /etc/init.d/dbora

# /sbin/chkconfig --add dbora


如果是 Linux 7 以上的版本,則必須使用 systemctl 來建立服務。首先於 /lib/systemd/system 底下建立 dbora.service ,裡面的內容呼叫我們之前建立的 start_db.sh 與 stop_db.sh:


/lib/system/system/dbora.service

[Unit]

Description=DB Auto Start and Stop

After=syslog.target network.target


[Service]

LimitMEMLOCK=infinity

LimitNOFILE=65535

RemainAfterExit=yes

User=oracle

Group=oinstall

Restart=no

ExecStart=/bin/bash -c '/etc/init.d/start_db.sh'

ExecStop=/bin/bash -c '/etc/init.d/stop_db.sh'


[Install]

WantedBy=multi-user.target


建立好之後再將此服務啟用就可以了:

# systemctl daemon-reload

# systemctl enable dbora.service