AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 73216
Accepted
Tulains Córdova
Tulains Córdova
Asked: 2014-08-06 08:28:30 +0800 CST2014-08-06 08:28:30 +0800 CST 2014-08-06 08:28:30 +0800 CST

tnsnames 中服务名称/别名的最佳实践

  • 772

我有这样的想法,在 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)
    )
  )
oracle best-practices
  • 2 2 个回答
  • 15525 Views

2 个回答

  • Voted
  1. Best Answer
    Justin Cave
    2014-08-06T08:46:56+08:002014-08-06T08:46:56+08:00

    我当然不想在 TNS 别名中包含服务器名称。随着数据库从一台服务器转移到另一台服务器以及组织转移到诸如 RAC 之类的具有多台服务器的事物,这种情况似乎很可能会随着时间而改变。

    假设您选择的服务名称是有意义的,我希望服务名称与 TNS 别名匹配,因为两者都是同一事物的逻辑名称。当然,这不是一个硬性规定。一些组织可能有理由为单个服务使用两个单独的逻辑名称。例如,您可能需要一个 TNS 别名,该别名FINANCE指向FINUSA美国用户的FINFRA服务和法国用户的服务。但是对于绝大多数情况,如果 TNS 别名是FINANCE,那么服务名称也应该是FINANCE。

    • 4
  2. kubanczyk
    2014-08-06T11:46:31+08:002014-08-06T11:46:31+08:00

    对你来说最昂贵的东西是什么?优先。

    通常最昂贵的事情是混淆用户。普通用户很少使用 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 名称(奥卡姆剃刀)不同。

    CRMDB=
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = crmdb.mydomain.local)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = CRMDB)
        )
      )
    

    成本方面的下一件事是操作系统(机器)及其 IP 地址。您无法为每个 TNS 名称提供单独的系统。所以 crmdb.mydomain.local 不是 IP 地址的唯一名称;相同的 IP 地址会有更多的名称,例如 financedb.mydomain.local。您的操作系统管理员将决定如何做到最好,以及如何确定操作系统的主主机名。他们与许多其他系统有同样的问题——多个名称指代一个操作系统——所以他们手头应该有一个解决方案。现在唯一感到困惑的是 DBA 和操作系统管理员,他们看到多个主机名指向同一个 IP 地址。但用户并不关心这一点,也不会对此感到困惑。(顺便说一下,这种方法与 SCAN 是一致的。)

    成本方面的下一件事是两者之一:Oracle 实例或“将模式与实例分离的管理成本”。取舍由您决定。

    • 您可以将多个 SERVICE_NAMES 放在一个实例上,这是一种很常见的做法。警告购买者,稍后将它们分离到它们自己的实例可能非常困难。当开发人员“方便地”尝试从另一个应用程序访问一个应用程序的模式时,由您来阻止他们。这是您的管理成本。在这种情况下,数据库名称和实例名称不应等于任何 SERVICE_NAME。将其设置为类似于主操作系统主机名,以保持简单。
    • 有一些 SERVICE_NAMES 足够精致,可以拥有自己的实例。或者,实例在人工和维护方面对您来说只是便宜的,并且您更愿意拥有一个单独的实例而不是承担上述成本。在此变体中,数据库名称和实例名称将是 CRMDB(如果您有 RAC 或 DataGuard,实例将变为类似 CRMDB1)。

    SERVICE_NAME 基本上是免费的。每个 TNS 名称都应该有一个相同的 SERVICE_NAME。

    • 3

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve