2013-02-27 64 views
3

我正尝试连接到CentOS 5.8上的SQL Server 2008。我正在使用unixODBC 2.3.0和SQL Server ODBC驱动程序(www.microsoft.com/en-us/download/details.aspx?id=28160)。未能从Linux连接到SQl服务器

当我尝试测试通过运行连接:

isql -v mydsn username password 

它GIVENS我:

[S1T00][unixODBC][Microsoft][SQL Server Native Client 11.0]Login timeout expired 
[08001][unixODBC][Microsoft][SQL Server Native Client 11.0]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. 
[08001][unixODBC][Microsoft][SQL Server Native Client 11.0]TCP Provider: Error code 0x2726 
[ISQL]ERROR: Could not SQLConnect 

的端口是开放的,服务器可以访问。

我试图进一步诊断问题,但得到困在这里:

strace -e trace=network isql -v mydsn username password 
socket(PF_FILE, SOCK_STREAM, 0)   = 3 
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"...}, 110) = -1 ENOENT (No such file or directory) 
socket(PF_FILE, SOCK_STREAM, 0)   = 3 
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"...}, 110) = -1 ENOENT (No such file or directory) 
socket(PF_FILE, SOCK_STREAM, 0)   = 3 
connect(3, {sa_family=AF_FILE, path="/var/run/setrans/.setrans-unix"...}, 110) = 0 
sendmsg(3, {msg_name(0)=NULL, msg_iov(5)=[{"\1\0\0\0", 4}, {"\1\0\0\0", 4}, {"\1\0\0\0", 4}, {"\0", 1}, {"\0", 1}], msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 14 
socket(PF_FILE, SOCK_STREAM, 0)   = 4 
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"...}, 110) = -1 ENOENT (No such file or directory) 
socket(PF_FILE, SOCK_STREAM, 0)   = 4 
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"...}, 110) = -1 ENOENT (No such file or directory) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 
socket(PF_INET, 0x80001 /* SOCK_??? */, IPPROTO_TCP) = -1 EINVAL (Invalid argument) 

显然,还有与之建立连接的事情有些不对劲。

任何人都可以帮助我吗?如果您需要其他信息,请告诉我。

感谢

+0

你确定这是一个默认实例而不是命名实例?您是否尝试通过端口1433 telnet到服务器?您是否尝试使用服务器名称或IP地址而不是过时的DSN?您如何验证端口是否打开并且服务器可以访问?什么港口?你怎么知道这是正确的端口?细节,细节,细节... – 2013-02-27 02:55:47

回答

0

您可以打开ODBC跟踪,并使用tcpdump的捕捉网络包。我认为odbc跟踪会提供帮助。

8

当使用linux和odbc连接到Microsoft SQL Server的同时使用Microsoft的linux驱动程序时,'gotcha'是服务器的odbc.ini中的字符串也必须包含端口。

Server = [protocol:]server[,port] 

http://msdn.microsoft.com/en-us/library/hh568455.aspx 这比使用port = <portnumber>约定其他大多数设置不同的约定。如果没有配置,您将看到'Could not SQLConnect'错误。

还要确保正在使用正确的odbc文件。

odbcinst -j 

将显示配置的来源及其位置。

您以后可能会遇到的另一个问题是SQL Server的驱动程序是否忽略了odbc.ini中的用户和密码信息(如果它是纯文本的),请确保您的应用程序处理该信息。

+0

如何指定命名实例? – baijum 2014-12-05 06:27:29

+0

我想抱抱你。 – Profpatsch 2016-12-07 04:49:17

+0

谢谢!这使我的一天 - 我希望你平稳 – ewm 2016-12-08 05:31:27

0

问题是我在EL5上使用EL6驱动。安装正确的版本后,一切正常。感谢大家的回应。

1

要调试的问题,请尝试以下步骤:

  1. 的telnet < 1433>
  2. 进入SQL服务器的网络配置
  3. TCP/IP设置
  4. 右键打开属性
  5. 切换到网络属性选项卡
  6. IPAll属性设置的动态端口空白和端口1433
  7. 重新启动SQL服务