Чому я не можу підключитися до sqlplus, коли вказую SID і пароль ORACLE з командного рядка?


1

У мене 2 різних сервера Red Hat з Oracle 12c. На одному з них я можу увійти до sqlplus, вказавши SID і пароль ORACLE з командного рядка:

[root@server1 ~]# $ORACLE_HOME/bin/sqlplus ourdbuser@$ORACLE_SID/ourpassword

SQL*Plus: Release 12.2.0.1.0 Production on Fri Mar 23 20:16:01 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Fri Mar 23 2018 20:14:29 +00:00

Connected to:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

З іншого боку, він не працює, коли я вказую SID і пароль ORACLE з командного рядка:

[root@server2 ~]# $ORACLE_HOME/bin/sqlplus ourdbuser@$ORACLE_SID/ourpassword

SQL*Plus: Release 12.2.0.1.0 Production on Fri Mar 23 20:16:53 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-12545: Connect failed because target host or object does not exist

Але якщо я не вказую SID і пароль ORACLE з командного рядка, і введу пароль у підказку, він працює:

[root@server2 ~]# $ORACLE_HOME/bin/sqlplus ourdbuser

SQL*Plus: Release 12.2.0.1.0 Production on Fri Mar 23 20:17:17 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Fri Mar 23 2018 20:12:25 +00:00

Connected to:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

Я намагався побачити, чи є різниця між server1 і server2, і я нічого не знайшов. Server1:

[root@server1 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
[root@server1 ~]# env | grep "ORACLE"
ORACLE_SID=ourdb
ORACLE_HOME=/opt/oracle/product/12.2.0/db
[root@server1 ~]# ls -lrt /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
-rw-r-----. 1 oracle oinstall 416 Aug  3  2017 /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
[root@server1 ~]# cat /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_OURDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))

OURDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ourdb)
    )
  )

Server2:

[root@server2 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)
[root@server2 ~]# env | grep "ORACLE"
ORACLE_SID=ourdb
ORACLE_HOME=/opt/oracle/product/12.2.0/db
[root@server2 ~]# ls -lrt /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
-rw-r-----. 1 oracle oinstall 466 Aug 22  2017 /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
[root@server2 ~]# cat /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/12.2.0/db/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_OURDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = server2)(PORT = 1521))

OURDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = server2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ourdb)
    )
  )

Що ще потрібно перевірити?


Як щодо використання такого формату, як sqlplus ourdbuser/ourpassword@ORACLE_SID це допоможе? Згідно Використання командного рядка SQL вони дають приклад: sqlplus hr/my_hr_password@host_computer_name тому я вважаю, що це лише питання синтаксису, але достатньо просте, щоб спробувати усунути як рішення як мінімум. Дозвольте мені знати, як це відбувається, і я буду радий додати як відповідь більш докладно, якщо це вирішить проблему, просто позначте мене назад.
— Pimp Juice IT

Це все одно Підключення не вдалося, оскільки цільовий хост або об'єкт не існує "Помилка або щось інше? Чи спробували ви також ввести номер порту і ім'я хоста тощо в цьому форматі sqlplus ourdbuser/ourpassword@OracleHostServer:1521/@ORACLE_SID? The OracleHostServer має бути DNS-ім'я сервера, на якому знаходиться екземпляр Oracle, або його IP-адреса, доступна з машини, яку ви запускаєте.
— Pimp Juice IT

Коли я спробую команду у вашому першому коментарі, я отримую те ж саме Connect failed because target host or object does not exist. Коли я намагаюся покласти в хост / порт, я отримую ORA-12514: TNS:listener does not currently know of service requested in connect descriptor. БД Oracle знаходиться на одному сервері, і я спробував використовувати localhost, його хост і його IP, і всі вони призводять до тієї самої помилки.
— pacoverflow

Прочитайте деякі з цих відповідей, щоб дізнатися, чи допомагає це: stackoverflow.com/questions/10786782/…
— Pimp Juice IT

1
Виходить, що sqlplus ourdbuser/ourpassword@localhost:1521/$ORACLE_SID працював, що дещо відрізняється від запропонованого. Але тоді я дізнався, що це не справжня проблема. Справжня проблема полягає в тому, що хтось змінив домен сервера після встановлення Oracle. The HOST Значення в файлах listener.ora і tnsnames.ora мали повне доменне ім'я, і ​​вони не відповідали тому, що hostname команда повернулася. Після виправлення цих 2 файлів, все знову працювало.
— pacoverflow

Відповіді:


1

Я взяв пропозицію Pimp Juice IT використовувати іншу команду sqlplus ( sqlplus ourdbuser/ourpassword@localhost:1521/$ORACLE_SID ), і це спрацювало.

Проте це було лише тимчасовим шляхом для справжньої причини проблеми, яка була виявлена ​​після перезавантаження сервера і запуску слухача Oracle. Справжня проблема полягала в тому, що домен сервера був змінений після встановлення Oracle.

The hostname команда показала новий домен сервера:

server1.zzz.bbb.ccc.com

Але файл $ ORACLE_HOME / network / admin / listener.ora містив старий домен:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = server1.aaa.bbb.ccc.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

Файл $ ORACLE_HOME / network / admin / tnsnames.ora також зробив:

LISTENER_OURSID =
  (ADDRESS = (PROTOCOL = TCP)(HOST = server1.aaa.bbb.ccc.com)(PORT = 1521))

OURSID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = server1.aaa.bbb.ccc.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oursid)
    )
  )

Після зміни домену в цих 2 файлах, слухач Oracle зміг запустити і оригінал sqlplus ourdbuser@$ORACLE_SID/ourpassword команда працювала.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.