ORA-12170: TNS: истекло время ожидания подключения
Я пытался подключиться к базе данных здесь, на моем ноутбуке, используя Oracle Toad, но у меня продолжала появляться эта ошибка:
ORA-12170: TNS: истекло время ожидания подключения
Каковы возможные причины, почему я продолжал иметь эту ошибку?
Я получил доступ к той же базе данных вчера и смог получить к ней доступ.
10 ответов
[Сбор ответов в комментариях]
Проблема в том, что служба Oracle работает на IP-адресе, а хост настроен с другим IP-адресом.
Чтобы увидеть IP-адрес службы Oracle, введите lsnrctl status
введите команду и проверьте указанный адрес (в данном случае это 127.0.0.1, localhost):
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Чтобы увидеть IP-адрес хоста, введите ipconfig
(под окнами) или ifconfig
(под Linux) команда.
Однако в моей установке служба Oracle не работает, если она указана для адреса localhost, я должен установить реальный IP-адрес хоста (например, 192.168.10.X).
Чтобы избежать этой проблемы в будущем, не используйте DHCP для назначения IP-адреса хоста, но используйте статический.
Это из-за конфликтующего SID. Например, в вашем файле Oracle12cBase\app\product\12.1.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora описание соединения для ORCL выглядит так:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
И вы пытаетесь подключиться, используя строку подключения, используя тот же SID, но другой IP, имя пользователя / пароль, например:
sqlplus username/password@192.168.130.52: 1521 / orcl
Чтобы решить эту проблему, внесите изменения в файл tnsnames.ora:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.130.52)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
Проверьте FIREWALL, чтобы разрешить соединение на сервере с вашего клиента. Разрешив доменную сеть или создать правило.
Проблема, поскольку установление соединения или связь с клиентом не удалось завершить в течение выделенного интервала времени. Это может быть результатом сетевых или системных задержек.
ПОИСК И УСТРАНЕНИЕ НЕИСПРАВНОСТЕЙ (Doc ID 730066.1)
Ошибки тайм-аута соединения ORA-3135 и ORA-3136 Ошибка тайм-аута соединения может возникнуть, когда попытка соединения с базой данных не завершает свои фазы соединения и аутентификации в течение периода времени, разрешенного для следующего:SQLNET.INBOUND_CONNECT_TIMEOUT и / или сервера INBOUND_CONNECT_TIMEOUT_ параметры
Начиная с Oracle 10.2, значение по умолчанию для этих параметров составляет 60 секунд, где в предыдущих выпусках оно было 0, что означает отсутствие времени ожидания.
По истечении времени ожидания клиентская программа получит ошибку ORA-3135 (или, возможно, TNS-3135):
ORA-3135 соединение потерял контакт
и база данных зарегистрирует ошибку ORA-3136 в своем alert.log:
... Сб 10 мая 02:21:38 2008 ПРЕДУПРЕЖДЕНИЕ: истекло время ожидания входящего соединения (ORA-3136) ...
- SQL аутентификации
Когда сеанс базы данных находится в фазе аутентификации, он выдаст последовательность операторов SQL . Аутентификация не завершена, пока все они не будут проанализированы, выполнены, извлечены полностью. Некоторые из операторов SQL в этом списке, например, в 10.2:
select value$ from props$ where name = 'GLOBAL_DB_NAME'
select privilege#,level from sysauth$ connect by grantee#=prior privilege#
and privilege#>0 start with grantee#=:1 and privilege#>0
select SYS_CONTEXT('USERENV', 'SERVER_HOST'), SYS_CONTEXT('USERENV', 'DB_UNIQUE_NAME'),
SYS_CONTEXT('USERENV', 'INSTANCE_NAME'), SYS_CONTEXT('USERENV', 'SERVICE_NAME'),
INSTANCE_NUMBER, STARTUP_TIME, SYS_CONTEXT('USERENV', 'DB_DOMAIN')
from v$instance where INSTANCE_NAME=SYS_CONTEXT('USERENV', 'INSTANCE_NAME')
select privilege# from sysauth$ where (grantee#=:1 or grantee#=1) and privilege#>0
ALTER SESSION SET NLS_LANGUAGE= 'AMERICAN' NLS_TERRITORY= 'AMERICA' NLS_CURRENCY= '$'
NLS_ISO_CURRENCY= 'AMERICA' NLS_NUMERIC_CHARACTERS= '.,' NLS_CALENDAR= 'GREGORIAN'
NLS_DATE_FORMAT= 'DD-MON-RR' NLS_DATE_LANGUAGE= 'AMERICAN' NLS_SORT= 'BINARY' TIME_ZONE= '+02:00'
NLS_COMP= 'BINARY' NLS_DUAL_CURRENCY= '$' NLS_TIME_FORMAT= 'HH.MI.SSXFF AM' NLS_TIMESTAMP_FORMAT=
'DD-MON-RR HH.MI.SSXFF AM' NLS_TIME_TZ_FORMAT= 'HH.MI.SSXFF AM TZR' NLS_TIMESTAMP_TZ_FORMAT=
'DD-MON-RR HH.MI.SSXFF AM TZR'
ПРИМЕЧАНИЕ. Приведенный выше список SQL не является полным и не отражает порядок аутентификации SQL . Различия также могут существовать от выпуска к выпуску.
- Зависает во время аутентификации
Вышеуказанные операторы SQL должны быть проанализированы, выполнены и извлечены, как это происходит для всех SQL внутри базы данных Oracle. Отсюда следует, что любая проблема, возникающая на этих этапах, которая выглядит как зависание или серьезное замедление работы, может привести к тайм-ауту.
Симптомы таких зависаний будут замечены сеансом аутентификации как ожидающий: • курсор: контакт S, ожидание по X • защелка: объекты кэша строк • блокировка кэша строк Возможны другие типы событий ожидания; этот список может быть неполным.
Проблема здесь в том, что сеанс аутентификации блокируется в ожидании получения общего ресурса, который удерживается другим сеансом внутри базы данных. Этот сеанс блокировщика сам по себе занят длительным действием (или его собственным зависанием), что препятствует своевременному освобождению общего ресурса, необходимого для сеанса аутентификации. Это приводит к тому, что время ожидания в конечном итоге сообщается сеансу аутентификации.
- Устранение неполадок аутентификации зависает
В таких ситуациях нам необходимо выяснить, какой процесс блокирования удерживает общий ресурс, необходимый для сеанса аутентификации, чтобы увидеть, что с ним происходит.
Типичная диагностика, используемая в таких случаях:
- Три последовательных дампа состояния системы на уровне 266 в течение времени, когда один или несколько сеансов аутентификации заблокированы. Вполне вероятно, что сеанс блокировки вызвал тайм-аут более одной попытки подключения. Следовательно, системные дампы могут быть полезны, даже если время, необходимое для их генерации, превышает период одного тайм-аута, например, 60 секунд:
$ sqlplus -prelim '/ as sysdba' oradebug setmypid oradebug unlimit oradebug dump systemstate 266 ...wait 90 seconds oradebug dump systemstate 266 ...wait 90 seconds oradebug dump systemstate 266 quit
- Отчеты о ASH, охватывающие, например, 10-15 минут периода времени, в течение которого было замечено несколько ошибок тайм-аута.
- Если возможно, Два последовательных запроса в представлении V$LATCHHOLDER для случая, когда ожидаемый общий ресурс является защелкой. выберите * из v$latchholder; Системные дампы состояния должны помочь в идентификации сеанса блокировщика. Уровень 266 покажет нам, какой код он выполняет, что может помочь в поиске любой существующей ошибки в качестве основной причины.
Примеры проблем, которые могут привести к зависанию аутентификации
- Неопубликованная ошибка 6879763 Ошибка симулятора общего пула исправлена патчем для неопубликованной ошибки 6966286, см. Примечание 563149.1
Параметр обхода неопубликованной ошибки 7039896 _enable_shared_pool_durations=false, см. Примечание 7039896.8
Другие подходы, чтобы избежать проблемы
В некоторых случаях может быть возможно избежать проблем с проверкой подлинности SQL путем закрепления таких операторов в общем пуле вскоре после запуска экземпляра и их новой загрузки. Вы можете использовать следующий artcile, чтобы посоветовать это: Документ 726780.1 Как закрепить курсор в общем пуле, используя DBMS_SHARED_POOL.KEEP
Пиннинг предотвратит их вымывание из-за неактивности и старения и, следовательно, предотвратит их повторную загрузку в будущем, т. Е. Необходимость повторной обработки и подверженности проблемам зависания аутентификации.
Если вы только что установили 21c в Oracle Linux 8 на виртуальной машине (не для производства).
Следуйте инструкциям ниже:
Сначала остановите слушателя
./lsnrctl stop
Откройте файл listener.ora и замените значение HOST IP-адресом #Location --> /opt/oracle/homes/OraDBHome21cEE/network/admin/listener.ora
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.223.130)(PORT =1521))
Перезапустите прослушиватель
./lsnrctl start
Теперь переключитесь на пользователя root и выполните следующие команды одну за другой, чтобы отключить брандмауэр.
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl status firewalld
Сверните виртуальную машину и подключитесь с хост-машины (или любой другой машины) с помощью Toad или любого другого инструмента просмотра базы данных.
Если все еще не работает, вы можете остановить базу данных и перезапустить
./sqlplus / as sysdba
shutdown immediate;
startup;
open sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT=360
SQLNET.RECV_TIMEOUT=10
SQLNET.SEND_TIMEOUT=10
http://docs.oracle.com/cd/B19306_01/network.102/b14213/sqlnet.htm
Я получал ту же ошибку при подключении моего "hr" пользователя ORCLPDB, который является подключаемой базой данных.
Сначала получите имя хоста и номер порта, набрав команду lsnrctl status
в командной строке Windows. В моем случае это был 127.0.0.1 с номером порта 1521
Во-вторых, введите команду ниже с вашим именем хоста и номером порта:
sqlplus username/password@HostName:Port Number/PluggableDatabaseName.
Например:
sqlplus hr/hr@127.0.0.1:1521/ORCLPDB.
Помимо oci.dll есть несколько файлов.jar. Это натолкнуло меня на мысль установить Java. Потом все заработало.
Я попытался изменить файл tnsnames.ora, указав IP-адрес сервера вместо адреса localhost или loopback, это не сработало. Брандмауэр блокировал запросы. Пожалуйста, настройте брандмауэр или отключите его (не рекомендуется), это будет работать.