Нет, строка подключения не может запустить ваш туннель VPN
VPN принадлежит операционной системе или клиенту, но никогда драйверу. Сначала поднимите туннель, передайте учётные данные домена с netonly, затем проверьте круговые обмены курсора.
Разработчики всё ещё ищут место, где строка подключения, JDBC URL или запись в tnsnames.ora выбирает VPN. Такого места нет. Туннель устанавливает операционная система или клиент поставщика, который регистрирует виртуальный адаптер, а каждая библиотека базы данных над ним использует получившийся сокетный слой. Строка подключения называет хост, порт и учётные данные, и это весь словарь.
Миф: строка подключения может выбрать туннель
Драйвер открывает TCP-сокет к хосту и порту. У него нет API для поднятия туннеля, нет поля для профиля туннеля и нет способа аутентифицироваться на шлюзе VPN.
Поэтому инструменты ведут себя одинаково, как только появляется маршрут. SSMS, DBeaver, Eclipse Data Tools и обычный sqlcmd действуют так, будто сервер в локальной сети, потому что с точки зрения сокета так и есть. Виртуальный адаптер сделал подсеть базы данных доступной, и драйвер никогда не знает как.
Это же объясняет, почему строка подключения не может починить упавший туннель. Когда связь умирает, драйвер сообщает о тайм-ауте или общей сетевой ошибке, а код приложения, который считает это проблемой запроса, бесконечно повторяет неверный слой.
Поднимите туннель до запуска драйвера
Подключите VPN на уровне операционной системы, следуя инструкциям провайдера или сетевой команды, и только затем открывайте инструмент. На практике это значит, что маршрут в подсеть базы данных существует до того, как драйвер разрешит имя хоста.
Держите надзор за туннелем вне приложения. Служба на PHP или Java, которая сама пытается поднять связь, зашивает поведение одного провайдера в бизнес-код, и каждое переключение при сбое становится выпуском приложения. Наблюдатель, который владеет туннелем, следит за ним и перезапускает его, — отдельный вопрос от пути запроса.
Проверьте маршрут, прежде чем винить драйвер: если хост не разрешается или порт не отвечает из оболочки, никакая строка подключения этого не изменит.
Миф: сбой аутентификации Windows означает, что маршрут сломан
Аутентификация Windows через VPN часто завершается ошибкой, похожей на сетевой сбой, хотя маршрут в порядке. Когда учётная запись принадлежит другому домену и ноутбук не может к нему присоединиться, запускайте клиент с явными учётными данными вместо идентичности сеанса рабочего стола.
runas /noprofile /netonly /user:CORP\dbreader "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe"Ключ /netonly хранит эти учётные данные только для удалённой аутентификации. Подтвердите, что сервер действительно получил, с помощью SELECT SUSER_SNAME(), а не доверяя диалогу подключения. Сообщается, что сохранение учётных данных для адреса сервера в Windows Credential Manager работает для SSMS, но не всегда для службы под другой учётной записью, поэтому перед сменой входа проверьте, какую идентичность использует процесс.
Задержка превращает серверный курсор в тайм-аут
Серверный курсор просит базу данных удерживать результат и выдавать его постепенно, что превращает один большой результат во множество мелких круговых обменов. В локальной сети это дёшево. Через туннель с десятками миллисекунд добавленной задержки тот же запрос может превысить тайм-аут команды, почти ничего не передав.
Перейдите на клиентский курсор или увеличьте размер выборки и группируйте строки, и число круговых обменов падает. Узкое место — число обменов, а не номинальная скорость канала, поэтому измерение пропускной способности введёт вас в заблуждение, а измерение обменов — нет. Проверяйте на самом большом наборе результатов, который пользователи действительно вытягивают, а не на запросе из одной строки, который возвращается мгновенно. Если тайм-аут смещается, но не исчезает, увеличьте одновременно тайм-аут команды и размер выборки и измерьте снова.
Та же арифметика применима к болтливым ORM и к любому клиенту, который выдаёт один оператор на строку. Если план запроса хорош, а передача мала, посчитайте сетевые обмены, прежде чем настраивать базу данных.
Проверьте порт, экземпляр и локальный фильтр
Именованный экземпляр слушает на динамическом порту, поэтому подтвердите порт, а не предполагайте 1433. В экземпляре по умолчанию значение можно прочитать из реестрового значения TcpPort под ключом SuperSocketNetLib этого экземпляра. Для Oracle проверьте, что хост в tnsnames.ora разрешается, адрес отвечает и порт слушателя разрешён; 1521 — распространённое значение по умолчанию, а не гарантия.
Затем исключите собственный список доступа туннеля и, наконец, локальный антивирус или брандмауэр хоста, который блокирует соединение даже когда клиент и сервер на одной машине. Зафиксируйте этап, на котором происходит сбой, до изменения конфигурации, потому что разрешение имён, доступность TCP и TLS или вход каждый падают с разным сообщением.
Запишите этап в тикет. Иначе следующий человек повторит тот же поиск строки подключения, с которого всё началось.