1. 程式人生 > 實用技巧 >linux 下 docker 版的 sqlserver 執行報錯:This program requires a machine with at least 2000 megabytes of memory.

linux 下 docker 版的 sqlserver 執行報錯:This program requires a machine with at least 2000 megabytes of memory.

可能為了保證資料庫執行穩定,sqlserver 限制了執行機器的最小記憶體,網上有相關的文章提到可以修改此限制,但是也要根據實際情況來決定是否真的要在小記憶體伺服器中跑哦~

參考:https://blog.csdn.net/weixin_42183854/article/details/105173806

https://www.cnblogs.com/johnwii/p/8525490.html

https://www.cnblogs.com/zkweb/archive/2016/12/06/6136826.html

大致流程:

1、需要一臺記憶體夠的伺服器來執行相同版本的 sqlserver 以提取容器內檔案;

2、找到:/opt/mssql/bin/

sqlservr 檔案(大概兩兆多)並複製出來;

3、找一個 python 環境,linux、windows 都可以(原諒我不會修改,只能照搬網上的方法);

4、大概執行以下三句(python 3.x 不知道哪個版本開始,replace 方法的引數需要加一個 b 來轉換字串):

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

這裡是替換原有數值 2000000000 為數值 512000000(十六進位制,低位在左,轉換的時候需要倒過來),舊的版本可能是需要替換 3250000000。

判斷是哪個數值可以通過查詢(其實錯誤提示都已經告訴了,直接轉換過來找就好了),如果返回 –1 則沒有結果,正整數是找到的地址(應該):

>>> oldfile.find("\x00\x94\x35\x77")

5、因為 sqlserver 的包太大了,重新打包回去很難受,因為 docker 可以對映檔案,所以在執行的時候將修改後的檔案對映到容器就可以了

sudo docker run -d \
-v /home/sqlservr_low_limit:/opt/mssql/bin/sqlservr \
-e 'ACCEPT_EULA=Y' \ -e 'SA_PASSWORD=123456' \ -e 'MSSQL_PID=Express' \ -e 'MSSQL_LCID=2052' \ -e TZ='Asia/Shanghai' \ -p 1433:1433 \ --name mssqlserver mcr.microsoft.com/mssql/server