最近在CentOS8上安裝的SqlServer 2019時不時就掛掉了,重新啟動服務也無效,重啟CentOS后有效了一段時間后又無法啟動。
使用systemctl命令查詢SQL server的狀態
systemtcl status mssql-server
狀態信息:
● mssql-server.service - Microsoft SQL Server Database Engine
Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
Active: failed (Result: signal) since Tue 2020-10-27 17:26:23 CST; 8s ago
Docs: https://docs.microsoft.com/en-us/sql/linux
Process: 1863 ExecStart=/opt/mssql/bin/sqlservr (code=killed, signal=ABRT)
Main PID: 1863 (code=killed, signal=ABRT)
systemd[1]: mssql-server.service: Main process exited, code=killed, status=6/ABRT
systemd[1]: mssql-server.service: Failed with result 'signal'.
systemd[1]: mssql-server.service: Service RestartSec=100ms expired, scheduling restart.
systemd[1]: mssql-server.service: Scheduled restart job, restart counter is at 3.
systemd[1]: Stopped Microsoft SQL Server Database Engine.
systemd[1]: mssql-server.service: Start request repeated too quickly.
systemd[1]: mssql-server.service: Failed with result 'signal'.
systemd[1]: Failed to start Microsoft SQL Server Database Engine.
重新啟動服務發現有提示使用journalctl命令查看日志明細信息
Job for mssql-server.service failed because a fatal signal was delivered to the control process.
See "systemctl status mssql-server.service" and "journalctl -xe" for details.
於是使用該命令查下mssql-server服務的日志
journalctl -u mssql-server
翻到最后一頁,發現一個錯誤信息
sqlservr: Unable to read instance id from /var/opt/mssql/.system/instance_id: No such file or directory

/var/opt/mssql/.system/instance_id 無法讀取該文件,是不是權限設置不對呢,使用xshell查看下權限
發現是有讀取權限的

使用關鍵詞搜索,發現官方文檔說明:
症狀
假設你使用 NEWSEQUENTIALID () 函數為 Linux 上的 SQL Server 2017 中的表生成唯一 GUID。 重新啟動 SQL Server 后, NEWSEQUENTIALID () 函數可能會生成 guid,該 guid 是此函數生成的以前的 guid 的副本。
更多信息
Linux 上的 SQL Server 在/var/opt/mssql/.system/instance_id 中存儲順序 UUID 種子,並在啟動期間遞增它。 備份 instance_id 文件,以防系統出現故障。 如果文件丟失,則缺少種子,並且會重新生成新的種子。 初始種子生成基於隨機位模式和 UUID,以避免沖突。 但是,在種子丟失后,必須按順序排序的新種子不會按順序排列。
也就是說instance_id該文件是用來生成唯一GUID的,在網上又查到一篇文章說把instance_id文件刪除即可,先備份到本地,再刪除instance_id,然后重啟服務,發現已經啟動成功了。

刷新下/var/opt/mssql/.system/目錄,發現已經生成了一個新的instance_id文件,對比原來的文件,區別就是第一行多了一個GUID的字符串,說明報錯的無法讀取instance_id文件的意思是無法獲取該文件的GUID,刪除后會重新生成一個帶GUID的文件。

