debian

Debian lsnrctl如何自动化运维

小樊
32
2025-11-18 07:54:59
栏目: 智能运维

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

四 维护与风险控制

0
看了该问题的人还看了