Иногда у меня возникают проблемы с подключением к Oracle, потому что я не могу понять, какой файл tnsnames.ora использует мой клиент базы данных.
Какой лучший способ понять это? ++ рад за различные платформенные решения.
Oracle предоставляет утилиту под названием tnsping
:
R:\>tnsping someconnection
TNS Ping Utility for 32-bit Windows: Version 9.0.1.3.1 - Production on 27-AUG-20
08 10:38:07
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
C:\Oracle92\network\ADMIN\sqlnet.ora
C:\Oracle92\network\ADMIN\tnsnames.ora
TNS-03505: Failed to resolve name
R:\>
R:\>tnsping entpr01
TNS Ping Utility for 32-bit Windows: Version 9.0.1.3.1 - Production on 27-AUG-20
08 10:39:22
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
C:\Oracle92\network\ADMIN\sqlnet.ora
C:\Oracle92\network\ADMIN\tnsnames.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = **)
(PROTOCOL = TCP) (Host = ****) (Port = 1521))) (CONNECT_DATA = (SID = ENTPR0
1)))
OK (40 msec)
R:\>
Это должно показать, какой файл вы используете. Утилита находится в bin
каталоге Oracle .
Для Linux:
$ strace sqlplus -L scott/tiger@orcl 2>&1| grep -i 'open.*tnsnames.ora'
показывает что-то вроде этого:
open("/opt/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora",O_RDONLY)=7
Изменение на
$ strace sqlplus -L scott/tiger@orcl 2>&1| grep -i 'tnsnames.ora'
покажет все пути к файлам, которые терпят неудачу.
Разве это не должно быть всегда "$ ORACLE_ HOME / network / admin / tnsnames.ora"? Тогда вы можете просто сделать "echo $ oracle_ home" или эквивалент * nix.
@ Пит Холбертон Вы совершенно правы. Что напоминает мне, есть еще один гаечный ключ в работах под названием TWO_ TASK
Согласно http://www.orafaq.com/wiki/TNS_ADMIN
TNS_ADMIN - это переменная среды, которая указывает на каталог, в котором находятся файлы конфигурации SQL * Net (например, sqlnet.ora и tnsnames.ora).
Для Windows: Filemon из SysInternals покажет вам, к каким файлам осуществляется доступ.
Не забудьте установить свои фильтры, чтобы вы не были перегружены разговорной трафиком файловой системы.
Добавлено: Filemon не работает с более новыми версиями Windows, поэтому вам, возможно, придется использовать Process Monitor .
Есть еще одно место, где хранится местоположение TNS: если вы используете Windows, откройте regedit
и перейдите туда, My HKEY Local Machine/Software/ORACLE/KEY_OraClient10_home1
где KEY_OraClient10_home1
находится ваш Oracle. Если вызывается строковая запись TNS_ADMIN
, то значение этой записи будет указывать на файл TNS, который Oracle использует на вашем компьютере.
По умолчанию tnsnames.ora находится в каталоге $ ORACLE_HOME / network / admin в операционных системах UNIX и в каталоге ORACLE_HOME \ network \ admin в операционных системах Windows. tnsnames.ora также может храниться в следующих местах:
Каталог, указанный переменной среды TNS_ADMIN (или значением реестра)
В операционных системах UNIX - глобальный каталог конфигурации. Например, в операционной системе Solaris этот каталог / var / opt / oracle
Если у вас есть несколько ORACLE_HOMES, знайте, какой из них вы используете, так как расположение файла tnsnames.ora может варьироваться от одного ORACLE_HOME к следующему.
Для человека, который упомянул переменную среды TWO_TASK, которая используется для задания имени службы базы данных по умолчанию для подключения (которая может быть базой данных на другом сервере). Имя службы, для которой вы установили TWO_TASK, затем ищется в файле tnsnames.ora при подключении.
Codeslave спрашивает: «Не должно ли это быть всегда» $ ORACLE_ HOME / network / admin / tnsnames.ora »? Ответ - нет, это не так. Рассмотрим эти два вызова tnsping на одной и той же машине:
C:\Documents and Settings\me>D:\Oracle\10.2.0_DB\BIN\tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 09-OCT-2
008 14:30:12
Copyright (c) 1997, 2007, Oracle. All rights reserved.
Used parameter files:
D:\Oracle\10.2.0_DB\network\admin\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx
)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))
OK (40 msec)
C:\Documents and Settings\me>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 09-OCT-2
008 14:30:21
Copyright (c) 1997, 2005, Oracle. All rights reserved.
Used parameter files:
D:\oracle\10.2.0_Client\network\admin\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = XXXX)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ORCL)))
OK (20 msec)
C:\Documents and Settings\me>
Обратите внимание на два разных местоположения файла параметров, которые зависят от того, какой исполняемый файл tnsping вы запускаете (и, возможно, откуда он запускается). Для сетей Oracle, основанных на tnsnames, использование переменной TNS_ADMIN - единственный способ гарантировать получение согласованного файла tnsnames.ora. (ПРИМЕЧАНИЕ: Windows-ориентированный ответ)
На моей машине для разработки у меня есть три разные версии клиентского программного обеспечения Oracle. Я управляю tnsnames.ora
файлом в одном из них. В двух других я ввел в tnsnames.ora
файл:
ifile=path_to_tnsnames.ora_file/tnsnames.ora
Таким образом, если по какой-то причине tnsnames.ora
клиент использует неправильный файл, он всегда будет иметь актуальную версию.
Возможно, самый простой способ - проверить переменную среды PATH процесса, подключающегося к базе данных. Скорее всего, файл tnsnames.ora находится в первом каталоге бина Oracle по пути .. \ network \ admin. Переменная окружения TNS_ADMIN или значение в реестре (для текущего домашнего каталога Oracle) могут переопределить это.
Использование filemon, подобного предложенному другими, также поможет.
strace sqlplus -L scott/tiger@orcl
помогает найти .tnsnames.ora
файл, /home/oracle
чтобы найти файл, который он берет вместо $ORACLE_HOME/network/admin/tnsnames.ora
файла. Спасибо за публикацию.
Не прямой ответ на ваш вопрос, но я был очень разочарован, пытаясь найти и обновить все файлы tnsnames, так как у меня было несколько установок Oracle: клиент, инструменты BI, OWB и т. Д., Каждая из которых имела свой собственный дом оракула. Я закончил тем, что создал утилиту под названием TNSNamesSync, которая обновит все tnsnames во всех домах оракула. Это под лицензией MIT, бесплатно использовать здесь https://github.com/artybug/TNSNamesSync/releases
Документы находятся здесь: https://github.com/artchik/TNSNamesSync/blob/master/README.md
Это только для Windows, хотя.