两个SID /服务名称可以在数据库服务器上使用相同的端口号吗?
我对数据库管理知之甚少,您能否让我知道我的问题的答案?
答案 0 :(得分:2)
有一种思想流派that you should only have a single database instance on a server,用于优化资源使用,但可能在其中运行许多模式和应用程序。
实例具有单个SID,但可以具有多个服务名称。因此,对于单个数据库,您可以拥有一个SID和多个服务名称;对于多个数据库,您将拥有多个SID 和服务名称。我假设您正在运行或计划运行多个实例共同托管在一个盒子上,我将把它作为一个单独的讨论保留。
如果您谈论的是普通连接,而不是Apex等,则数据库不会直接使用端口号。侦听器绑定到端口并侦听连接,并使用底层协议将这些连接交给数据库。这是在高级in the concepts guide解释的。
您可以拥有多个侦听器,每个侦听器都在自己的端口上;您可能希望为每个数据库设置专用侦听器,或者在某些情况下为单个数据库中的单个应用程序或模式设置专用侦听器。但通常你会有一个监听器,可能在默认端口1521上。
有许多方法可以配置一个监听器,但在一个简单的场景中,你的listener.ora
只有关于监听器本身的信息 - 它的地址和端口,记录细节等等 - 而且没有关于哪个数据库,SID或它支持的服务名称。当听众开始时,lsnrctl services
将显示很少。
数据库将在启动时向侦听器注册自己,如果无法找到其侦听器,则会定期重试。您可以通过发出alter system register
命令来鼓励这一点。数据库注册后,lsnrctl services
将显示其SID和服务名称。如果你有两个数据库,那么他们都会愉快地注册同一个监听器,lsnrctl services
将同时显示这两个数据库。
当建立连接时,SID或服务名称被指定为其中的一部分,例如, @//hostname:port/service_name
。监听器使用它来决定将连接移交给哪个实例。如果尚未使用提供的SID或服务名称注册数据库,则客户端将收到ORA-12505或ORA-12514错误TNS:listener does not currently know of...
。
当然,还有很多东西要探索。您可以定义多个服务名称,可以将监听器放在非标准端口上,如果有多个监听器,则可以告诉每个数据库要注册哪个。如果您对这一详细程度感兴趣,请深入了解文档。