Ubuntu 上 Oracle 监听器 lsnrctl 的备份与恢复策略
一 核心原则与范围
二 备份策略与实施步骤
sudo su - oracleecho $ORACLE_HOMEcp $ORACLE_HOME/network/admin/listener.ora /path/to/backup/listener.ora_$(date +%F_%H-%M-%S)cp $ORACLE_HOME/network/admin/tnsnames.ora /path/to/backup/tnsnames.ora_$(date +%F_%H-%M-%S)rsync -a --delete $ORACLE_HOME/network/admin/ /path/to/backup/network_admin_$(date +%F_%H-%M-%S)/lsnrctl status > /path/to/backup/listener_status_$(date +%F_%H-%M-%S).txttar czf /path/to/backup/listener_logs_$(date +%F_%H-%M-%S).tgz $ORACLE_HOME/diag/tnslsnr/$(hostname)/listener/三 恢复策略与实施步骤
cp $ORACLE_HOME/network/admin/listener.ora $ORACLE_HOME/network/admin/listener.ora.bak_$(date +%F_%H-%M-%S)cp /path/to/backup/listener.ora $ORACLE_HOME/network/admin/rsync -a /path/to/backup/network_admin_YYYY-MM-DD_HH-MM-SS/ $ORACLE_HOME/network/admin/lsnrctl stop → lsnrctl startlsnrctl reloadlsnrctl status,并抽查关键服务是否已注册与监听端口可达。mv $ORACLE_HOME/network/admin/listener.ora $ORACLE_HOME/network/admin/listener.ora.oldlsnrctl start$ORACLE_HOME/network/admin/listener.ora,填入:LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(PROGRAM = extproc)
)
)
lsnrctl start → lsnrctl status四 变更管理与验证清单
cp listener.ora.bak listener.ora + lsnrctl reload/restart)。lsnrctl status(检查监听端口、服务/SID 注册情况)telnet <host> 1521 或 nc -vz <host> 1521tnsping <tns_alias>(依赖 tnsnames.ora 正确)五 自动化脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
: "${ORACLE_HOME:?请先设置 ORACLE_HOME 环境变量}"
BACKUP_BASE="/opt/backup/oracle_listener"
TS=$(date +%F_%H-%M-%S)
ADMIN_DIR="$ORACLE_HOME/network/admin"
mkdir -p "$BACKUP_BASE"
# 1) 配置文件与目录
cp -a "$ADMIN_DIR/listener.ora" "$BACKUP_BASE/listener.ora_$TS"
cp -a "$ADMIN_DIR/tnsnames.ora" "$BACKUP_BASE/tnsnames.ora_$TS"
rsync -a --delete "$ADMIN_DIR/" "$BACKUP_BASE/network_admin_$TS/"
# 2) 运行状态快照
lsnrctl status > "$BACKUP_BASE/listener_status_$TS.txt"
# 3) 日志归档(可选)
find "$ORACLE_HOME/diag/tnslsnr" -type f -name "*.log" -o -name "*.xml" | \
xargs tar czf "$BACKUP_BASE/listener_logs_$TS.tgz" -C "$ORACLE_HOME/diag/tnslsnr" --transform 's,^tnslsnr/,,'
echo "备份完成 -> $BACKUP_BASE (时间戳: $TS)"
0 2 * * * /opt/scripts/backup_listener.sh
find /opt/backup/oracle_listener -type f -mtime +14 -delete
# 1) 回滚 listener.ora
cp /opt/backup/oracle_listener/listener.ora_YYYY-MM-DD_HH-MM-SS $ORACLE_HOME/network/admin/listener.ora
lsnrctl reload
# 2) 或整目录回滚
rsync -a --delete /opt/backup/oracle_listener/network_admin_YYYY-MM-DD_HH-MM-SS/ $ORACLE_HOME/network/admin/
lsnrctl restart