| 階段 | 操作項目 | 關鍵檔案/指令 |
| 互動輸入 | 主機名、ORACLE_BASE、ORACLE_HOME、ORACLE_SID、安裝用戶 | read 內建指令 |
| 網路身分 | 修改 /etc/sysconfig/network、/etc/hosts 綁定 IP/主機名 | sed, echo |
| 用戶/群組 | 建立 oinstall、dba 群組;oracle 用戶、家目錄、擁有權 | groupadd, useradd, chown |
| 核心參數 | shmall/shmmax/shmmni/sem/port_range/rmem/wmem | cat >> /etc/sysctl.conf + sysctl -p |
| 資源限制 | nproc/nofile soft/hard limit | cat >> /etc/security/limits.conf |
| PAM 設定 | 啟用 pam_limits.so | cat >> /etc/pam.d/login |
| 環境變數 | /etc/profile、$ORACLE_HOME/.bash_profile | cat >> ... |
二、 完整腳本內容 (install_oracle_prereq.sh)
#!/bin/bash
# Oracle 11g/12c/19c Linux 先決條件自動化配置
# 用法: chmod +x install_oracle_prereq.sh && ./install_oracle_prereq.sh
set -euo pipefail
# ---------- 1. 互動輸入(含預設值) ----------
read -p "Please enter HOSTNAME [oracle]: " HOSTNAME
HOSTNAME=${HOSTNAME:-oracle}
read -p "Please enter ORACLE_BASE [/u01/app/oracle]: " ORACLE_BASE
ORACLE_BASE=${ORACLE_BASE:-/u01/app/oracle}
read -p "Please enter ORACLE_HOME name [product/19.0.0/dbhome_1]: " OH_NAME
OH_NAME=${OH_NAME:-product/19.0.0/dbhome_1}
ORACLE_HOME="${ORACLE_BASE}/${OH_NAME}"
read -p "Please enter ORACLE_SID [ORCL]: " ORACLE_SID
ORACLE_SID=${ORACLE_SID:-ORCL}
ORACLE_USER=oracle
SYSCTL_CONF=/etc/sysctl.conf
LIMITS_CONF=/etc/security/limits.conf
PAM_LOGIN=/etc/pam.d/login
PROFILE=/etc/profile
BASH_PROFILE="${ORACLE_HOME}/.bash_profile"
IPADDR=$(ip -o -4 addr show dev eth0 | awk '{print $4}' | cut -d/ -f1)
HOSTS_FILE=/etc/hosts
NETWORK_CONF=/etc/sysconfig/network
# ---------- 2. 主機名與 /etc/hosts ----------
echo "=== 設定主機名 ==="
grep -v "^HOSTNAME=" "${NETWORK_CONF}" > "${NETWORK_CONF}.tmp" && mv "${NETWORK_CONF}.tmp" "${NETWORK_CONF}"
echo "HOSTNAME=${HOSTNAME}" >> "${NETWORK_CONF}"
echo "${IPADDR} ${HOSTNAME}" >> "${HOSTS_FILE}"
hostnamectl set-hostname "${HOSTNAME}" 2>/dev/null || hostname "${HOSTNAME}"
# ---------- 3. 用戶與目錄 ----------
echo "=== 建立用戶/群組/目錄 ==="
mkdir -p "${ORACLE_BASE}"
groupadd -f oinstall
groupadd -f dba
id -u "${ORACLE_USER}" &>/dev/null || useradd -g oinstall -G dba -d "${ORACLE_HOME}" -m -s /bin/bash "${ORACLE_USER}"
chown -R "${ORACLE_USER}:oinstall" "${ORACLE_BASE}"
# ---------- 4. 核心參數 ----------
echo "=== 寫入核心參數 ==="
cat >> "${SYSCTL_CONF}" <<'EOF'
# Oracle Kernel Parameters
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF
/sbin/sysctl -p
# ---------- 5. 資源限制 ----------
echo "=== 設定 limits.conf ==="
cat >> "${LIMITS_CONF}" <> "${PAM_LOGIN}"
# ---------- 7. 環境變數 ----------
echo "=== 寫入環境變數 ==="
cat >> "${PROFILE}" < "${BASH_PROFILE}" <
三、 關鍵參數說明與調整建議
| 參數 | 推薦值 | 調整依據 |
| kernel.shmmax | 物理記憶體 50%~80% (bytes) | 單一共享記憶體段最大值,需 > SGA_TARGET |
| kernel.shmall | shmmax / PAGE_SIZE (通常 4096) | 系統總共享記憶體頁數上限 |
| kernel.sem | 250 32000 100 128 | semmsl semmns semopm semmni,支援高併發進程 |
| fs.file-max | 6815744 以上 | 系統級檔案描述符上限 |
| net.ipv4.ip_local_port_range | 9000 65500 | 避開保留埠,擴大可用暫時埠池 |
| net.core.rmem_max/wmem_max | 4MB / 1MB | Socket 緩衝區上限,提升高延遲網路傳輸 |
四、 執行後驗證清單
# 1. 核心參數生效
sysctl -a | grep -E 'shm|sem|file-max|ip_local_port_range|rmem|wmem'
# 2. 用戶限制
su - oracle -c "ulimit -a"
# 3. 環境變數
su - oracle -c "env | grep -E 'ORACLE|PATH|LD_LIBRARY|NLS'"
# 4. 目錄權限
ls -ld ${ORACLE_BASE} ${ORACLE_HOME}
# 5. 主機名解析
ping -c 2 ${HOSTNAME}
getent hosts ${HOSTNAME}
五、 進階:整合至 Ansible/RPM/雲初始化
- 將腳本模組化為 Ansible Role,變數化參數,支援多節點 RAC 部署
- 打包為 RPM 套件,
Requires: oracleasm-support, libaio, compat-libstdc++
- 雲環境 (OCI/AWS/Azure) 使用
cloud-init user-data 注入,實現實例啟動即就緒
自動化先決條件配置是穩定、可重現 Oracle 部署的基石,建議納入基礎設施即代碼 (IaC) 體系統一管理。
- 上一篇文章: Oracle 記憶體架構深度解析:SGA 七大元件、參數控制與調校策略
- 下一篇文章: Oracle 體系架構基石:資料庫、表空間與資料檔案邏輯物理映射關係
Copyright ©
程式碼之家 All Rights Reserved