具体的错误是:
pymssql.OperationalError: (18456,“Login Failed for user ‘xxx’.DB-Lib error message 18456,severity 14:\nGeneral sql Server
error: Check messages from the sql Server\nDB-Lib error message 20002,
severity 9:\nAdaptive Server connection Failed\n”)
我有配置为freetds设置为:
[custom_config] host = myhost port = 1433 tds version = 7.0 encryption = request dump file = /tmp/freetds.log
运行:
tsql -S custom_config -U tsmv -P xxx
收益:
locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 1>
但是,运行:
python >> import pymssql >> pymssql.connect(server='custom_config',user='user',password='xxx',database='database')
引起上述错误.
我正在使用Linux CentOS,python 2.6.6,freetds 0.92 dev(我已经尝试使用其他版本编译tdsver = 7.0).
freetds日志是:
log.c:196:Starting log file for FreeTDS 0.92 on 2012-04-12 10:39:15 with debug flags 0x4fff. iconv.c:330:tds_iconv_open(0x1391b70,ISO-8859-1) iconv.c:187:local name for ISO-8859-1 is ISO-8859-1 iconv.c:187:local name for UTF-8 is UTF-8 iconv.c:187:local name for UCS-2LE is UCS-2LE iconv.c:187:local name for UCS-2BE is UCS-2BE iconv.c:349:setting up conversions for client charset "ISO-8859-1" iconv.c:351:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion iconv.c:391:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion iconv.c:394:tds_iconv_open: done net.c:205:Connecting to xx.x.x.xxx port 1433 (TDS version 7.1) net.c:270:tds_open_socket: connect(2) returned "Operation now in progress" net.c:310:tds_open_socket() succeeded util.c:156:Changed query state from DEAD to IDLE net.c:741:Sending packet 0000 12 01 00 34 00 00 00 00-00 00 15 00 06 01 00 1b |...4.... ........| 0010 00 01 02 00 1c 00 0c 03-00 28 00 04 ff 08 00 01 |........ .(......| 0020 55 00 00 02 4d 53 53 51-4c 53 65 72 76 65 72 00 |U...MSSQ LServer.| 0030 c7 39 00 00 - |.9..| net.c:555:Received header 0000 04 01 00 25 00 00 01 00- |...%....| net.c:609:Received packet 0000 04 01 00 25 00 00 01 00-00 00 15 00 06 01 00 1b |...%.... ........| 0010 00 01 02 00 1c 00 01 03-00 1d 00 00 ff 0a 00 0f |........ ........| 0020 a0 00 00 02 00 - |.....| login.c:1057:detected flag 2 login.c:782:quietly sending TDS 7+ login packet token.c:328:tds_process_login_tokens() net.c:555:Received header 0000 04 01 00 72 00 51 01 00- |...r.Q..| net.c:609:Received packet 0000 04 01 00 72 00 51 01 00-aa 5e 00 18 48 00 00 01 |...r.Q.. .^..H...| 0010 0e 1d 00 4c 00 6f 00 67-00 69 00 6e 00 20 00 66 |...L.o.g .i.n. .f| 0020 00 61 00 69 00 6c 00 65-00 64 00 20 00 66 00 6f |.a.i.l.e .d. .f.o| 0030 00 72 00 20 00 75 00 73-00 65 00 72 00 20 00 27 |.r. .u.s .e.r. .'| 0040 00 74 00 73 00 6d 00 76-00 27 00 2e 00 0c 4d 00 |.t.s.m.v .'....M.| 0050 43 00 53 00 2d 00 44 00-41 00 54 00 41 00 42 00 |C.S.-.D. A.T.A.B.| 0060 41 00 53 00 45 00 00 01-00 fd 02 00 00 00 00 00 |A.S.E... ........| 0070 00 00 - |..| token.c:337:looking for login token,got aa(ERROR) token.c:122:tds_process_default_tokens() marker is aa(ERROR) token.c:2588:tds_process_msg() reading message 18456 from server token.c:2661:tds_process_msg() calling client msg handler dbutil.c:85:_dblib_handle_info_message(0x14e2e30,0x1391b70,0x7fff8b047e40) dbutil.c:86:msgno 18456: "Login Failed for user 'xxx'." token.c:2674:tds_process_msg() returning TDS_SUCCEED token.c:337:looking for login token,got fd(DONE) token.c:122:tds_process_default_tokens() marker is fd(DONE) token.c:2339:tds_process_end: more_results = 0 was_cancelled = 0 error = 1 done_count_valid = 0 token.c:2355:tds_process_end() state set to TDS_IDLE token.c:2370: rows_affected = 0 token.c:438:tds_process_login_tokens() returning TDS_FAIL login.c:466:login packet accepted util.c:156:Changed query state from IDLE to DEAD util.c:331:tdserror(0x14e2e30,20002,0) dblib.c:7929:dbperror(0x1383c70,0) dblib.c:7981:20002: "Adaptive Server connection Failed" dblib.c:8002:"Adaptive Server connection Failed",client returns 2 (INT_CANCEL) util.c:361:tdserror: client library returned TDS_INT_CANCEL(2) util.c:384:tdserror: returning TDS_INT_CANCEL(2) dblib.c:1443:dbclose(0x1383c70) dblib.c:258:dblib_del_connection(0x7fa462faf540,0x1391b70) mem.c:615:tds_free_all_results() dblib.c:305:dblib_release_tds_ctx(1) dblib.c:5882:dbfreebuf(0x1383c70) dblib.c:739:dbloginfree(0x1533a40)
我完全失去了为什么这不工作.任何帮助将不胜感激.
解决方法
>此邮件列表线程(http://lists.ibiblio.org/pipermail/freetds/2010q3/026060.html)表示使用不正确的TDS协议导致“Adaptive Server连接失败”消息.在咀嚼面包的日志中似乎不是这样,但也可能帮助别人.
>这个FAQ给出了很多步骤:
https://github.com/pymssql/pymssql/blob/87f4383ec153962b7ca7e63a05042d3f09005178/docs/faq.rst,
一个是尝试通过tsql -H来测试tds连接,它绕过conf并读取传入的值.鉴于上述conf可以同时支持端口和协议版本,可能需要检查与tsql -C一起查看是否需要进行调整.
>另外,在常见问题的底部,它指出
real “Login incorrect” messages has code=18456 and severity=14
那是正在发送的错误消息,所以也许尝试登录审核(http://msdn.microsoft.com/en-us/library/ms175850.aspx)看看pymssql是否正确传递你的凭据.
>同一节讲述了不同的字符集搞砸了mssql.connect,所以也许尝试一个基本的密码(即ASCII 65-90),以确保在翻译中没有任何东西丢失.看起来Aki与日本人合作,也许这也是一个原因.