1. 程式人生 > >SQL Server On Linux(4)——Linux 初步配置(1)

SQL Server On Linux(4)——Linux 初步配置(1)

接上文:SQL Server On Linux(3)——SQL Server 2019 For Linux 下載並部署示例資料庫

本文聊一下Linux,因為這個系列是Linux上的SQL Server,所以我們有必要初步瞭解一下這個基石,地基不穩那麼上面搭建的東西也必然搖搖晃晃。

  Linux的研究是一個比SQL Server還要大的課題,由於作業系統不僅搭載了資料庫,還作為其他配置服務的載體而執行著,所以專業的Linux內容是無法在一文中介紹清楚。本文把關注點集中在與SQL Server相關的部分。
  縱觀身邊的朋友所在企業使用的Linux版本,通常都是CentOS和Ubuntu ,其中CentOS居多。一些第三方軟體會要求使用Red Hat,所以Linux版本的選擇其實就沒那麼多了。從個人學習過程來看,如果可以選擇的話,我會選擇Ubuntu,很多地方確實比CentOS便利,但是這個選型並不是個人能夠左右的。因此版本就不多說了。本系列還是使用CentOS 7來做演示。
  與Windows有所不同的是,Linux只是一個“核心”,在正式使用之前需要做大量的配置操作,而且在後期,配置的變更也是有可能的,那麼對Linux的配置需要做些什麼?如果沒頭緒的話,我建議先從官方配置中著手。但是這裡僅僅是初步配置,因為後續配置涉及效能優化和運維工作,到時再說。這裡的目的是讓SQL Server能夠穩定地在Linux機器上執行。

題外話,除了各種技術因素之外,作者這10年經歷中,越來越感受到各種規範化的重要性,所以如果可能,建議先從統一化、規範化著手。

當前環境

  在開始之前我們先來了解一下預設情況下SQL Server所使用到的檔案目錄,這個時候對於初學者而言比較合適的辦法是通過SSMS工具來檢視。用SSMS開啟伺服器屬性,首先關注的是當前記憶體,本機是3025MB,稍後會演示如何擴充。

在這裡插入圖片描述

  上面的圖可以理解為“伺服器記憶體”,而下面的圖可以理解為“SQL Server 記憶體”,如果沒配置,預設的【最大伺服器記憶體(MB)】值為2147483647(即2TB),所以通常看到這個值意味著最大記憶體沒有配置。

在這裡插入圖片描述

  再看一下下圖,可以看到SQL Server的資料、日誌及備份的初始化路徑都在/var/opt/mssql/data下,在大部分情況下並不需要進行改動,但是在實際環境中,建議使用專用目錄,同時這個目錄是由專用裝置(如SSD、RAID等)掛載出來的。

在這裡插入圖片描述

  如果要知道SQL Server中新資料庫的預設位置,那就要看系統庫model中的配置,因為新資料庫除非手工指定,否則都按model庫的配置來建立。model庫的預設位置如下圖:

在這裡插入圖片描述

  修改這些配置,一般有3個工具可以使用:第一個是mssql-conf,它類似於Windows平臺的配置管理器,但是是命令列形式。第二個是環境變數。第三個就是我們熟悉的客戶端管理工具如SSMS。接下來先演示mssql-conf。

使用mssql-conf修改

環境準備

  看到這裡我們就嘗試第一個配置——修改目錄。假設我們已經掛載了一個目錄,在/root下的/data(為了模擬,這裡用mkdir來建立),建立之後,先檢查一下許可權,那到底檢查什麼許可權?在SQL Server On Linux(1)——CentOS 7 安裝SQL Server2019中的【資訊總結】部分提到過,預設SQL Server On Linux的服務賬號是一個叫mssql的賬號,所以為了讓SQL Server能使用這個新建的目錄,要檢查mssql賬號及其組對/data的許可權。

在這裡插入圖片描述

  首先看一下/data的當前許可權情況:# ls -l /,可以看到/data這個目錄由root建立,屬於root使用者和root組。下面把它修改成mssql。(其實可以授權給mssql使其可讀可寫可執行即可)

在這裡插入圖片描述

  這裡使用# chown mssql:mssql -R /data同時修改使用者及其組。然後再使用# ls -l /檢視,下圖顯示已經更改成功:

在這裡插入圖片描述

修改預設檔案目錄

  下面演示修改預設的資料檔案路徑,對於日誌和備份目錄是相類似的,就不累贅了。在前面的SSMS截圖中可以看到是顯灰的,意味著不能使用SSMS直接修改,這一點跟Windows平臺的不同,所以在Linux平臺上,需要使用Linux的指令來實現。藉助SQL Server On Linux的mssql-conf命令,設定filelocation.defaultdatadir(日誌檔案是filelocation.defaultlogdir):

sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /data

  成功之後會出現下圖所示,並提醒你重啟服務:
在這裡插入圖片描述

  再次開啟SSMS檢視,可以發現已經修改成功:
