我有这样的想法,在 tnsnames.ora(不是 dblinks 使用的服务器中的连接描述符,而是公共的)文件中为连接描述符提供的服务名称/别名绝不应该与 SID 相关,更不用说服务器的名称。
假设服务器的名称是“myserver”,实例的 SID 是“myinstance”。
我认为为连接字符串提供别名“myinstance-at-myserver”并不是一个好主意,因为您以某种方式将逻辑与物理耦合。
- 我是对还是错,为什么?
这是最佳做法吗?:
# one server-instance-named descriptor
MYINSTANCE-AT-MYSERVER =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myserver)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = myinstance)
)
)
还是这个?
# several business-named descriptors pointing to the same listener
RRHH =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myserver)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = myinstance)
)
)
FINANCE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myserver)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = myinstance)
)
)
SALES =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myserver)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = myinstance)
)
)
我当然不想在 TNS 别名中包含服务器名称。随着数据库从一台服务器转移到另一台服务器以及组织转移到诸如 RAC 之类的具有多台服务器的事物,这种情况似乎很可能会随着时间而改变。
假设您选择的服务名称是有意义的,我希望服务名称与 TNS 别名匹配,因为两者都是同一事物的逻辑名称。当然,这不是一个硬性规定。一些组织可能有理由为单个服务使用两个单独的逻辑名称。例如,您可能需要一个 TNS 别名,该别名
FINANCE
指向FINUSA
美国用户的FINFRA
服务和法国用户的服务。但是对于绝大多数情况,如果 TNS 别名是FINANCE
,那么服务名称也应该是FINANCE
。对你来说最昂贵的东西是什么?优先。
通常最昂贵的事情是混淆用户。普通用户很少使用 TNS 名称。他们通常通过专门的应用程序使用数据,并且只知道应用程序的名称,例如 CRM。高级用户连接到 TNS 名称(想想 SQLdeveloper),但他们也连接到普通应用程序。为什么您希望应用程序 CRM 使用 ORION 的 TNS 名称?高级用户看到 TNS 名称,他们只关心 TNS 名称;不是 SID,不是主机名。他们根据 TNS 名称与其他用户交谈(从 FINANCEDB John 那里获取该报告!)。最小用户混淆的状态是当 TNS 名称与使用它的应用程序名称相同时。与附加的“db”完全相同。所以 TNS 名称就像 CRM 或 CRMDB。我更喜欢后者。
下一个代价高昂的事情是更改 tnsnames.ora 中的任何内容。你不知道它分布在哪里。你把文件放在一个人的客户端机器或应用服务器上,三个月后它神奇地出现在其他十几个人身上。你能阻止它吗?(不,你不能。)所以在实践中,这意味着一旦你给任何用户一个 TNS 名称,它的定义就一成不变。所以,不要把 SID 放在那里,放一个 SERVICE_NAME。不要把IP地址放在那里,放一个主机名。并且这两个将“永远”坚持 TNS 名称,因此它们没有理由与 TNS 名称(奥卡姆剃刀)不同。
成本方面的下一件事是操作系统(机器)及其 IP 地址。您无法为每个 TNS 名称提供单独的系统。所以 crmdb.mydomain.local 不是 IP 地址的唯一名称;相同的 IP 地址会有更多的名称,例如 financedb.mydomain.local。您的操作系统管理员将决定如何做到最好,以及如何确定操作系统的主主机名。他们与许多其他系统有同样的问题——多个名称指代一个操作系统——所以他们手头应该有一个解决方案。现在唯一感到困惑的是 DBA 和操作系统管理员,他们看到多个主机名指向同一个 IP 地址。但用户并不关心这一点,也不会对此感到困惑。(顺便说一下,这种方法与 SCAN 是一致的。)
成本方面的下一件事是两者之一:Oracle 实例或“将模式与实例分离的管理成本”。取舍由您决定。
SERVICE_NAME 基本上是免费的。每个 TNS 名称都应该有一个相同的 SERVICE_NAME。