Oracle 數據庫連接檢測 Shell 腳本實戰:高併發壓測與穩定性驗證自動化方案
一、腳本設計目標
- 模擬高併發連接場景,暴露監聽器、進程限制、網絡抖動等隱性問題
- 自動化執行、日志歸檔、結果分類判定
- 支持 10g/11g/12c/19c 多版本適配
二、核心腳本完整版(增強健壯性)
#!/bin/bash
# Oracle 連接穩定性壓測腳本 v2.0
# 作者:DBA 團隊 | 更新:2024-01-15
# ===== 配置區 =====
ORACLE_USER="bodcmp"
ORACLE_PASS="bodcmp"
ORACLE_SID="ora10g"
LOG_BASE="/home/gapsv4/log/oracle"
CONCURRENT_SESSIONS=50 # 併發會話數
ITERATIONS_PER_SESSION=20 # 每會話迭代次數
CONNECT_TIMEOUT=10 # 連接超時(秒)
QUERY_TIMEOUT=5 # 查詢超時(秒)
# ===================
mkdir -p "${LOG_BASE}"
rm -f "${LOG_BASE}"/check_oracle_*.log
# 驗證 sqlplus 可用
if ! command -v sqlplus &>/dev/null; then
echo "ERROR: sqlplus not in PATH" >&2
exit 1
fi
# 並發工作函數
worker() {
local session_id=$1
local iter=0
while [ $iter -lt $ITERATIONS_PER_SESSION ]; do
local log_file="${LOG_BASE}/check_oracle_${session_id}_${iter}.log"
local start_ts=$(date +%s%3N)
# 使用 expect 或帶超時的 sqlplus
timeout ${CONNECT_TIMEOUT} sqlplus -s -l "${ORACLE_USER}/${ORACLE_PASS}@${ORACLE_SID}" <"${log_file}" 2>&1
SET HEADING OFF FEEDBACK OFF ECHO OFF PAGES 0
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SELECT SYSDATE FROM DUAL;
EXIT
EOF
local exit_code=$?
local end_ts=$(date +%s%3N)
local duration=$((end_ts - start_ts))
# 結果標記
if [ $exit_code -eq 0 ] && grep -qE '[0-9]{4}-[0-9]{2}-[0-9]{2}' "${log_file}"; then
echo "SUCCESS|${duration}ms" >> "${log_file}.result"
elif [ $exit_code -eq 124 ]; then
echo "TIMEOUT|${CONNECT_TIMEOUT}s" >> "${log_file}.result"
else
echo "FAILED|${exit_code}|$(tail -1 ${log_file})" >> "${log_file}.result"
fi
((iter++))
sleep 0.1 # 避免瞬間衝擊
done
}
# ===== 主程序 =====
echo "啟動 ${CONCURRENT_SESSIONS} 併發會話,每會話 ${ITERATIONS_PER_SESSION} 次迭代..."
pids=()
for ((i=0; i
三、關鍵增強點解析
| 增強項 | 原版缺陷 | 改進方案 |
| 超時控制 | 無連接/查詢超時,卡死風險 | timeout 命令強制中斷 |
| 靜默模式 | 輸出干擾日志解析 | sqlplus -s -l + SET HEADING OFF |
| 結果結構化 | 人工查看日志 | .result 文件機器可讀,支持自動化聚合 |
| 併發控制 | 無限制 fork 炸彈風險 | 固定併發數 + 迭代間隔 |
| 退出碼語義 | 無標準退出碼 | 0=正常 1=偶發 2=異常,對接監控系統 |
四、部署與監控集成
1. 定時任務部署
# 每 15 分鐘巡檢一次
*/15 * * * * /opt/scripts/check_oracle_conn.sh >> /var/log/oracle_conn_check.log 2>&1
2. Zabbix/普羅米修斯對接
# Zabbix 監控項鍵值
UserParameter=oracle.conn.health,/opt/scripts/check_oracle_conn.sh; echo $?
3. 告警閾值建議
- Critical:失敗率 > 1% 或 連續 3 次巡檢非 0 退出碼
- Warning:超時率 > 5% 或 平均連接耗時 > 500ms
- Info:成功率 100% 但平均耗時 > 200ms(潛在性能退化)
五、常見故障模式識別
| 現象 | 日志特徵 | 可能原因 | 排查方向 |
| 間歇性 ORA-12514 | TNS:listener does not currently know of service | 服務未註冊/監聽器重啟 | 檢查 PMON 註冊間隔、LOCAL_LISTENER 參數 |
| ORA-12516/12518/12519 | Listener could not find available handler | 進程/會話達到上限 | 調大 PROCESSES/SESSIONS、檢查連接泄漏 |
| ORA-03113/03114 | End-of-file on communication channel | 服務器進程異常終止 | 查閱 Alert Log、Trace 文件、OS 內存壓力 |
| 連接耗時飆升 | SUCCESS|2000ms+ | DNS 解析慢、防火牆握手、監聽器負載高 | 使用 IP 直連、tcptrace 分析、監聽器負載均衡 |
運維鐵律:連接檢測不僅是「通/不通」的二元判斷,連接建立耗時分布、錯誤碼分布、併發下的成功率曲線才是系統健康度的真實體溫計。建議將此腳本納入 CI/CD 部署驗證、變更前後基線對比、日常巡檢三大體系。