針對 Linux 上的 SQL Server 進行疑難排解

適用於:SQL Server - Linux

本文說明如何對在 Linux 上或 Linux 容器中執行的 SQL Server 進行疑難排解。 針對 Linux 上的 SQL Server 進行疑難排解時,請記得檢閱 Linux 上 SQL Server 2017 的版本資訊中支援的功能和已知限制。

如需常見問題的解答,請參閱 Linux 上的 SQL Server 常見問題集

針對連接失敗進行疑難排解

如果無法連線至 Linux SQL Server 執行個體,您必須確認若干事項。

  • 如果您無法使用 localhost 進行本機連線,請嘗試改用 IP 位址 127.0.0.1。 有可能是 localhost 未正確對應至此位址。

  • 確認可從您的用戶端機器連線到該伺服器名稱或 IP 位址。

    提示

    若要尋找您 Ubuntu 機器的 IP 位址,您可以執行 ifconfig 命令,如下列範例所示:

    sudo ifconfig eth0 | grep 'inet addr'
    

    針對 Red Hat,您可以使用 ip addr 命令,如下列範例所示:

    sudo ip addr show eth0 | grep "inet"
    

    此技術的其中一個例外與 Azure VM 相關。 針對 Azure VM,請在 Azure 入口網站中尋找 VM 的公用 IP

  • 如果適用,請確認您已在防火牆上開啟 SQL Server 連接埠 (預設值為 1433)。

  • 針對 Azure VM,請確認您有適用於預設 SQL Server 連接埠的網路安全性群組規則

  • 確認使用者名稱和密碼未包含任何錯字、多餘空格,或不正確的大小寫。

  • 嘗試搭配伺服器名稱明確設定通訊協定和連接埠號碼,如以下範例所示:tcp:servername,1433

  • 網路連線問題也可能造成連線錯誤和逾時。 確認您的連線資訊和網路連線能力之後,請重新嘗試連線。

管理 SQL Server 服務

下一節將說明如何管理 SQL Server Docker 容器的執行。 若要管理 Linux 的服務,請參閱在 Linux 上啟動、停止和重新啟動 SQL Server 服務

管理 SQL Server Docker 容器的執行

您可以執行下列命令來取得最新建立之 SQL Server Docker容器的狀態和容器識別碼 (識別碼位於 CONTAINER ID 資料行底下):

sudo docker ps -l

您可以使用下列命令來停止或重新啟動 SQL Server 服務:

sudo docker stop <container ID>
sudo docker restart <container ID>

提示

如需更多 Docker 疑難排解秘訣,請參閱針對 SQL Server Docker 容器進行疑難排解

存取記錄檔

SQL Server 資料庫引擎會記錄到 Linux 和容器安裝的 /var/opt/mssql/log/errorlog 檔案中。 您必須在超級使用者模式下,才能瀏覽此目錄。

安裝程式會記錄到這裡:/var/opt/mssql/setup-<time stamp representing time of install>。您可以使用任何 UTF-16 相容工具 (例如 vimcat) 來瀏覽錯誤記錄檔,如下所示:

sudo cat errorlog

如果您想要的話,也可以使用下列命令將檔案轉換成 UTF-8,以或地讀取這些檔案:

sudo iconv -f UTF-16LE -t UTF-8 <errorlog> -o <output errorlog file>

擴充事件

透過 SQL 命令可以查詢擴充事件。 如需詳細資訊,請參閱擴充事件

損毀傾印

在 Linux 的記錄檔目錄中尋找傾印。 檢查 /var/opt/mssql/log 目錄底下是否有 Linux 核心傾印 (.tar.gz2 副檔名) 或 SQL 小型傾印 (.mdmp 副檔名)。

例如,若要檢視核心傾印:

sudo ls /var/opt/mssql/log | grep .tar.gz2

針對 SQL 傾印,請使用此指令碼:

sudo ls /var/opt/mssql/log | grep .mdmp

以最低設定或單一使用者模式啟動 SQL Server

以最低設定模式啟動 SQL Server

如果設定值的設定 (如過度分配記憶體) 造成伺服器無法啟動,此模式將有其效用。

sudo -u mssql /opt/mssql/bin/sqlservr -f

以單一使用者模式啟動 SQL Server

有時,您可能需要使用啟動選項 -m,以單一使用者模式啟動 SQL Server 的執行個體。 如需詳細資訊,請參閱啟動參數。 例如,您可能想要變更伺服器設定選項,或是復原損毀的 master 資料庫或其他系統資料庫。

例如,使用下列指令碼以單一使用者模式啟動 SQL Server:

sudo -u mssql /opt/mssql/bin/sqlservr -m

此指令碼會使用 sqlcmd 以單一使用者模式啟動 SQL Server:

sudo -u mssql /opt/mssql/bin/sqlservr -m sqlcmd

您應一律使用 mssql 使用者身分啟動 Linux 上的 SQL Server,以免未來發生啟動問題。 例如:sudo -u mssql /opt/mssql/bin/sqlservr [STARTUP OPTIONS]

如果您不慎以另一個使用者啟動了 SQL Server,就必須先將 SQL Server 資料庫檔案的擁有權變更回 mssql 使用者,再使用 systemd 來啟動 SQL Server。 例如,若要將 /var/opt/mssql 底下所有資料庫檔案的擁有權變更為 mssql 使用者,請執行下列命令:

chown -R mssql:mssql /var/opt/mssql/

重建系統資料庫

作為最後的手段,您可以選擇將 mastermodel 資料庫重建為預設版本。

警告

此程序具高風險,因為您可以「刪除您已設定的所有 SQL Server 系統資料」,包括使用者資料庫的相關資訊 (但不包括使用者資料庫本身)。

之後,您必須將使用者資料庫連結至執行個體。 此外也會刪除儲存在系統資料庫中的其他資訊,包括:

  • 資料庫主要金鑰資訊
  • master 中載入的任何憑證
  • SA 登入的密碼
  • msdb 中與作業有關的資訊
  • msdb 中的 Database Mail 資訊
  • sp_configure 選項

除非您的憑證和私密金鑰也已備份,否則您將無法重新連結使用透明資料加密 (TDE) 進行加密的任何使用者資料庫。

使用這些步驟前,請務必先了解其後果。

  1. 停止 SQL Server 資料庫引擎

    sudo systemctl stop mssql-server
    
  2. 使用 force-setup 參數執行 sqlservr

    sudo -u mssql /opt/mssql/bin/sqlservr --force-setup
    

    您應一律使用 mssql 使用者身分啟動 Linux 上的 SQL Server,以免未來發生啟動問題。

  3. 在看到「復原已完成」訊息後,按 Ctrl+C。 這會關閉 SQL Server。

  4. 重新設定 SA 密碼。

    sudo /opt/mssql/bin/mssql-conf set-sa-password
    
  5. 啟動 SQL Server,並重新設定伺服器,包括還原或重新連結任何使用者資料庫。

    sudo systemctl start mssql-server
    

改善效能

許多因素都會影響效能,包括資料庫設計、硬體和工作負載需求。 如果您想要改善效能,請先檢閱 Linux 上 SQL Server 的效能最佳做法和設定方針一文中的最佳做法。 然後探索一些可用來針對效能問題進行疑難排解的工具。

常見問題

  1. 您無法連線至遠端 SQL Server 執行個體。

    請參閱連線到 Linux 上的 SQL Server一文的疑難排解小節。

  2. 您遇到錯誤訊息:ERROR: Hostname must be 15 characters or less.

    這是一個已知問題,每當嘗試安裝 SQL Server 套件的機器名稱長度超過 15 個字元時,就會發生。 目前除了變更機器名稱之外,沒有任何因應措施。 您可以藉由編輯 /etc/hostname/etc/hosts、變更主機名、儲存每個檔案,以及重新啟動電腦來執行此動作。

  3. 系統管理 (SA) 密碼必須重設,SQL Server 服務將因而暫時停止。

    如果您忘記系統管理員 (SA) 密碼,或因其他緣故必須重設密碼,請依照下列步驟操作。

    登入主機終端機,執行下列命令,然後依照提示來重設 SA 密碼:

    sudo systemctl stop mssql-server
    sudo /opt/mssql/bin/mssql-conf setup
    
  4. 登入密碼中的特殊字元會導致錯誤或登入失敗。

    如果您在 SQL Server 登入密碼中使用某些字元,則在 Linux 命令列中使用這些字元時,可能需要以反斜線將其逸出。 例如,每當您在終端機命令/殼層指令碼中使用貨幣符號 ($) 時,都必須將其逸出:

    無法運作:

    sudo sqlcmd -S myserver -U sa -P Test$$
    

    有效:

    sqlcmd -S myserver -U sa -P Test\$\$
    

取得協助

參與編輯 SQL 文件

您知道您可以自行編輯 SQL 內容嗎? 這樣做不僅可以協助改善文件,也能名列該頁面的參與者。

如需詳細資訊,請參閱如何參與 SQL Server 文件