oracle listener

本文介绍了 Oracle 数据库中 Listener 的两种注册方式:静态注册和动态注册,并详细解释了它们的区别及配置方法。
oracle listener注册方式两种:动态注册和静态注册。
1、静态注册:即实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和对外服务。 
 如在listener.ora文件中:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
       (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
      (PROGRAM = extproc)
    )
   (SID_DESC =
      (GLOBAL_DBNAME = paynepm)  #paynepm为对外服务
      (ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
      (SID_NAME = payne)   #payne为实例名
    )
   (SID_DESC =
      (GLOBAL_DBNAME = paynefu) #paynefu为对外服务
      (ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
      (SID_NAME = payne) #payne为实例名
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

在客户端的tnsnames.ora文件中就可以添加:
 py =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = paynepm)
    )
  )

py =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = paynefu)
    )
  ) 
 在客户端测试
 SQL> conn ff/ff@py
已连接。
2、动态注册:instance启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中。采取动态注册方法时,listener.ora中的内容如下: 
默认动态注册:

 LSNR1 =

    (DESCRIPTION_LIST =

       (DESCRIPTION =

          (ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT= 1521))

    )

     )

 动态注册默认只注册到默认的监听器上(端口是1521、协议是TCP)因为pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数!动态默认注册与非默认注册都是通过local_listener参数来判断的,如果值为空,则是默认注册,若为非空,则是非默认注册。如下:
动态非默认注册(即端口非1521):
Listener.ora中添加:
LSNR2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))
  )
再配置local_listener参数:
alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))';

C:\Documents and Settings\Administrator>lsnrctl status lsnr2

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -2013 09:
5:35

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=paynefu)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名                      lsnr2
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Prod
ction
启动日期                  31-5月 -2013 09:03:57
正常运行时间              0 天 0 小时 1 分 42 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:\oracle\product\10.2.0\db_1\network\admin\listener.
ra
监听程序日志文件          D:\oracle\product\10.2.0\db_1\network\log\lsnr2.log
监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=paynefu)(PORT=1522)))
服务摘要..
服务 "fb" 包含 1 个例程。                 ——————该服务名就是数据库中的service_names.db_domain,如下:
SQL> show parameter db_domain

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string
SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      fb    (这个service_names可以为多个,就如静态注册中的global_dbname,对外提供服务)

  例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...    ——————实例名
服务 "fbXDB" 包含 1 个例程。
  例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "fb_XPT" 包含 1 个例程。
  例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功


建议:一个对外的服务名对应一个客户端,这样有利于网络资源监控、问题的判断

3、如何区分是动态注册还是静态注册?
lsnrctl status一下:
 
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                03-MAY-2013 15:33:22
Uptime                    0 days 0 hr. 16 min. 14 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /db/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /db/oracle/diag/tnslsnr/for11g/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.169.0.200)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "paynefu" has 1 instance(s).
  Instance "payne", status UNKNOWN, has 1 handler(s) for this service...
Service "paynepm" has 1 instance(s).
  Instance "payne", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

看到上面的UNKNOWN没? 表示静态注册的设置这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
 
动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退和负载平衡。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27135177/viewspace-765105/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27135177/viewspace-765105/

<think>首先,用户的问题是:“我想查找让Oracle Listener服务开机启动的方法 请问如何设置Oracle Listener服务开机启动”。这涉及到Oracle数据库的配置。 从系统指令中,我需要使用中文回答,结构清晰,逐步解决问题。回答必须真实可靠。同时,我需要生成相关问题。 用户提到了站内引用,但这些引用似乎不完全相关。引用[1]是关于启动脚本的片段,包括echo语句和Listener启动。引用[2]是关于Oracle开机启动的脚本,包括su命令和数据库启动。但这些不是用户真正需求的完美匹配,用户只关心Oracle Listener服务的开机启动。 用户提到了“参考用户上一次的问题和你的回答”,但在这个对话中,这是我的第一个响应,所以没有“上一次的问题”。因此,我应该专注于当前问题。 关键点:设置Oracle Listener服务开机启动。在Linux系统中,这通常涉及到创建启动脚本或配置系统服务文件(如systemd)。 步骤分解: 1. **理解需求**:用户想让Oracle Listener在系统启动时自动启动。 2. **方法**: - 在Linux中,使用systemd(现代系统)或init.d(旧系统)来管理服务。 - 常见方法是创建一个服务文件或修改现有脚本。 3. **具体步骤**: - 对于systemd系统(如CentOS 7+、Ubuntu 16.04+): - 创建一个.service文件,例如/etc/systemd/system/oracle-listener.service。 - 内容应包括启动Listener的命令。 - 对于init.d系统: - 创建一个脚本在/etc/init.d/目录下。 - 使用chkconfig或update-rc.d来启用开机启动。 4. **参考用户提供的引用**: - 引用[2]有一个脚本:`su - oracle <<EON ... lsnrctl start ...`。这可以改编为启动脚本的核心部分。 - 但用户只关心Listener,不关心整个数据库启动。所以脚本应该只启动Listener。 5. **安全性和最佳实践**: - 确保脚本以oracle用户运行。 - 测试脚本手动启动Listener是否正常。 - 启用服务。 6. **回答结构**: - 清晰、逐步: - 步骤1:创建启动脚本。 - 步骤2:配置为开机启动(取决于系统)。 - 步骤3:测试。 7. **生成相关问题**: - 在末尾添加相关问题,如: - 如何检查Oracle Listener状态? - 如何手动启动/停止Listener? - 常见开机启动问题排查? 8. **格式要求**: - 所有行内数学用$...$(但这里可能不涉及数学)。 - 独立公式用$$...$$(不适用)。 - LaTeX语法正确(可能不需要)。 - 中文回答。 - 引用的段落末尾加引用标识。用户提供了引用,但我需要引用它们。引用[1]和[2]是用户给的,我应该基于它们回答。 - 引用[2]更相关,因为它直接提到开机启动脚本。 - 我可以引用它来构建回答。 9. **真实可靠**: - 基于Oracle文档或常见实践。 - 推荐标准方法。 完整回答结构: - 引言:解释方法。 - 步骤: 1. 创建启动脚本(基于引用[2]改编)。 2. 设置开机启动。 - 测试步骤。 - 相关问题。 最终,添加引用标识:[^1] 和 [^2] 在相关部分末尾。 </think>### 如何设置 Oracle Listener 服务开机启动 在 Linux 系统中,设置 Oracle Listener 服务开机启动通常涉及创建或修改启动脚本,并将其添加到系统服务管理中(例如通过 `systemd` 或 `init.d`,具体取决于您的 Linux 发行版)。以下是详细的逐步方法,基于您的引用[^2]提供的脚本(该脚本已包含启动 Listener 的部分),但需针对 Listener 服务精简和适配。确保您有管理员权限(`root` 用户)执行以下操作。 #### 步骤 1: 创建专用的 Listener 启动脚本 首先,创建一个脚本文件,用于启动 Oracle Listener。参考引用[^2]中的命令,我们提取并精简,专注于 Listener 启动(不涉及数据库实例)。脚本应以 `oracle` 用户身份运行。 1. 使用文本编辑器创建脚本文件(例如 `/etc/init.d/oracle-listener`): ```bash sudo nano /etc/init.d/oracle-listener ``` 2. 将以下内容粘贴到文件中。脚本使用 `lsnrctl start` 启动 Listener,并设置环境变量(如 `ORACLE_HOME` 和 `ORACLE_SID`)。请根据您的实际路径修改 `ORACLE_HOME` 和 `ORACLE_SID`: ```bash #!/bin/sh # Oracle Listener startup script # chkconfig: 345 90 10 # description: Auto-starts Oracle Listener ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 # 修改为您的Oracle安装路径 ORACLE_SID=ORCLCDB # 修改为您的数据库SID PATH=$PATH:$ORACLE_HOME/bin export ORACLE_HOME ORACLE_SID PATH case "$1" in start) echo "Starting Oracle Listener..." su - oracle -c "$ORACLE_HOME/bin/lsnrctl start" # 以oracle用户启动Listener ;; stop) echo "Stopping Oracle Listener..." su - oracle -c "$ORACLE_HOME/bin/lsnrctl stop" # 以oracle用户停止Listener ;; restart) echo "Restarting Oracle Listener..." su - oracle -c "$ORACLE_HOME/bin/lsnrctl stop" su - oracle -c "$ORACLE_HOME/bin/lsnrctl start" ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0 ``` - **关键解释**:该脚本定义了 `start`、`stop` 和 `restart` 操作,使用 `su - oracle -c` 确保以 `oracle` 用户执行命令(避免权限问题)。注意替换 `ORACLE_HOME` 和 `ORACLE_SID` 为您的实际值(参考您的引用[^2]中的环境变量设置)[^2]。 - 保存文件后,设置可执行权限: ```bash sudo chmod +x /etc/init.d/oracle-listener ``` #### 步骤 2: 配置开机启动服务 根据您的 Linux 系统类型(`systemd` 或 `SysVinit`),选择合适的方法启用开机启动。 - **对于使用 `systemd` 的系统(如 CentOS 7+, Ubuntu 16.04+)**: 1. 创建一个 systemd 服务文件: ```bash sudo nano /etc/systemd/system/oracle-listener.service ``` 2. 添加以下内容: ```ini [Unit] Description=Oracle Listener Service After=network.target [Service] Type=forking ExecStart=/etc/init.d/oracle-listener start ExecStop=/etc/init.d/oracle-listener stop User=oracle Group=oinstall [Install] WantedBy=multi-user.target ``` - **关键解释**:`ExecStart` 和 `ExecStop` 指向步骤 1 创建的脚本,确保开机时自动启动。 3. 重新加载 systemd 并启用服务: ```bash sudo systemctl daemon-reload sudo systemctl enable oracle-listener.service # 启用开机启动 sudo systemctl start oracle-listener # 立即启动服务测试 ``` - **对于使用 `init.d` 的系统(如 CentOS 6, Ubuntu 14.04)**: 1. 使用 `chkconfig` 或 `update-rc.d` 添加服务: ```bash sudo chkconfig --add oracle-listener # CentOS 风格 sudo chkconfig oracle-listener on # 启用开机启动 ``` 或 ```bash sudo update-rc.d oracle-listener defaults # Ubuntu/Debian 风格 ``` 2. 手动启动服务测试: ```bash sudo service oracle-listener start ``` #### 步骤 3: 测试和验证 - 重启系统,检查 Listener 是否自动启动: ```bash sudo reboot ``` - 验证 Listener 状态: ```bash su - oracle lsnrctl status # 检查Listener是否运行 ``` 如果状态显示 "STATUS" 为 "READY",表示开机启动成功。如果失败,检查日志:`$ORACLE_HOME/listener/log/*.log`。 #### 注意事项 - **环境变量**:确保 `ORACLE_HOME` 和 `ORACLE_SID` 在脚本中正确设置(引用[^2]强调了导出环境变量的重要性)[^2]。 - **权限问题**:脚本必须由 `root` 添加,但执行命令以 `oracle` 用户运行,避免安全风险。 - **兼容性**:如果您的系统有 SELinux 或防火墙,确保端口 1521 开放。 - 参考您的引用[^1],`echo "Starting Oracle Listeners ... "` 可用于脚本输出调试信息[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值