【问题标题】:In Oracle, how do you change the 'default' database?在 Oracle 中,如何更改“默认”数据库?
【发布时间】:2010-12-06 12:29:44
【问题描述】:

我真的应该知道这一点,但有人能告诉我如何更改 Linux 上的默认数据库吗?

例如:

我在server1ORACLE_SID=test1 上有一个数据库test1。所以,要连接到test1,我可以使用:

sqlplus myuser/password

连接到默认数据库test1

我现在希望默认 sqlplus 连接转到服务器 server2 上的数据库 test2

所以,我更新了 tnsnames,以便旧的 test1 条目现在指向 test2@server2。我还为test2 添加了一个单独的条目,它指向同一个地方。但是,默认连接似乎仍然转到test1@server1

以下两者都可以正常工作并转到server2上的数据库test2

sqlplus myuser/password@test1
sqlplus myuser/password@test2

但默认连接 sqlplus myuser/password 转到 test1@server1

有什么想法吗?

谢谢。

【问题讨论】:

  • 我假设所有这些都发生在 server1 上?
  • 是的。 server1 上有很多以“sqlplus user/pass”开头的旧脚本。我正在尝试找到一种方法来使这些脚本在从 server1 到 server2 的数据库迁移后继续工作。
  • 脚本最终会在 server1 还是 server2 上运行?如果是 server2,那么您只需将 server2 上的 ORACLE_SID 设置为 test2。

标签: linux oracle sqlplus


【解决方案1】:

扩展 kerchingo 的回答:Oracle 有多种方法来识别数据库。

最好的方法——你应该经常使用的方法——是USER/PASSWORD@SERVER。这将使用 Oracle 命名查找 (tnsnames.ora) 来查找实际服务器,每次连接到它时,它可能位于不同的物理主机上。您还可以将 Oracle 连接字符串指定为 SERVER,但假装您不能。

还有两种方法可以通过环境变量指定默认服务器。第一个是TWO_TASK,使用命名查找,第二个是ORACLE_SID,假设服务器在当前机器上运行。 ORACLE_SID 优先于 TWO_TASK

您应该始终使用显式连接字符串的原因是您不知道用户是否设置了TWO_TASKORACLE_SID,两者都设置了,或者两者都没有;你也不知道他们可能会被设置成什么。将两者设置为不同的值是一个特别痛苦的诊断问题,尤其是通过电话与一个并不真正了解 Oracle 工作原理的人(去过那里,做过那个)。

【讨论】:

  • 非常感谢。我从未遇到过的“TWO_TASK”正是我所需要的。
  • Hrm,Ask Tom says TWO_TASK 覆盖 ORACLE_SID。对于我在 OS X 上,TWO_TASK 有效,但ORACLE_SID 无效。让我感到困惑。
  • @theory - 可能是行为发生了变化(我从 8i 开始就没有积极使用过 Oracle),或者我的记忆不正确(但这永远不会发生 :-))。不知道为什么ORACLE_SID 不适合您,除非 Oracle 没有在标准端口上侦听。就个人而言,我在所有情况下都更喜欢TWO_TASK,但这可能是因为我在一个有很多数据库服务器的环境中工作。
  • @kdgregory:根据thisthatTWO_TASK 应该覆盖ORACLE_SID
【解决方案2】:

假设您已登录到 server1,您需要使用连接到 test2

sqlplus myuser/password@test2

因为您必须通过侦听器才能到达 server2。字符串 test2 标识 tnsnames.ora 文件中的一个条目,该条目指定如何连接到 test2。您将无法使用 sqlplus 命令的第一种形式连接到不同的服务器。

如果两个实例(test1、test2)都在 server1 上,那么您可以如 @kerchingo 所述,将 ORACLE_SID 环境变量设置为指向另一个实例。

【讨论】:

  • 这是一个打击 - 看起来我有一些脚本要迁移。
  • 不,请参阅@kdgregrory 的回答 - export TWO_TASK=test2 应该可以让您到达您需要去的地方。
  • 嗯 - 这是我今天的新东西 - “TWO_TASK”。工作得很好。
【解决方案3】:

使用数据库的 tns 别名定义环境变量 LOCAL

> set LOCAL=test1
> sqlplus myuser/password
> ... connected to test1
> set LOCAL=test2
> sqlplus myuser/password
> ... connected to test2

这适用于 Windows 客户端,而不适用于其他操作系统。

【讨论】:

  • LOCAL 适用于 Windows,TWO_TASK 适用于所有其他人。他们做同样的事情。
【解决方案4】:

正确的问题是“如何更改默认服务”? Oracle DBMS 提供两种类型的连接请求:显式和隐式。在显式请求中,您提供三个操作数,例如 sqlplus 用户名/密码@服务。在隐式请求中,您忽略第三个操作数。

仅当客户端主机和服务器主机相同时才适用隐式连接。因此,侦听器位于同一主机上。

侦听器是最初响应连接请求的侦听器。在处理来自同一主机的隐式连接请求时, 它检查是否已设置实例名称。它检查 shell 变量 ORACLE_SID 的值。

如果设置,那么它可以处理隐式连接请求。否则,它不能,您必须执行显式连接请求,提供第三个操作数。

listener-config 文件名 listener.ora 将实例与服务相关联。 要更改您连接的默认服务,请更改实例的默认值。 因此,更改 shell 变量 ORACLE_SID 的默认值。您可以在操作系统用户配置文件中执行此操作,例如 .profile 或类似的配置文件。

希望这会有所帮助。

【讨论】:

    【解决方案5】:

    我认为是在你的环境中设置的,你能 echo $ORACLE_SID 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2018-10-04
      • 2023-03-16
      • 2017-07-01
      相关资源
      最近更新 更多