簡體   English   中英

Golang 連接到 SQL Server 錯誤-“TLS 握手失敗:無法讀取握手數據包:EOF”

[英]Golang connection to SQL Server error - "TLS Handshake failed: Cannot read handshake packet: EOF"

我編寫了一個系統,可以自動執行在 Microsoft Azure 上部署 VM 的過程,在其上安裝 Sql Server,然后針對新安裝的服務器執行.sql腳本以初始化環境。 周五,這一切都按預期進行。 今天,我收到了這個錯誤。

我的代碼具有以下相關導入:

import(
    "database/sql"
    _ "github.com/denisenkom/go-mssqldb"
)

並使用以下代碼在安裝后實際連接到數據庫(為簡潔起見,刪除了錯誤處理):

// variables
connectionString := "sqlserver://MasterUser:MasterPassword@xx.xx.xx.xxx:1433"
dbName := "mssql"
dbFile := "mssql.sql"
// open database / get metadata sorted
db, err := sql.Open(dbname, connectionString)
defer db.Close()
//Check to see if the connection is successful. 
err = db.Ping()                                         // <--------
// file input
fileBytes, err := ioutil.ReadFile("../sql/" + dbsql)
fileReader := bytes.NewReader(fileBytes)
// parse line-by-line
scanner := bufio.NewScanner(fileReader)
lineNo := 0
for scanner.Scan() {
    toExec := scanner.Text()
    lineNo += 1
    _, err = db.Exec(toExec)                           // <--------
}

該錯誤發生在db.Ping()和每個db.Exec() 在這些情況下,與err關聯的消息是

TLS Handshake failed: Cannot read handshake packet: EOF

至於服務器本身,我使用以下腳本通過 SSH 安裝它:

# install mssql server
sudo wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2017.list)"
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get -y update
sudo apt-get -y install mssql-server
# configure MSSQL
sudo /opt/mssql/bin/mssql-conf setup
# install local tools
sudo ACCEPT_EULA=y apt-get -y install mssql-tools
# do basic initialization in advance of .sql script
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ${MasterPassword} -Q "CREATE LOGIN ${MasterUser} WITH PASSWORD = '${MasterPassword}';"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ${MasterPassword} -Q "CREATE USER ${MasterUser} FOR LOGIN ${MasterUser};"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ${MasterPassword} -Q "ALTER SERVER ROLE sysadmin ADD MEMBER ${MasterUser};"

否則這似乎工作正常 - 我通過 SSH 手動連接到實例沒有問題,並且該腳本退出時沒有錯誤。 我不確定它的相關性。


我自己嘗試通過 SSH 連接到服務器並在本地打開 sql server 控制台,結果出現以下錯誤消息:

$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P *********
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.

這可能是相關的,但我不知道如何。


這是什么原因造成的,我該如何解決? 錯誤是在我的代碼中,還是在我創建的充當服務器的 VM 上,還是介於兩者之間? 我將如何最好地解決問題?

我最終在沒有確定根本原因的情況下解決了這個問題。 一旦我嘗試通過 SSH 連接到 VM 並在本地訪問數據庫,我遇到了以下錯誤:

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.

跟進這些讓我找到了這個 GitHub 問題,它為我的問題提供了解決方案。 它看起來是一個版本問題 - 在我的安裝腳本中,我替換了

sudo apt-get -y install mssql-server

sudo apt-get -y install mssql-server=14.0.3192.2-2

問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM