Debian 上 lsnrctl 自动化运维实践
一 基础准备与环境变量
二 自动化方案总览
| 手段 | 主要用途 | 关键要点 |
|---|---|---|
| Shell 脚本封装 | 标准化启停、状态检查、日志落盘 | 统一入口、带时间戳日志、错误码返回 |
| systemd 服务 | 开机自启、故障自恢复、统一运维接口 | Type=forking、User=oracle、Restart=on-failure |
| Cron 定时任务 | 定时巡检、日报归档 | 重定向日志、避免并发、注意环境变量 |
| 监控与告警 | 异常即时通知 | 结合 monit/nagios 执行 lsnrctl status 并解析输出 |
| 配置与版本管理 | 变更可追溯、快速回滚 | Git 管理 listener.ora/tnsnames.ora 与脚本 |
| 远程批量 | 多实例统一运维 | SSH 批量执行脚本,配合密钥与 sudo 权限控制 |
三 落地示例
#!/usr/bin/env bash
# File: /usr/local/bin/manage_listener.sh
set -Eeuo pipefail
LISTENER="${1:-LISTENER}"
ORACLE_HOME="${ORACLE_HOME:-/opt/oracle/product/19c/dbhome_1}"
export ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
LOG_DIR="/var/log/oracle"
LOG_FILE="$LOG_DIR/listener_${LISTENER}_$(date +%F).log"
mkdir -p "$LOG_DIR"
log() { echo "$(date '+%F %T') [$LISTENER] $*" | tee -a "$LOG_FILE"; }
case "$1" in
start)
log "Starting listener..."
if lsnrctl start "$LISTENER"; then
log "Started."
exit 0
else
log "Start FAILED."
exit 2
fi
;;
stop)
log "Stopping listener..."
if lsnrctl stop "$LISTENER"; then
log "Stopped."
exit 0
else
log "Stop FAILED."
exit 3
fi
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
status)
log "Checking status..."
lsnrctl status "$LISTENER"
;;
*)
echo "Usage: $0 {start|stop|restart|status} [listener_name]"
exit 1
;;
esac
# /etc/systemd/system/oracle-listener.service
[Unit]
Description=Oracle Listener
After=network.target
[Service]
Type=forking
User=oracle
ExecStart=/usr/local/bin/manage_listener.sh start
ExecStop=/usr/local/bin/manage_listener.sh stop
ExecReload=/usr/local/bin/manage_listener.sh restart
Restart=on-failure
RestartSec=10
TimeoutSec=300
[Install]
WantedBy=multi-user.target
# 每天 02:00 巡检并记录
0 2 * * * /usr/local/bin/manage_listener.sh status >> /var/log/oracle/listener_status_daily.log 2>&1
# 每 5 分钟探测,异常时简单邮件告警(需本地 MTA 或 mailx)
*/5 * * * * /usr/local/bin/manage_listener.sh status >/tmp/lsn.out 2>&1 || \
echo "[$(date)] Listener $LISTENER DOWN" | mail -s "Listener DOWN on $(hostname)" ops@example.com
- name: Ensure listener is running
hosts: oracle_servers
become: yes
tasks:
- name: Start listener
command: /usr/local/bin/manage_listener.sh start
- name: Check listener
command: /usr/local/bin/manage_listener.sh status
register: out
- name: Show status
debug:
var: out.stdout_lines
四 维护与风险控制