在使用Oracle数据库时,有时候会遇到双实例启动失败的问题。这个问题一般是由于数据库实例之间的冲突造成的,而且常常是在实例名称相同、监听器端口重复等情况下出现。本文将从以下几个方面介绍如何解决双实例启动失败问题:
一、查看错误日志
当双实例启动失败时,应该首先检查错误日志,查看具体的错误信息。可以使用以下命令查看所有ASM和实例的日志:
$ tl -100f $ORACLE_BASE/diag/rdbms/*/*/trace/*.log
二、修改实例名称
如果双实例启动失败是由于实例名称相同造成的,那么需要修改一个实例的名称。Oracle的实例名称保存于SPFILE中,可以使用以下命令修改名称:
SQL> ALTER SYSTEM SET INSTANCE_NAME=’new_instance_name’ SCOPE=SPFILE;
然后重启数据库,双实例就可以成功启动了。
三、修改监听器端口
如果双实例启动失败是由于监听器端口重复造成的,需要修改其中一个实例的监听器端口。可以使用以下命令来修改监听器端口:
$ lsnrctl stop
$ vi $ORACLE_HOME/network/admin/listener.ora
$ lsnrctl start
在listener.ora文件中找到其中一个实例的监听器,并将其端口号修改为未被占用的端口。
四、修改ASM实例名称
如果问题不在于实例名称和监听器端口上,那么就需要检查ASM实例的名称是否和其中一个实例名称相同了。可以使用以下命令修改ASM实例的名称:
$ srvctl modify asm -asminstance “old_instancename” -newinstancename “new_instancename”
修改完成后,重新启动ASM实例和双实例即可。
五、增加实例隔离性
如果以上方法都无法解决问题,可以尝试增加实例隔离性。在Oracle RAC中,实例之间的通信是通过IPC(Inter-process Communication)来实现的。如果其中一个实例没有正常退出,会导致其他实例无法启动。可以使用以下命令来增加实例的隔离性:
SQL> ALTER SYSTEM SET CLUSTER_INTERCONNECTS='(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=MY_SHARED_MEMORY)))’ SCOPE=SPFILE;
SQL> ALTER SYSTEM SET CLUSTER_DATABASE_INSTANCES='(db1, db2)’ SCOPE=SPFILE;
设置完成后,重新启动实例即可。
六、绑定IP地址
如果以上方法都无法解决问题,可以尝试将每个实例绑定到其相应的IP地址上。可以使用以下命令来完成绑定:
$ $ORACLE_HOME/bin/srvctl modify database -d “db_name” -vip “vip_name”
修改完成后,重新启动数据库实例即可。
综上所述,当双实例启动失败时,需要仔细检查错误日志,并根据具体情况采取相应的措施解决问题。如果以上方法都无效,建议联系Oracle技术支持。
以下代码为修改监听器端口的示例:
假设当前两个实例的监听器端口都为1521,需要将其中一个实例的监听器端口修改为1522。
1. 停止监听器
$ lsnrctl stop
2. 编辑listener.ora文件
$ vi $ORACLE_HOME/network/admin/listener.ora
找到其中一个实例的监听器,将port修改为1522.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PLUG1)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM=extproc)
)
(SID_DESC=
(SID_NAME=ORCL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM=oracle)
(ENVS=”LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib:/lib:/usr/lib”)
)
(SID_DESC=
(SID_NAME=ORCL2)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM=oracle)
(ENVS=”LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib:/lib:/usr/lib”)
(PORT=1522)
)
)
保存关闭listener.ora文件。
3. 启动监听器
$ lsnrctl start
4. 查看监听器状态
$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 – Production on 01-NOV-2019 15:36:16
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 – Production
Start Date 01-NOV-2019 15:33:35
Uptime 0 days 0 hr. 2 min. 40 sec
Trace Level support
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8080))(Presentation=HTTP)(Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=localhost)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/ORCL/xdb_wallet))(Presentation=HTTP)(Session=RAW))
services Summary…
Service “CLRExtProc” has 1 instance(s).
Instance “CLRExtProc”, status UNKNOWN, has 2 handler(s) for this service…
Service “ORCL” has 1 instance(s).
Instance “ORCL”, status READY, has 1 handler(s) for this service…
Service “ORCLXDB” has 1 instance(s).
Instance “ORCL”, status READY, has 1 handler(s) for this service…
Service “PLUG1” has 1 instance(s).
Instance “PLUG1”, status UNKNOWN, has 1 handler(s) for this service…
The command completed successfully
可以看到,其中一个实例的监听器端口已经被修改为1522。