Instance準備
1. Parameter File 的準備
方法一:從通用範本複製修改(建議新手使用)
# 1. 設定環境變數
$ . oraenv
ORACLE_SID = [orclcdb] ? mynewdb
# 2. 複製通用範本
$ cp $ORACLE_HOME/dbs/init.ora $ORACLE_HOME/dbs/initmynewdb.ora
# 3. 編輯參數檔案
$ vi $ORACLE_HOME/dbs/initmynewdb.ora在 initmynewdb.ora 中,您需要設定這些基本參數:
# 基本必要參數
db_name=mynewdb
db_block_size=8192
control_files='/u01/app/oracle/oradata/MYNEWDB/control01.ctl','/u01/app/oracle/fast_recovery_area/MYNEWDB/control02.ctl'
db_create_file_dest='/u01/app/oracle/oradata'
db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
db_recovery_file_dest_size=12G
enable_pluggable_database=TRUE
remote_login_passwordfile='EXCLUSIVE'
undo_management=AUTO
undo_tablespace='UNDOTBS1'
方法二:從現有資料庫複製修改
# 複製現有的參數檔案
$ cp $ORACLE_HOME/dbs/initorclcdb.ora $ORACLE_HOME/dbs/initmynewdb.ora
# 編輯參數檔案,修改相關設定
$ vi $ORACLE_HOME/dbs/initmynewdb.ora2. Password File 的準備
使用 orapwd 工具建立:
# 建立 password file
$ orapwd file=$ORACLE_HOME/dbs/orapwmynewdb password=your_sys_password entries=10參數說明:
file: password file 的路徑和名稱(格式:orapw+ORACLE_SID)password: SYS 使用者的密碼entries: 可以存放的特權使用者數量(建議10)
3. Parameter File 搜尋順序
教材中提到Oracle會按照以下順序搜尋參數檔案:
$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora(二進位檔案)$ORACLE_HOME/dbs/spfile.ora(通用二進位檔案)$ORACLE_HOME/dbs/init$ORACLE_SID.ora(文字檔案)
4. PFILE 與 SPFILE 互轉
建立好資料庫後,您可以將文字檔案轉為二進位檔案:
-- 啟動到 nomount 狀態
SQL> startup nomount
-- 建立 spfile
SQL> create spfile from pfile;
-- 重新啟動使用 spfile
SQL> shutdown immediate
SQL> startup完整範例流程
# 1. 設定環境變數
$ export ORACLE_SID=mynewdb
# 2. 準備參數檔案
$ cp $ORACLE_HOME/dbs/init.ora $ORACLE_HOME/dbs/initmynewdb.ora
$ vi $ORACLE_HOME/dbs/initmynewdb.ora # 編輯必要參數
# 3. 建立 password file
$ orapwd file=$ORACLE_HOME/dbs/orapwmynewdb password=cloud_4U entries=10
# 4. 更新 /etc/oratab
$ echo "mynewdb:$ORACLE_HOME:N" >> /etc/oratab
# 5. 啟動 instance 並建立資料庫
$ sqlplus / as sysdba
SQL> startup nomount
SQL> CREATE DATABASE mynewdb ...注意事項:
- 修改參數檔案時,路徑要確實存在
- Password file 的命名格式必須是
orapw + ORACLE_SID - 建議先用 PFILE 建立資料庫,成功後再轉成 SPFILE
這樣就可以成功準備Instance所需的檔案了!
Instance 架構組成
Instance由三個主要結構組成:
- Memory Structures (記憶體結構):SGA (System Global Area) + PGA (Program Global Area)
- Process Structures (程序結構):Background processes
- Storage Structures (儲存結構):Physical files
記憶體管理模式
三種管理模式:
- Automatic Memory Management (AMM):
MEMORY_TARGET > 0 - Automatic Shared Memory Management (ASMM):
SGA_TARGET > 0 - Manual Memory Management:手動設定各記憶體元件
關鍵參數:
-- 檢視記憶體參數
SQL> SHOW PARAMETER MEMORY_TARGET;
SQL> SHOW PARAMETER SGA_TARGET;
SQL> SHOW PARAMETER PGA_AGGREGATE_TARGET;CDB/PDB Instance 管理
PDB狀態管理:
-- 檢視PDB狀態
SQL> SHOW PDBS;
-- 開啟所有PDB
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
-- 儲存PDB狀態
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;Alert Log (警告日誌)
Alert Log 基本概念
Alert Log是Oracle自動建立的重要診斷文件,記錄資料庫的關鍵事件和錯誤。
Alert Log內容包含:
- 非預設初始化參數
- 所有內部錯誤 (ORA-600)、區塊損毀錯誤 (ORA-1578)、死鎖錯誤 (ORA-60)
- 管理作業:CREATE、ALTER、DROP DATABASE、TABLESPACE等
- STARTUP、SHUTDOWN、ARCHIVE LOG、RECOVER等命令
- Shared Server和Dispatcher程序相關訊息
- 具體化視圖自動重新整理錯誤
Alert Log 位置與格式
-- 查詢Alert Log位置
SQL> SELECT name, value FROM v$diag_info;兩種格式:
- Text格式:
alert_<SID>.log(位於trace目錄) - XML格式:
log.xml(位於alert目錄)
預設位置:
$ORACLE_BASE/diag/rdbms/<db_name>/<SID>/trace/ -- Text版本
$ORACLE_BASE/diag/rdbms/<db_name>/<SID>/alert/ -- XML版本
Trace Files (追蹤文件)
Trace Files 基本概念
每個Server Process和Background Process都可以寫入相關的trace file,用於記錄錯誤資訊和效能調整指導。
Trace Files內容:
- 錯誤資訊(內部錯誤發生時,需聯絡Oracle Support)
- 應用程式或instance調整指導資訊
- 背景程序的trace file名稱包含程序名稱
關鍵特性:
- 當發生嚴重錯誤時,會分配incident number
- 診斷資料會立即被擷取並標記該編號
- 資料儲存在ADR中,可依incident number檢索分析
Automatic Diagnostic Repository (ADR)
ADR 架構
ADR是檔案式的統一診斷資料儲存庫,儲存在資料庫外部。
ADR目錄結構:
ADR Base (DIAGNOSTIC_DEST)
└── diag/
└── rdbms/
└── <db_name>/
└── <SID>/
├── alert/ -- XML Alert Log
├── trace/ -- Text Alert Log & Trace Files
├── incident/ -- Incident dumps
├── cdump/ -- Core dumps
├── hm/ -- Health Monitor reports
└── log/ -- DDL log files
ADR Base位置設定:
- 由
DIAGNOSTIC_DEST參數控制 - 若未設定,則:
- 若
ORACLE_BASE已設定:DIAGNOSTIC_DEST = $ORACLE_BASE - 若
ORACLE_BASE未設定:DIAGNOSTIC_DEST = $ORACLE_HOME/log
- 若
ADRCI (ADR Command Interpreter)
ADRCI是Oracle命令列工具,用於:
- 調查問題
- 檢視健康檢查報告
- 包裝並上傳first-failure資料給Oracle Support
- 檢視trace files名稱和alert log
常用ADRCI命令:
$ adrci
ADRCI> show homes -- 顯示ADR homes
ADRCI> set home <adr_home> -- 設定工作home
ADRCI> show alert -- 顯示alert log
ADRCI> show tracefile -- 顯示trace filesADR資料保留政策
兩種保留期間:
- 長期保留:incidents和alert log (預設365天)
- 短期保留:traces和core dumps (預設30天)
大小控制: 可設定ADR home的目標大小,自動刪除舊資料。
DDL Log File
DDL Log設定
-- 啟用DDL logging
SQL> ALTER SYSTEM SET enable_ddl_logging = TRUE;DDL Log特性:
- 需要Oracle Database Lifecycle Management Pack授權
- 每個DDL語句產生一筆記錄
- 有兩個相同內容的DDL logs:
- XML格式:
log.xml(在log/ddl子目錄) - Text格式:
ddl_<sid>.log(在log子目錄)
- XML格式:
DDL Log範例:
Thu Nov 15 08:35:47 2016
diag_adl:drop user app_user
Dynamic Performance Views (V$視圖)
V$視圖基本概念
V$視圖提供instance記憶體結構變化狀態的即時資訊。
重要特性:
- 由SYS使用者擁有
- 根據instance階段(NOMOUNT/MOUNT/OPEN)提供不同資訊
- 資料是動態的,沒有讀取一致性保證
- 通常稱為”v-dollar views”
常用V$視圖分類:
Instance/Database相關:
V$DATABASE -- 資料庫資訊
V$INSTANCE -- Instance狀態
V$PARAMETER -- 當前session參數
V$SPPARAMETER -- SPFILE內容
V$SYSTEM_PARAMETER -- Instance層級參數Memory相關:
V$SGAINFO -- SGA資訊
V$PGASTAT -- PGA統計
V$BUFFER_POOL_STATISTICS -- Buffer Pool統計
V$LIBRARYCACHE -- Library Cache統計Process相關:
V$PROCESS -- 所有程序
V$BGPROCESS -- 背景程序
V$SESSION -- 會話資訊Performance相關:
V$SYSTEM_EVENT -- 系統等待事件
V$SESSION_EVENT -- 會話等待事件
V$SYSSTAT -- 系統統計
V$SESSTAT -- 會話統計實務查詢範例
-- 查詢所有V$視圖
SQL> SELECT * FROM v$fixed_table WHERE name LIKE 'V$%';
-- 查詢當前會話參數
SQL> SELECT name, value FROM v$parameter WHERE name = 'sga_target';
-- 查詢等待事件
SQL> SELECT event, total_waits, time_waited
FROM v$system_event
WHERE wait_class != 'Idle';Oracle Data Dictionary (資料字典)
資料字典基本概念
Oracle資料字典是資料庫的metadata,包含所有資料庫物件的名稱和屬性。
資料字典特性:
- 由SYS使用者擁有
- Oracle Database server自動維護
- 當物件結構或定義被修改時自動更新
- 任何使用者都可查詢
- 絕對不可直接用SQL修改
資料字典視圖前綴
四種視圖前綴:
CDB_視圖:
- 顯示整個CDB中所有PDB的metadata
- 僅CDB環境可用
DBA_視圖:
- 顯示container或PDB中所有物件的metadata
- 需要DBA權限
ALL_視圖:
- 顯示當前使用者有權限看到的所有物件metadata
- 包含使用者擁有的和被授權存取的物件
USER_視圖:
- 顯示當前使用者擁有的物件metadata
- 任何使用者都可存取
權限需求
-- CDB_和DBA_視圖需要以下權限之一:
-- 1. SYSDBA權限
-- 2. SELECT ANY DICTIONARY權限
-- 3. SELECT_CATALOG_ROLE角色
-- 4. 直接授權實務查詢範例
-- 查詢資料字典結構
SQL> SELECT * FROM dictionary; -- 或 DICT
SQL> SELECT * FROM dict_columns; -- 查看視圖欄位
-- 查詢使用者表格
SQL> SELECT table_name FROM user_tables;
SQL> SELECT table_name FROM all_tables WHERE owner = 'HR';
SQL> SELECT table_name FROM dba_tables WHERE owner = 'HR';
-- CDB環境查詢
SQL> SELECT con_id, table_name FROM cdb_tables WHERE owner = 'HR';CONTAINER_DATA屬性
在CDB環境中,當使用者連線到root container查詢CDB_*視圖時:
-- 設定CONTAINER_DATA屬性
SQL> ALTER USER username SET CONTAINER_DATA = (con1, con2, ...) FOR container_data_object;