尝试使用 sqlcmd(从 Ubuntu 命令行)连接到 SQL 服务器时出错?

Error trying to connect to a SQL Server using sqlcmd (from Ubuntu command line)?

我在尝试使用 sqlcmd[=38] 从 Ubuntu 机器连接到 SQL 服务器 实例时发现一些问题=].

所以我按照此处的说明安装了 sqlcmdhttps://docs.microsoft.com/it-it/sql/linux/sql-server-linux-setup-tools?view=sql-server-ver15#ubuntu

SQL服务器似乎可以访问,因为我可以通过Telnet成功连接到其IP的1433端口

然后我尝试以这种方式连接到我在这台服务器上的一个数据库:

./sqlcmd -S MY_SERVER_IP\ESB_WSO2_USER_DB

其中MY_SERVER_IP是本服务器的IP,ESB_WSO2_USER_DB是数据库名这个服务器。

问题是我得到以下消息错误作为输出:

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2AFA.
Sqlcmd: Error: Microsoft ODBC Driver 17 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 安装有关(可能是一些配置错误)还是与我的连接字符串有关?或者与 SQL Server 数据库相关的东西?

消息说 SQL 服务器可能不允许外部连接,但是...如果是这样...为什么 Telnet 连接正常?

-S MY_SERVER_IP\ESB_WSO2_USER_DB表示服务器的IP,实例的名称。 Windows 主机可以 运行 SQL 服务器的多个实例,当它们这样做时,需要为后面的实例指定一个与默认实例名称不同的名称 (MSSQLSERVER) 和 运行 在不同的端口上。因此,您可以在之后指定名称,而不是端口(如果您已命名服务器 运行ning)。例如 SRVSQLHost\DevInstance 将连接到服务器 SRVSQLHost 上的实例 DevInstance不是 数据库 DevInstance 在实例 MSSQLSERVER 上在主机 SRVSQLHost.

您使用 -d 开关传递数据库的名称。如果您 运行 只是 sqlcmd(在 Bash 中,而不是 Powershell,您需要在其中使用 sqlcmd -?),您将看到输入开关:

:~$ sqlcmd
Microsoft (R) SQL Server Command Line Tool
Version 17.4.0001.1 Linux
Copyright (c) 2012 Microsoft. All rights reserved.

usage: sqlcmd            [-U login id]          [-P password]
  [-S server or Dsn if -D is provided] 
  [-H hostname]          [-E trusted connection]
  [-N Encrypt Connection][-C Trust Server Certificate]
  [-d use database name] [-l login timeout]     [-t query timeout]
  [-h headers]           [-s colseparator]      [-w screen width]
  [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
  [-c cmdend]
  [-q "cmdline query"]   [-Q "cmdline query" and exit]
  [-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
  [-u unicode output]    [-r[0|1] msgs to stderr]
  [-i inputfile]         [-o outputfile]
  [-k[1|2] remove[replace] control characters]
  [-y variable length type display width]
  [-Y fixed length type display width]
  [-p[1] print statistics[colon format]]
  [-R use client regional setting]
  [-K application intent]
  [-M multisubnet failover]
  [-b On error batch abort]
  [-D Dsn flag, indicate -S is Dsn] 
  [-X[1] disable commands, startup script, environment variables [and exit]]
  [-x disable variable substitution]
  [-? show syntax summary]

请注意,Windows Powershell 上可用的某些开关在 Bash 和 Linux 的 Powershell 中不可用;比如参数。

所以,对于你想要的:

sqlcmd -S MY_SERVER_IP -d ESB_WSO2_USER_DB -U YOUR_LOGIN_NAME

(我假设你需要通过 -U 开关,除非你 在你的 Ubuntu 实例上 配置了 kerboros,但是你没有提到它,所以我假设没有。注意 LOGIN for -U 必须是 SQL 身份验证登录,而不是 AD 登录。)