在這裡插入圖片描述

  接下來我們開始修改記憶體,首先把伺服器的記憶體加大,因為一開始我們只使用了3GB的記憶體。作者的是虛擬機器,擴容很容易。這裡作者把記憶體擴大到20G,以備後續其他演示之用。

修改SQL Server 記憶體

  從上面第一個圖可以看到記憶體是3025MB,在虛擬機器已經擴容20G並啟動之後,下面再次檢查一下當前伺服器記憶體:
在這裡插入圖片描述

  再次通過SSMS檢視,顯示15927MB,這個值怎麼來的?19908(上圖的值)*80%≈15926.4。所以,SQL Server這裡顯示的作業系統記憶體是實體記憶體的80%。這個行為由memory.memorylimitmb控制。其目的是限制SQL Server“可見”的記憶體,保留20%給作業系統,由於Linux對記憶體傾向於申請多少給多少,到達極限且沒有設定swap時會kill掉最大記憶體消耗(也就是常說的out of memory,OOM)從而影響服務的執行,為了避免SQL Server在執行時把記憶體耗盡被Linux選擇性kill掉。因此微軟對SQL Server設定了80%的可用記憶體的預設值,大部分情況下這個值是合理的,但是對於超大記憶體的伺服器比如1TB,那麼20%也就是200G的空閒顯然是很浪費,所以可以用memory.memorylimitmb來調整實際記憶體使用。

在這裡插入圖片描述

  在Linux上,暫時沒有建議值可參考,這裡只演示如何修改,具體修改值根據實際環境而定,暫時建議對128G左右的伺服器(這個比較常見)預留10G左右的記憶體給作業系統。
  這裡同樣使用mssql-conf工具來修改,比如我想把它改成10GB(10240MB),可以使用以下命令:

sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 10240

  然後重啟服務sudo systemctl restart mssql-server,再次檢查可以看到已經修改成功:

在這裡插入圖片描述

  接下來,我們來看看tcp埠。

修改TCP埠

  眾所周知,SQL Server使用的是1433埠,也恰恰由於眾所周知,所以當需要攻擊SQL Server時,首先會檢查1433埠,那麼除了使用一些網路技術來防禦之外,有必要對生產環境的埠進行修改,使其“不預設”。首先檢查一下當前埠情況,在以前的版本中,netstat足矣,但是作者發現在CentOS 7上卻發現不了這個命令,雖然網上說可以自行安裝,但是秉著與時俱進的想法(也因為SQL Server On Linux的Linux版本要求),我選擇使用新版帶來的新工具,ss指令。作者使用下面指令獲取埠情況,後面的管道“|”和column -t選項是為了格式化,否則會很難看清。讀者可以自行嘗試:

# ss -antp|column -t

在這裡插入圖片描述

  1. ESTAB:establish的意思,建立連線,正在通訊。
  2. LISTEN:listening,正在偵聽,但是沒被連線,就像房門開了但是沒人進來。
  3. TIME_WAIT:結束本次連線,也就是曾經被訪問過但是結束了。

  我們在連線時使用1433埠也是可以的:

在這裡插入圖片描述

  下面開始來修改埠,埠控制由network.tcpport來實現,同樣使用mssql-conf來修改,假設我們改成10240:

sudo /opt/mssql/bin/mssql-conf set network.tcpport 10240

  修改後同樣需要重啟SQL Server服務,命令參照上面修改記憶體部分。接下來測試一下1433和不加埠(預設就是1433)是否能連線成功,從下面兩圖可以看到是不可以的,證明修改成功:
在這裡插入圖片描述

在這裡插入圖片描述

  然後我們檢視一下埠情況,1433也已經消失,證明這個埠沒有對外服務:

在這裡插入圖片描述

  那是不是就可以用10240來連線了?從下圖結果可以得知還是不行:

在這裡插入圖片描述

  是不是意味著修改失敗?不是,修改是成功的,但是別忘了防火牆!用# firewall-cmd --list-ports來檢視防火牆中配置的埠,可以看到只有1433這一個:

在這裡插入圖片描述

  那麼我們就需要對10240放行,使用下面命令:

#放行10240埠,注意這裡的#是註釋,如果#後有空格則是意味著以root身份執行
firewall-cmd --zone=public --add-port=10240/tcp --permanent
#重啟防火牆
firewall-cmd --reload
#再次檢查
firewall-cmd --list-ports

  可以看到10240已經加入防火牆白名單。

在這裡插入圖片描述

  現在可以在SSMS中測試連線,下圖表示連線成功:

在這裡插入圖片描述

  再次檢查埠情況可以看到已經建立連線:

在這裡插入圖片描述

  至此為止修改埠已經成功,但是這個對常規使用來說確實有點麻煩。

檢視和恢復設定

  如果某些原因需要恢復原始設定,可以使用下面命令實現,但是目前只能一個一個恢復,所以在修改之前需要清楚地列出修改項及修改前的值。修改後同樣需要重啟服務。

