Я провел последний час, пытаясь подключиться к серверу mssql, используя sqlcmd через драйвер odbc. Я разговаривал с парнем из db, но он, похоже, не понимает, что происходит ... Может, вы поможете мне найти несколько вопросов, которые я мог бы задать этому парню ...
Я использую официальный драйвер odbc от Microsoft. По сути, мы используем какие-то динамические порты.
Между ними нет межсетевых экранов.
# odbcinst -q -d -n
[PostgreSQL]
[MySQL]
[ODBC Driver 11 for SQL Server]
Я пробовал разными способами
Код ошибки 0x2AF9:
sqlcmd -S hostname\DEV04 -U username -P password
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : TCP Provider: Error code 0x2AF9.
и
Ошибка при обнаружении указанного сервера / экземпляра [xFFFFFFFF].
sqlcmd -S hostname\\DEV04 -U username -P password
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].
Использование Perl
DBI connect('DASHBOARD','username',...) failed: [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]Login timeout expired (SQL-HYT00) [state was HYT00 now 08001]
[unixODBC][Microsoft][ODBC Driver 11 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. (SQL-08001)
[unixODBC][Microsoft][ODBC Driver 11 for SQL Server]SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF]. (SQL-08001) at ./test.pl line 4
Can't connect to : [unixODBC][Microsoft][ODBC Driver 11 for SQL Server]Login timeout expired (SQL-HYT00) [state was HYT00 now 08001]
[unixODBC][Microsoft][ODBC Driver 11 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. (SQL-08001)
[unixODBC][Microsoft][ODBC Driver 11 for SQL Server]SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF]. (SQL-08001) at ./test.pl line 4.
После прочтения этой ветки: https://github.com/Microsoft/msphpsql/issues/190
Мне нужно было узнать другой номер порта, который SQL Server прослушивал, выполнив
USE MASTER
GO
xp_readerrorlog 0, 1, N'Server is listening on'
GO
Результат
2018-04-12 03:19:57.830 Server Server is listening on [ 'any' <ipv6> 49155].
2018-04-12 03:19:57.830 Server Server is listening on [ 'any' <ipv4> 49155].
добавить правило для брандмауэра Windows на хосте SQL Server: - включение определенного порта 49155 (я думаю, это может отличаться)
Затем эта команда преуспела на моей машине с Ubuntu:
sqlcmd -Smyhost,49155 -U sa -P sa_pwd -d mydb -Q "select @@servername"
На основе рекламного сообщения отсюда: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/36b8956e-0218-44aa-b717-725fe1d601f9/error-in-sqlserver-odbc-dirver-for-linux?forum=sqldataaccess
Протокол UDP просто не будет работать в Linux с использованием предоставленных Microsoft инструментов ODBC и sqlcmd. Часть UDP используется изначально для проверки сервера, чтобы найти TCP-порт, который прослушивает запрошенная база данных.
Решение, используемое в моей работе, - это переключиться на pymssql, который будет работать с именованным экземпляром и запросами порта UDP.
Я столкнулся с аналогичной проблемой. Получается, что \DEV04
часть hostname\DEV04
используется, чтобы указать, что клиент должен подключаться к серверу через порт, отличный от порта по умолчанию. В мире Microsoft использование DEV04
автоматически гарантирует, что клиент подключается к правильному порту ... но, похоже, это не работает с Linux sqlcmd.
Спросите у администратора SQL Server, какой порт \DEV04
экземпляр слушает и подключается, используя hostname,PORT