1. 程式人生 > >Microsoft SQL Server on Linux 踩坑指南

Microsoft SQL Server on Linux 踩坑指南

stat 自己 blog ext4 cat 宣傳 requires 日誌 主機

微軟用 SQL Server 在 2016 年的時候搞了一個大新聞,宣傳 Microsoft ?? Linux 打得一眾軟粉措手不及。但是這還是好事情,Linux 上也有好用的 SQL Server 啦,但是從預覽版開始 SQL Server on Linux 的配置要求蜜汁高,大部分雲主機用戶都望而卻步。另外,SQL Server on Linux 對於文件系統有限制,僅支持 Ext3 以及 XFS 文件格式系統,對於某些雲服務商默認提供的雲鏡像限制 Ext3 文件格式系統的用戶而言也是足夠讓人懊惱。

本文以 CentOS 為例,如果使用的是 Ubuntu,或者 SUSE 可能在步驟上會有所不同。總的來說,建議使用 Docker 部署的方式進行部署。

踩坑前...

https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-red-hat

微軟的官方指南,按照這個流程走即可。

破解內存限制

雖然網上有文告訴如何破解預覽版 3.25G 內存限制的文章,但是很皮的是,微軟在 Update 4 後把內存限制改成了 2G,也就是,即使你按照指南操作,安裝時空閑內存不足 2000M 一樣會得到報錯消息:

sqlservr: This program requires a machine with at least 2000 megabytes of memory.

有時候我們會想,我就跑個 Express,沒錢買 Enterprise 或者 Web,Express 也就只能用 1G RAM,要那麽多來幹什麽… 其實參考文章還是有效,但是需要修改的這個常量而不是 3250000000 而是 2000000000。使用 Python:

>>> oldfile = open("sqlservr.bak", "rb").read()
>>> newfile = oldfile.replace("\x00\x94\x35\x77", "\x00\x80\x84\x1e")
>>> open("sqlservr", "wb").write(newfile)

修改後,內存限制被縮小為 512 兆字節。

但是需要註意的是,SQL Server Express 版本依然需要 650M 內存。所以如果你的機器只有 1G 或者更低,還是夠嗆。務必使用 1.5G RAM。

Ext3 文件格式系統造成不兼容

微軟在發行註記上說,僅支持 XFS 或者 Ext4 文件格式系統。現在部分雲服務商為了確保兼容性依然針對系統盤采用了 Ext3 文件格式系統(結果造成了 SQL Server 不兼容),其實稍不註意忽略這一點可以坑一整天,並且永遠都是蜜汁報錯,然後自己還渾然不覺。
破解這個限制其實只需要把 SQL Server 的數據文件放到 Ext4 文件格式系統的掛載目錄下即可。掛載上 Ext4 格式磁盤(假設目錄為 /data/),然後新建一個文件目錄(此處為 /data/sqlsrv_data/,日誌目錄為 /data/sqlsrv_data/log/)。
設置權限:

sudo chown -R mssql /data/sqlsrv_data/
sudo chown -R :mssql /data/sqlsrv_data/

如果忽略這一步,後續安裝將會失敗,並且沒有日誌文件產生。或者收到報錯信息:

ERROR: BootstrapSystemDataDirectories() failure (HRESULT 0x80070002)  
Initial setup of Microsoft SQL Server failed. Please consult the ERRORLOG  

然後設置環境變量信息:

export MSSQL_MASTER_DATA_FILE=/data/sqlsrv_data/master.mdf
export MSSQL_MASTER_LOG_FILE=/data/sqlsrv_data/mastlog.ldf
export MSSQL_ERROR_LOG_FILE=/data/sqlsrv_data/log/errorlog

註意,上述環境變量為文件位置而不是目錄,填寫目錄將會安裝失敗。

然後在 /opt/mssql/bin/ 目錄下執行:

./mssql-conf set filelocation.masterdatafile /data/sqlsrv_data/master.mdf
./mssql-conf set filelocation.masterlogfile /data/sqlsrv_data/mastlog.ldf
./mssql-conf set filelocation.errorlogfile /data/sqlsrv_data/log/errorlog

然後執行

./mssql-conf setup

片刻,執行

systemctl status mssql-server

檢查服務狀態,如果沒看到 systemd[1]: Failed to start Microsoft SQL Server Database Engine. 這類死亡警告,那麽恭喜閣下安裝成功,使用 Microsoft SQL Server Management Studio 開始愉快的 Linux × SQL Server 的 CP 體驗吧。

要是失敗了呢?

如果按照操作你都失敗了,尤其是看到

FCB::Open failed: 無法打開文件號 1 的文件 d:\dbs\sh\s17o\0209_182031\cmd\16\obj\x64retail\sql\mkmastr\databases\mkmastr.proj\MSDBData.mdf。操作系統錯誤: 2(系統找不到指定的文件。)。

報錯的話…

沒錯,是因為所給的目錄不正確或者上次安裝失敗的數據庫還在。解決方案是清空文件目錄(如果刪除了,別忘了設置權限,不然文件訪問不了)。

Microsoft SQL Server on Linux 踩坑指南