Назад | Перейти на главную страницу

ICMP ping в порядке, но таймаут tnsping для oracle

У нас есть Oracle, работающий на сервере Windows, и несколько клиентов Linux. Клиенты Windows работают нормально. Однако бег tnsping на клиенте Linux (под управлением RHEL 6.9) возникает интересная проблема. Например:

tnsping <IP> 100

В конечном итоге это не удастся на клиенте Linux с:

TNS-12535: TNS:operation timed out

Помните - ping не показывает отброшенных пакетов. Я провел некоторое тестирование с tcpdump, и когда я загрузил его в wirehark, единственное, что я мог видеть, было странным, - это повторные передачи TCP. Каждый клиент Linux, который я пробую этот, демонстрирует такое поведение. Я попытался настроить некоторые тайм-ауты TCP на уровне ОС / сохранить активность, но все еще не решил это.

Я сделал strace при tnsping, и единственное, что он показал, это тайм-аут, который не помог.

Речь идет о виртуальных машинах, работающих на VMWare.

Редактировать:

Я создал файл трассировки и снова запустил tnsping. Это удалось для многих подключений, но в конечном итоге истекло время ожидания:

nttcni: Tcp conn timeout = 60000 (ms)
nttcni: TCP Connect TO enabled. Switching to NB
nttctl: entry
nttctl: Setting connection into non-blocking mode
nttcni: trying to connect to socket 5.
ntt2err: entry
ntt2err: exit
ntctst: size of NTTEST list is 1 - not calling poll
sntpoltst: No of conn to test 1, wait time 60
sntpoltst: fd 5 need 1 readiness events
sntpoltst: exit
nttcni: TImeout or Error on this socket
nttcni: exit
nttcon: exit
nserror: entry
nserror: nsres: id=0, op=65, ns=12535, ns2=12560; nt[0]=505, nt[1]=0, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0
nsopen: unable to open transport
nsiocancel: entry
nsiofrrg: entry
nsiofrrg: cur = 24eff18
nsbfr: entry
nsbaddfl: entry
nsbaddfl: normal exit
nsbfr: normal exit
nsiofrrg: exit
nsiocancel: exit
nsvntx_dei: entry
nsvntx_dei: exit

Я нашел эту статью, которая похожа на мою проблему, но не совсем. В их примере tnsping смог подключиться и отправить данные, как это выглядит - мой tnsping даже не устанавливает TCP-соединение.

https://ardentperf.com/2010/09/08/mysterious-oracle-net-errors/

Если я добавлю следующие параметры для подключения в файле tnsnames.ora:

(RETRY_COUNT=3)
    (TRANSPORT_CONNECT_TIMEOUT=10)

Тогда он будет работать без тайм-аута, но приведет к высокой задержке:

OK (10 msec)
OK (0 msec)
OK (0 msec)
OK (10 msec)
OK (0 msec)
OK (0 msec)
OK (10020 msec)
OK (0 msec)
OK (0 msec)
OK (0 msec)
OK (10 msec)
OK (0 msec)

Это «исправление» похоже на жевательную резинку и клейкую ленту, но оно работает.

Похоже, есть большая вероятность, что соединение блокируется брандмауэром или, возможно, прослушиватель Oracle просто не работает. Вы можете попробовать установить следующие параметры в клиентском sqlnet.ora, чтобы сгенерировать файл трассировки для tnsping и посмотреть, даст ли это вам дополнительную информацию.

TNSPING.TRACE_LEVEL=SUPPORT
TNSPING.TRACE_DIRECTORY=<your trace directory>