Рейтинг:0

Сценарий SQL Developer PL/SQL не может отображать выходные данные через OpenVPN после выполнения определенного периода времени

флаг in

Эта проблема:

Когда я пытаюсь запустить сбор статистики через OpenVPN в моей базе данных Oracle 19c, SQL Developer не возвращает типичное сообщение «Процедура PL/SQL успешно завершена», если она выполняется более определенного времени.

Судя по всему, соединение через некоторое время зависает, и мне нужно либо отключиться от OpenVPN, либо убить SQL Developer в диспетчере задач Windows, чтобы закрыть его.

Моя база данных Oracle 19c и сервер OpenVPN находятся у разных облачных провайдеров.

Выполнение сбора статистики в этой базе данных обычно занимает около получаса.

Запуск команды сбора статистики в SQL Developer

Что я проверил:

  1. Ничего необычного в журналах Iptables и OpenVPN на сервере OpenVPN или в журналах прослушивания и предупреждений на сервере Oracle 19c.

  2. Для net.ipv4.tcp_keepalive_time и net.netfilter.nf_conntrack_tcp_timeout_installed установлены значения по умолчанию 7200 (2 часа) и 432000 (5 дней) на обеих машинах.

  3. Если я подключусь к базе данных как к системе и запущу:

    выберите x.sid, x.serial#, x.username, x.status, x.osuser, x.machine, x.program, x.event, x.state, sql.sql_text из v$sqlarea sql, v$session x, где x.sql_hash_value = sql.hash_value и x.sql_address = sql.address и x.username = 'myuser';

Примерно через полчаса я заметил, что сеанс сбора статистики неактивен. Поэтому я предполагаю, что сбор статистики действительно выполняется и завершается успешно, но просто не возвращает вышеупомянутое выходное сообщение.

Соберите статистику, работающую в базе данных

Сессия сбора статистики неактивна примерно через полчаса

Что я пробовал:

  1. В меньшей базе данных в том же экземпляре запуск сбора статистики через OpenVPN возвращает вышеупомянутое сообщение об успешном завершении. Этот занимает около 10 минут.

  2. Подключение напрямую (без OpenVPN) к базе данных путем добавления моего IP-адреса в брандмауэр облачного провайдера и запуска сбора статистики также возвращает вышеупомянутое сообщение об успешном завершении.

  3. Генерация пары открытого/закрытого ключа SSH на сервере Oracle 19c и использование хостов SSH на SQL Developer, но соединение очень нестабильное/постоянно сбрасывается.

  4. Настройка прокси-сервера Dante. Судя по всему, SQL Developer может использовать только какой-то специальный прокси-сервер.

  5. Настройка IPSEC VPN с помощью StrongSwan. Моя Windows 10 по какой-то причине не смогла установить с ним соединение.

Phill  W. avatar
флаг cn
Не хочу испортить ваш парад, но разве 19-й не делает это сам по себе, автоматически?
js1018 avatar
флаг in
Если это так, то я не знал об этом. Несмотря на это, проблема остается. Я не пробовал, но предположительно это также произойдет с любым другим скриптом PL/SQL, который работает от 10 до 30 минут через OpenVPN.
Рейтинг:0
флаг in

Во-первых, я смог подтвердить, что сбор статистики действительно завершается успешно, запустив:

выберите * из v$session_longops, где имя операции, подобное '%Schema%', упорядочено по описанию start_time;

После этого я выполнил следующие команды tcpdump на обоих серверах:

tcpdump -i eth0 -A "(src <myipaddress> или src <myoracle19caddress> или dst <myipaddress> или dst <myoracle19caddress>) и не порт ssh и не порт openvpn и не icmp" (сервер OpenVPN)

tcpdump -i eth0 -A "(src <myipaddress> или src <myopenvpnserveraddress> или dst <myipaddress> или dst <myopenvpnserveraddress>), а не порт ssh и не icmp" (сервер Oracle 19c)

И обнаружил, что сервер Oracle 19c отправил сообщение об успешном завершении, но сервер OpenVPN так и не получил его.

Покопавшись на разных сайтах, я обнаружил, что неправильно понял, что на самом деле делает net.ipv4.tcp_keepalive_time.

Это означает, что [по умолчанию] подпрограммы поддержки активности ждут два часа (7200 секунд). перед отправкой первой проверки активности, а затем повторно отправлять его каждые 75 секунды.

После этого я узнал о конфигурации сети облачного провайдера, на котором размещен мой сервер OpenVPN.

Неактивные соединения

[...] внедрить 10-минутное отслеживание соединения для IP-протоколы, которые имеют концепцию соединения. Это означает, что входящие пакеты, связанные с установленным соединение разрешено, пока хотя бы один пакет отправлен или получено за соединение в течение последних 10 минут. Если нет пакетов для соединения были отправлены или получены в течение 10 минут или дольше записи отслеживания незанятого соединения удаляются. После записи отслеживания подключения были удалены, [...] не разрешать дополнительные входящие пакеты, пока хотя бы один новый исходящий пакет отправлен. Это отслеживание соединения применяется ко всем источникам и пункты назначения — как внутренние, так и внешние IP-адреса.

С помощью этой новой информации я обошел это ограничение, установив время поддержания активности на значение менее 10 минут, выполнив следующую команду на сервере Oracle 19c:

sysctl -w net.ipv4.tcp_keepalive_time=300 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5

И сделал эти изменения постоянными, сохранив их в /etc/sysctl.conf.

Наконец, SQL Developer получает сообщение об успешном выполнении и закрывает соединение.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.