Получение IP-адресов сервера базы данных из tnsnames.ora

#c# #oracle12c #tnsnames

#c# #oracle12c #tnsnames

Вопрос:

Я работаю над веб-приложением, которое будет развернуто на отдельных серверах приложений, каждый из которых подключается к другой базе данных Oracle. Соединения с БД указаны в файле tnsnames.ora каждого сервера приложений. Кроме того, каждая запись tns names использует несколько IP-адресов базы данных для обработки отказоустойчивости.

 ABCD = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (FAILOVER = on) 
      (LOAD_BALANCE = off) 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.5)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.10)(PORT = 1521))
    ) 
    (CONNECT_DATA = 
      (SERVICE_NAME = abcd) 
      (FAILOVER_MODE = 
        (TYPE = SELECT) 
        (METHOD = BASIC) 
      ) 
   ) 
) 
  

Я пытаюсь найти способ получить IP-адрес базы данных, которую в данный момент использует сервер приложений.

Я искал везде, но не могу найти решение и, честно говоря, даже не знаю, выполнимо ли это.

Я могу выполнить:

 netstat -a | findstr ":1521"

TCP    10.20.30.40:52707     Blah1:1521     ESTABLISHED
TCP    10.20.30.40:57022     Blah2:1521     ESTABLISHED
TCP    10.20.30.40:57024     Blah3:1521     ESTABLISHED
  

чтобы найти все подключения, выполненные к порту 1521, который используется Oracle DB. Затем я должен иметь возможность выполнить nslookup, чтобы получить IP-адрес Blah1, Blah2 и Blah3.

Возможно, мне придется проанализировать файл tnsnames.ora, используя имя записи tns, используемое приложением (ABC); затем сравните IP, который я получаю из nslookup, чтобы увидеть, какой из них соответствует.

Есть ли встроенный способ сделать это? Кто-нибудь сталкивался с этой ситуацией и сумел ее разрешить? Как я могу определить, является ли это 1.2.3.4 или 1.2.3.5 или 1.2.3.10, к которому подключается приложение?

Комментарии:

1. Я предполагаю, что смысл наличия нескольких адресов заключается в том, что каждое подключение к базе данных будет осуществляться по тому адресу, который доступен в данный момент. И только потому, что произошел сбой при одном соединении, не означает, что он завершится сбоем при следующем; это может быть временным. Если возможно ответить на ваш вопрос, его необходимо будет проверить на OracleConnection уровне для данного активного соединения, а не приложения в целом.

2. netstat -o будет включать идентификатор процесса.

3. Я действительно пробовал netstat -a -o -b. Возвращены три записи, но не уверен, что делать с PID.

4. @madreflection Это был еще один вариант, о котором я думал: установите соединение с базой данных Oracle и проверьте свойства соединения и посмотрите, включает ли оно имя хоста DB или IP. Не уверен, что это так, но могу попробовать.

5. @madreflection создание соединения с Oracle, его открытие и проверка его свойств были способом сделать это, как вы предложили. Я мог видеть из свойства HostName объекта connection имя сервера БД, из которого я могу получить IP-адрес. Пожалуйста, измените свой комментарий на ответ, и я отмечу его как таковой. Вы можете добавить то, что я упоминал о получении имени хоста из conn. объект. Спасибо.