Oracle数据库镜像恢复或更改ip后导致数据库无法使用

一、现象:
# 启动监听报错提示:

Listener Parameter File /db/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /db/oracle/diag/tnslsnr/VM-80-3-centos/dspm/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=10.1.1.3) (PORT=1532)))
he listener supports no services
he commandcompleted successfully 

二、背景
因业务需求,数据存放在oracle中,现需通过镜像恢复(或因迁移更改服务器ip),Oracle数据库无法连接,

# 出处博客园:# https://www.cnblogs.com/liucx/

三、解决方法
1、如果你安装oracle数据库时采用主机名解析的话,需要修改/etc/hosts文件(配置ip可忽略)

vim /etc/hosts
现在的ip 主机名 

2、采用ip地址的话,需要修改两个文件:listener.ora、tnsnames.ora,然后重启监听

find /db -name listener.ora 
find /db -name tnsnames.ora	# 查找这两个文件的地址,修改其IP地址

# cat /db/oracle/product/11.2.0/network/admin/listener.ora 
dspm =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.21.16.48)(PORT = 1532))
    )
  )
ADR_BASE_dspm = /db/oracle

# cat /db/oracle/product/11.2.0/network/admin/tnsnames.ora
dspm,dspm.world =
  (description =
    (address = (protocol = tcp)(host = 10.21.16.48)(port = 1532))
    (connect_data = (sid = dspm))
  )

3、启动监听

lsnrctl stop $ORACLE_SID
lsnrctl start $ORACLE_SID

4、启动数据库

sqlplus '/ as sysdba'
startup;

5、修改监听IP(因监听文件是动态注册,故需要修改)

# 查看数据库实例本地监视器IP地址+端口
show parameter local_listener;

# 修改 local_listener 参数,SCOPE=BOTH 选项意味着更改将同时更新内存中的系统全局区(SGA)和 spfile(如果使用的是 spfile),10.21.16.48为新IP。
ALTER SYSTEM SET local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.21.16.48)(PORT=1532)))' SCOPE=BOTH;

# 重新注册数据库到监听器,更改 local_listener 参数后,您可能需要手动触发数据库实例重新向监听器注册。
ALTER SYSTEM REGISTER;

# 验证更改
show parameter local_listener;
exit

6、检查监听器状态

lsnrctl status $ORACLE_SID

# 已启动正常

7、测试远程登录

# 连接
sqlplus user/password@10.21.16.48:1532/dspm

# 查询当前数据库状态和名称
select open_mode,name from v$database;

 查询正常!
 
PS:  动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP。因为pmon只会动态注册por等于1521的监听

否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数

Oracle 数据库中的监听器(Listener)是一个独立的进程,用于监听并接收来自客户端的连接请求。监听器的注册分为两种类型:动态注册和静态注册。这两种注册方式主要区别在于如何将数据库服务的信息传递给监听器。
### 动态注册(Dynamic Registration)
动态注册也被称为自动注册。在这种模式下,Oracle 数据库实例会在启动时自动向监听器注册其服务信息,包括服务名和实例名等。这种注册是通过 Oracle Net 的服务名解析过程实现的。
- **实现方式**:动态注册使用的是 Oracle Net 的 PMON(进程监视器)进程,该进程每隔一定时间就会自动向监听器发送更新的服务信息。
- **配置**:动态注册通常不需要在`listener.ora`中进行特殊配置,但需要确保监听器能够接收来自数据库的注册信息(一般通过默认的 `TCP` 端口 1521 或通过 `local_listener` 参数指定的地址)。

### 静态注册(Static Registration)
静态注册要求数据库管理员在监听器的配置文件 `listener.ora` 中明确指定数据库服务的详细信息。这包括服务名、数据库的 IP 地址、端口等信息。

- **实现方式**:通过在 `listener.ora` 文件中添加服务描述,来告诉监听器如何连接到特定的数据库服务。

# 配置示例
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = db_service_name)
      (ORACLE_HOME = /oracle/product/12.1.0/dbhome_1)
      (SID_NAME = sid_name)
    )
  )
E-mail:57349220@qq.com
出处:https://www.cnblogs.com/liucx/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.