数据库服务器重启后app服务器无法连接oracle实例
数据库服务器到期关机后,重新启动服务器,然后执行启动oracle的步骤:
shell
[root@iZ8vbgkra5t3d356no16srZ ~]# su - oracle
Last login: Fri Nov 17 13:24:14 CST 2023 on pts/3
[oracle@iZ8vbgkra5t3d356no16srZ ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Wed Oct 23 08:43:09 2024
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 3156725760 bytes
Fixed Size 2217504 bytes
Variable Size 2382367200 bytes
Database Buffers 754974720 bytes
Redo Buffers 17166336 bytes
Database mounted.
Database opened.
SQL> quit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@iZ8vbgkra5t3d356no16srZ ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 23-OCT-2024 08:44:42
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
[oracle@iZ8vbgkra5t3d356no16srZ ~]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 23-OCT-2024 08:44:49
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Starting /home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Log messages written to /home/oracle/app/oracle/diag/tnslsnr/iZ8vbgkra5t3d356no16srZ/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 23-OCT-2024 08:44:51
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /home/oracle/app/oracle/diag/tnslsnr/iZ8vbgkra5t3d356no16srZ/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
The listener supports no services
The command completed successfully
注意倒数第二行的The listener supports no services,这表明监听器当前没有注册任何服务。这意味着尽管监听器在运行,但它不知道任何要监听的数据库实例。这就是为什么app服务器不能连接到数据库的原因。
检查监听配置文件:
/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
原文件内容为:
shell
# listener.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /home/oracle/app/oracle
-
监听器名称:LISTENER
-
监听器描述包括两个地址:
-
一个使用IPC协议,键值为EXTPROC1521。
-
另一个使用TCP协议,主机名为localhost,端口为1521。
-
-
ADR(自动诊断存储库)的基础路径设置为
/home/oracle/app/oracle
。
配置文件看起来是正确的,因为它配置了监听器来监听本地主机的1521端口。然而,你之前提到监听器没有注册任何服务,这可能是连接问题的原因。
https://blog.csdn.net/songdancer/article/details/107297246
按照CSDN上的例子修改为:
shell
# listener.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
#LISTENER =
# (DESCRIPTION_LIST =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
# (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
# )
# )
#ADR_BASE_LISTENER = /home/oracle/app/oracle
#
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.26.5.7)(PORT = 1521))
)
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
同时修改/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
原文件内容:
shell
# tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
改为:
shell
# tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.26.5.7)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
重启监听后,oracle实例连接恢复正常:
shell
[oracle@iZ8vbgkra5t3d356no16srZ admin]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 23-OCT-2024 10:47:30
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.26.5.7)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
[oracle@iZ8vbgkra5t3d356no16srZ admin]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 23-OCT-2024 10:47:33
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Starting /home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Log messages written to /home/oracle/app/oracle/diag/tnslsnr/iZ8vbgkra5t3d356no16srZ/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.26.5.7)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.26.5.7)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 23-OCT-2024 10:47:33
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /home/oracle/app/oracle/diag/tnslsnr/iZ8vbgkra5t3d356no16srZ/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.26.5.7)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
:::
总结:这个问题是连接IP地址导致的,监听器默认使用主机名连接,但是ECS云服务器主机名不是localhost,应配成内网ip地址。
:::
附查询命令:
1.查询Oracle数据库实例是否启动:
sql
SQL> SELECT status FROM v$instance;
2.查询oracle当前实例名:
sql
SQL> SELECT instance_name FROM v$instance;
3.使用SQL*Plus通过监听连接数据库实例:
shell
$ sqlplus system/oracle@localhost:1521/ORCL
替换system/oracle
为你的用户名和密码,ORCL
为你的数据库实例名称。
4.ORACLE_HOME是什么路径,是存放数据库文件的路径吗
ORACLE_HOME
环境变量在Oracle数据库中指的是Oracle软件安装的主目录。它通常包含了Oracle数据库服务器、客户端工具和网络配置文件等。
ORACLE_HOME
并不直接存放数据库文件。数据库文件通常存放在一个单独的目录中,这个目录被称为数据库的ORACLE_BASE
或特定的数据文件目录。以下是这些目录的简要说明:
-
ORACLE_HOME: 包含Oracle软件的二进制文件、库文件、配置文件和启动/关闭数据库的脚本等。例如,
/home/oracle/app/oracle/product/11.2.0/dbhome_1
可能是一个ORACLE_HOME
的路径。 -
ORACLE_BASE: 是Oracle安装所有产品的基础目录。在大多数情况下,
ORACLE_HOME
是ORACLE_BASE
的子目录。例如,/home/oracle/app/oracle
可能是一个ORACLE_BASE
的路径。 -
数据库文件: 数据库文件,如数据文件(.dbf)、控制文件(.ctl)、日志文件(.log)等,通常存放在
ORACLE_BASE
下的特定目录,例如/home/oracle/app/oracle/oradata/
。
5.GLOBAL_DBNAME、sid区分大小写吗
在Oracle数据库中,GLOBAL_DBNAME
和SID
(系统标识符)的区分大小写性取决于操作系统的类型。
-
在Windows系统上,
SID
和GLOBAL_DBNAME
是不区分大小写的。这意味着ORCL
、orcl
和OrCl
被视为相同的SID。 -
在Unix、Linux或macOS系统上,
SID
和GLOBAL_DBNAME
是区分大小写的。在这些操作系统上,ORCL
、orcl
和OrCl
将被视为不同的SID。
因此,如果你在配置Oracle数据库或设置环境变量时,应该根据你的操作系统来决定是否需要保持大小写的一致性。例如,如果你在Linux上设置ORACLE_SID
环境变量,那么在所有相关的配置文件中,包括监听器配置文件(listener.ora
)和初始化参数文件(spfile
或pfile
),都必须使用相同的大小写。
6.实例名和服务名有何区别
在Oracle数据库中,实例名(Instance Name)和服务名(Service Name)是两个相关但又不同的概念。以下是它们的区别:
实例名(Instance Name)
-
定义:实例名是用于标识特定Oracle数据库实例的名称。一个数据库实例是由SGA(系统全局区域)和后台进程组成的内存结构,用于管理数据库的物理和逻辑结构。
-
唯一性:在给定的服务器上,实例名必须是唯一的。
-
用途:实例名主要用于数据库的内部管理和操作,例如启动和关闭数据库实例。
-
配置:实例名通常在初始化参数文件(
pfile
或spfile
)中指定,也可以通过环境变量ORACLE_SID
来设置。 -
操作系统相关性:在Unix、Linux或macOS系统上,实例名是区分大小写的。
服务名(Service Name)
-
定义:服务名是用于标识数据库服务的名称,它允许客户端应用程序连接到数据库实例。服务名通常与数据库的数据库全局名称(DB_NAME)和一个可选的数据库实例名称(INSTANCE_NAME)相关联。
-
唯一性:服务名在Oracle网络中可以是唯一的,也可以不是唯一的,因为多个实例可以提供同一个服务名。
-
用途:服务名用于客户端连接,允许客户端连接到特定的数据库服务,而不必关心数据库实例的具体位置。
-
配置:服务名在监听器配置文件(
listener.ora
)和数据库的tnsnames.ora
文件中指定。 -
灵活性:服务名可以映射到多个实例,提供负载平衡和高可用性。例如,使用Oracle RAC(Real Application Clusters)时,多个实例可以共享同一个服务名。
总结
-
实例名是数据库实例的标识,主要用于数据库的内部管理和操作。
-
服务名是客户端连接到数据库时使用的标识,它提供了对数据库实例的抽象,允许客户端不必知道数据库实例的具体位置和配置。
shell
#ORCL是实例名
#表示使用TCP协议,连接IP地址为127.0.0.1,端口号为1521的数据库主机上服务名为orcl的数据库
#如果有多个监听,可以手动添加
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl) #orcl是服务名,java程序通过服务名连接oracle监听器,访问数据库实例
)
)