#恢復networt.tcpport的值
sudo /opt/mssql/bin/mssql-conf unset network.tcpport

  很多時候我們需要檢視設定,那麼直接檢視/var/opt/mssql/mssql.conf檔案即可。如果在這個檔案中沒有發現的值,意味著就是預設值,換句話說,這個檔案中的值就是有可能改動過的(但是並非全部)。比如本機:
在這裡插入圖片描述

  由於Linux平臺沒有圖形化的配置管理器,所以在Linux上配置SQL Server通常需要命令列方式,配置SQL Server On Linux的方法有幾種,除了在資料庫內部和上面提到的mssql-conf工具之外,某些配置需要使用環境變數來實現或者配合。接下來演示部分可能平時會用到的配置。但是要注意很多環境變數的配置可以用前面的方式來實現,比如TCP埠、檔案預設目錄、記憶體限制等。

使用環境變數配置

  下面演示一下使用環境變數配置前面沒有演示的內容,包括SA密碼修改、啟用SQL Agent。前面使用mssql-conf是使用“set”關鍵字,而環境變數則使用mssql-conf工具的setup關鍵字。接下來我們開始演示。

SA密碼修改:

  sa作為SQL Server內部最高許可權的登入名,作為DBA必須要掌控同時減少可使用該賬號的使用者數。雖然通過SSMS可以修改,但是萬一沒有人記住sa的密碼且環境只有這個賬號可以使用,那麼就只能通過外部手段(從OS層)實現。在Windows環境下,通常本機管理員賬號(Administrator)已經加入進去,但是在Linux平臺則不一定奏效,除非你使用了後續會介紹的整合身份驗證,否則只能從Linux層修改SA賬號,修改如下。
  但是如果你直接執行下面命令,會看到一個報錯:

sudo ACCEPT_EULA='Y' MSSQL_SA_PASSWORD='wBbSr6UbsL'  /opt/mssql/bin/mssql-conf setup

在這裡插入圖片描述

  需要你停止服務。這就是其中一個環境變數跟mssql-conf使用set來配置的不同之處。我們先停止服務,然後修改。停止後重新執行會提示你選擇版本,不管是否加“ACCEPT_EULA=‘Y’”都會提示。這裡選擇1,接下來就是提醒選擇語言。完成之後,會看到下圖,同時注意SQL Server已經自己啟動了:
在這裡插入圖片描述

  讀者可以自行嘗試,sa密碼修改成功,這一步其實類似“重置密碼”。鑑於上面的操作會有使用者互動的情況,所以建議修改時直接使用下面命令,注意替換密碼:

sudo ACCEPT_EULA='Y' MSSQL_PID='Evaluation' MSSQL_LCID=1036 MSSQL_SA_PASSWORD='強密碼'  /opt/mssql/bin/mssql-conf setup

啟用SQL Agent

  不管是Linux還是Windows平臺,如果沒有在安裝過程手動選擇啟動的話,SQL Agent是預設不啟動的,在生產環境下,基本上不存在不使用SQL Agent的情況,因此我們需要把它啟用。

在這裡插入圖片描述

  另外讀者可以看到右鍵是沒有啟用SQL Agent的功能,所以在Linux上的SQL Server,目前只能通過mssql-conf來啟用。

在這裡插入圖片描述

  跟SA不同,這裡不需要停止服務,但是操作後需要重啟SQL Server

sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true 
sudo systemctl restart mssql-server

在這裡插入圖片描述

  重新整理一下SSMS,可以看到SQL Agent已經啟動:

在這裡插入圖片描述

環境變數和mssql-conf

  關於這個問題,並沒有官方或者其他資料說明,個人從字裡行間的理解認為,對於“初始化配置”,優先選擇環境變數。在執行過程中的一些變更,則使用mssql-conf工具。其實mssql-conf工具是呼叫/opt/mssql/lib/mssql-conf下的多個python檔案,但是看原始碼略微麻煩。暫時先放一下。待以後有精力的時候再細看。
  另外從上面的操作工作量來看環境變數一般略多於mssql-conf,因此它更適合做“初始化”。

在這裡插入圖片描述

  本文篇幅已經比較多了,就不再演示,在需要用到的時候再使用。在下一篇繼續介紹Linux上的配置。

總結

  本文演示瞭如何使用環境變數和mssql-conf工具進行Linux上的配置以滿足SQL Server的合理執行。但是實際上還有很多配置還沒講到,特別是Linux本身的配置。在下一文將進行講述。

命令總結

檔案及檔案目錄操作

#建立目錄
mkdir 
#檢視目錄許可權
ls -l
#授權
chown [owner]:[group] -R /檔案

網路

#檢視埠
ss -antp|column -t
#檢視防火牆配置的埠
firewall-cmd --list-ports
#防火牆放行埠
firewall-cmd --zone=public -add-port=埠號/tcp --permanent
firewall-cmd --reload

資訊總結

  1. SQL Server配置資訊:/var/opt/mssql/mssql.conf
  2. mssql-conf 執行檔案:/opt/mssql/bin/mssql-conf