SQL Server On Linux:基於實際專案案例,總結功能支援情況及相關問題解決方案
上個月,有個朋友問我說Sql Sever向Mysql遷移有什麼好的經驗分享,他們公司客戶明確提出不再提供Windows伺服器,現在計劃Mysql遷移。我說Mysql遷移成本太高了,不妨可以瞭解一下SQL Server On Linux再做決定。於是,我把之前給運維分享的Word文件發給了他,告訴他,如果可以接受一些不支援的功能,選擇成本,風險小的,如果專案中用到的技術知識剛好避開了那些不支援的功能,3~5個小時可以完成一個專案的遷移。我們公司也有案例,在Linux平臺上,同時安裝了Sqlserver2017和Mysql,舊功能升級Sql Server,新功能用Mysql。
上週他很高興的告訴我,他們公司最終選擇了SQL Server On Linux,已經完成了一個大專案的升級了,目前使用穩定,專案在正常執行中,他說他今年升職加薪有戲了。後來瞭解到,他們選擇Mysql遷移,是因為他們不知道Sqlserver2017及以上版本也是支援Linxu平臺的,於是強烈建議我把內容分享到部落格園,讓一些人少走一些彎路。
背景
在過去的20多年中,微軟的各大產品靠Windows繫結市場,眾多的微軟ISV圍繞著Windows開發系列產品,形成一個以Windows為核心的生態系統。隨著網際網路的發展,出現了Google,Facebook,Tencent,Baidu,Alibaba 都是以Linux 作業系統構建的產品生態系統,他們不再是具體的產品,而是提供服務,而且服務所用技術都是開源的,和原來Windows的生態不是同一個維度的世界,微軟封閉的生態系統只有慢慢的瓦解。微軟也意識到問題的嚴重性,換了那個稱Linux為毒瘤的CEO史蒂夫·鮑爾默,用領導微軟雲的薩提亞·納德拉來帶領微軟走出原來封閉的生態系統,走入開放的雲生態系統。
a) 雲端計算機會比 Windows 大,Windows佔微軟的營收越來越少。
b) 伺服器版作業系統市場份額基本是Linux穩佔第一把交椅,微軟要讓自家的資料庫市場份額擴大來擠佔其他資料庫的份額,必然要做出SQL Server on Linux的決定。
支援的平臺
SQL Server 在 Red Hat Enterprise Linux (RHEL)、SUSE Linux Enterprise Server (SLES) 和 Ubuntu 上受支援。 此外,它也可作為 Docker 映像提供,可在 Linux 上的 Docker 引擎或用於 Windows/Mac 的 Docker 上執行。
平臺 |
支援的版本 |
Red Hat Enterprise Linux |
7.3、7.4、7.5、7.6、8 |
SUSE Linux Enterprise Server |
v12 SP2 |
Ubuntu |
16.04、18.04 |
Docker 引擎 |
1.8+ |
You need to have at least Ubuntu 16.04 or you will face unmet dependencies problems.
系統要求
SQL Server 對 Linux 具有以下系統要求:
記憶體: |
2 GB |
檔案系統: |
XFS 或 EXT4(其他檔案系統均不受支援,如 BTRFS) |
磁碟空間: |
6 GB |
處理器速度: |
2 GHz |
處理器核心數: |
2 個核心 |
處理器型別: |
僅相容 x64 |
版本選擇
SQL Server版本 |
描述 |
企業 |
SQL Server Enterprise Edition是高階產品,可提供全面的高階資料中心功能,並具有超快的效能,可為任務關鍵型工作負載提供高服務水平。可用性組支援總副本(一個主副本,八個輔助副本) |
標準 |
SQL Server Standard Edition為部門和小型組織提供了執行其應用程式的基本資料管理,並支援用於內部部署和雲的通用開發工具-以最少的IT資源實現有效的資料庫管理。 |
網頁 |
SQL Server Web版是Web託管者和Web VAP的總擁有成本低的選項,可為小型到大型Web屬性提供可伸縮性,可負擔性和可管理性。 |
開發者 |
SQL Server Developer版本使開發人員可以在SQL Server之上構建任何型別的應用程式。它包含企業版的所有功能,但已獲許可用作開發和測試系統,而不用作生產伺服器。SQL Server Developer是構建和測試應用程式的人們的理想選擇。 |
速成版 |
Express Edition是入門級的免費資料庫,非常適合學習和構建臺式機和小型伺服器資料驅動的應用程式。對於構建客戶端應用程式的獨立軟體供應商,開發人員和愛好者來說,這是最佳選擇。如果需要更高階的資料庫功能,則可以將SQL Server Express無縫升級到SQL Server的其他更高階版本。 |
Choose an edition of SQL Server: 1. Evaluation (free, no production use rights, 180-day limit) 2. Developer (free, no production use rights) 3. Express (free) 4. Web (PAID) 5. Standard (PAID) 6. Enterprise (PAID) 7. Enterprise Core (PAID) 8. I bought a license through a retail sales channel and have a product key to enter.
離線安裝(推薦使用)
下面安裝以Red Hat為例。
Wget安裝
yum -y install wget
已經安裝了就跳過此步。
安裝mssql-server
如果 Linux 計算機無法訪問聯機儲存庫,則可以直接下載包檔案。 這些包位於 Microsoft 儲存庫中,地址為
a) 建立目錄下載RPM包
mkdir -p /opt/sqlserver2017 cd /opt/sqlserver2017/ wget https://packages.microsoft.com/rhel/7/mssql-server-2017/mssql-server-14.0.3048.4-1.x86_64.rpm
b) Yum安裝mssql-server
yum localinstall mssql-server-14.0.3048.4-1.x86_64.rpm
配置
/opt/mssql/bin/mssql-conf setup
執行 mssql-conf setup,按照提示設定 SA 密碼並選擇版本。
- 請確保為 SA 帳戶指定強密碼(最少 8 個字元,包括大寫和小寫字母、十進位制數字和/或非字母數字符號)。
- Developer (free, no production use rights)(版本選擇2,Developer)
驗證服務
systemctl status mssql-server
服務啟停
systemctl stop mssql-server systemctl start mssql-server systemctl restart mssql-server
安裝 sqlcmd 和 bcp SQL Server 命令列工具
a) 下載
wget https://packages.microsoft.com/rhel/7.3/prod/msodbcsql-13.1.6.0-1.x86_64.rpm wget https://packages.microsoft.com/rhel/7.3/prod/mssql-tools-14.0.5.0-1.x86_64.rpm
b) 安裝
yum localinstall msodbcsql-13.1.6.0-1.x86_64.rpm yum localinstall mssql-tools-14.0.5.0-1.x86_64.rpm
新增環境變數
為方便起見,向 PATH 環境變數新增 /opt/mssql-tools/bin/
。 這樣可以在不指定完整路徑的情況下執行這些工具。
執行以下命令以修改登入會話和互動式/非登入會話的路徑:
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc
設定遠端連線,開啟埠
預設的 SQL Server 埠為 TCP 1433。 如果為防火牆使用的是 FirewallD,則可以使用以下命令:
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent sudo firewall-cmd --reload
使用 SQL Server 名稱 (-S),使用者名稱 (-U) 和密碼 (-P) 的引數執行 sqlcmd 。 使用者名稱為 SA
,密碼是在安裝過程中為 SA 帳戶提供的密碼。
sqlcmd -S localhost -U SA -P '<YourPassword>' sqlcmd -S 192.168.1.XXX -U userName
接著輸入密碼:
SELECT Name FROM Master..SysDatabases ORDER BY Name SELECT Name FROM Sys.Databases ORDER BY Name go
此時可以用Navicat或者SqlServer2017驗證連線情況。
安裝設定Agent(SQL Server代理)
SQL Server Agent 也叫SQL Server代理,以前稱為SQL執行者,這是SQL Server的任務日程表。
這種服務主要是用於在設定的時間備份、複製資料,以及在自動執行排程表上設定的其他專案。啟動這個服務後,設定好在什麼時候做什麼事,這個服務會讓它自動執行,不需要人工干預。
a) 下載
wget https://packages.microsoft.com/rhel/7/mssql-server-2017/mssql-server-agent-14.0.3015.40-1.x86_64.rpm
b) 安裝
yum localinstall mssql-server-agent-14.0.3015.40-1.x86_64.rpm
c) 啟用代理(作業)
使用 sqlagent.enabled 設定可啟用 SQL Server 代理。 預設情況下,SQL Server 代理處於禁用狀態。 如果 mssql.conf 設定檔案中不存在 sqlagent.enabled,則 SQL Server 在內部假定已禁用 SQL Server 代理。若要更改此設定,請使用以下步驟:
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true sudo systemctl restart mssql-server
d) 代理錯誤日誌設定
sqlpagent.errorlogfile 和 sqlpagent.errorlogginglevel 設定允許你分別設定 SQL 代理日誌檔案路徑和日誌記錄級別。
sudo /opt/mssql/bin/mssql-conf set sqlagent.errorfile <path>
SQL 代理日誌記錄級別是位掩碼值,等於:
1 = 錯誤
2 = 警告
4 = 資訊
如果要捕獲所有級別,請使用 7
作為值。
sudo /opt/mssql/bin/mssql-conf set sqlagent.errorlogginglevel 7
設定預設語言與排序規則
a) 若要獲取支援的排序規則的列表,請執行 sys.fn_helpcollations 函式
SELECT NAME FROM SYS.FN_HELPCOLLATIONS()
b) 如果安裝時沒有指定環境變數引數,會按預設設定安裝,字符集會是拉丁字符集,預設語言是英語,此時中國使用者需要進行另外設定。
systemctl stop mssql-server /opt/mssql/bin/mssql-conf set-collation Chinese_PRC_CI_AS
c) 可以通過預先設定環境變數來按照指定的字符集及本地語言等設定引數,這樣的話無需安裝後再進行配置。
MSSQL_LCID='2052' MSSQL_COLLATION='Chinese_PRC_CI_AS'
/opt/mssql/bin/mssql-conf setup
d) 查詢當前排序規則
select serverproperty('Collation')
設定記憶體限制
使用 memory.memorylimitmb 設定可控制 SQL Server 可用的實體記憶體量(以 MB 為單位)。 預設值為實體記憶體的80%。(我們根據情況而定,更改此設定時,不要將此值設定得太高。 如果不留出足夠的記憶體,則可能會遇到 Linux 作業系統和其他 Linux 應用程式的問題)
a) 使用 memory.memorylimitmb 的 set 命令以根使用者身份執行 mssql-conf 指令碼 。 以下示例將 SQL Server 可用的記憶體更改為 3.25 GB (3328 MB)。
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 6656
b) 重啟 SQL Server 服務以應用更改
sudo systemctl restart mssql-server
更改TCP埠
使用 network.tcpport 設定可更改 SQL Server 偵聽連線的 TCP 埠。 預設情況下,此埠設定為 1433。 若要更改埠,請執行以下命令:
a) 使用“network.tcpport”的“set”命令以根使用者身份執行mssql-conf 指令碼
sudo /opt/mssql/bin/mssql-conf set network.tcpport <new_tcp_port>
b) 重啟 SQL Server 服務
sudo systemctl restart mssql-server
c) 連線到 SQL Server 後,必須在主機名或 IP 地址後用逗號 (,) 指定自定義埠。
例如,要使用 SQLCMD 進行連線:
sqlcmd -S localhost,<new_tcp_port> -U test -P test
# iptables -A INPUT -p tcp --dport 1433 -j ACCEPT # iptables-save > /etc/sysconfig/iptables # firewall-cmd --add-port=1433/tcp --permanent # firewall-cmd --reload
更改預設資料或日誌目錄位置
使用 filelocation.defaultdatadir 和 filelocation.defaultlogdir 設定可更改建立新資料庫和日誌檔案的位置 。 預設情況下,此位置為 /var/opt/mssql/data。 若要更改這些設定,請使用以下步驟:
a) 為新的資料庫資料和日誌檔案建立目標目錄。 以下示例建立一個新的/mssql/data目錄
mkdir -p /mssql/data
b) 將目錄的所有者和組更改為 mssql 使用者
資料目錄的上一級目錄必須設定mssql使用者才會有許可權!!!!(與Mysql的不同)
sudo chown mssql /mssql sudo chgrp mssql /mssql sudo chown mssql /mssql/data sudo chgrp mssql /mssql/data
c) 使用 mssql-conf 通過 set 命令更改預設資料目錄
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /mssql/data
現在,為新資料庫建立的所有資料庫檔案都將儲存在此新位置。
d) 更改新資料庫的日誌檔案 (.ldf) 位置,可以使用下面的“set”命令
mkdir -p /mssql/mssqllog sudo chown mssql /mssql/mssqllog sudo chgrp mssql /mssql/mssqllog sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /mssql/mssqllog
e) 重啟 SQL Server 服務
sudo systemctl restart mssql-server
更改預設轉儲目錄位置
使用 filelocation.defaultdumpdir 設定可更改每當系統崩潰時生成記憶體和 SQL 轉儲的預設位置。 預設情況下,這些檔案在 /var/opt/mssql/log 中生成。
若要設定新位置,請使用以下命令:
a) 新的轉儲檔案建立目標目錄。 以下示例建立一個新的 /mssql/mssqldump 目錄
sudo mkdir /mssql/mssqldump
b) 將目錄的所有者和組更改為 mssql 使用者
sudo chown mssql /mssql/mssqldump sudo chgrp mssql /mssql/mssqldump
c) 使用 mssql-conf 通過 set 命令更改預設資料目錄
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/mssqldump
d) 重啟 SQL Server 服務
sudo systemctl restart mssql-server
啟用可用性組(預設不用開啟)
使用 hadr.hadrenabled 選項可在 SQL Server 例項上啟用可用性組。 下面的命令通過將 hadr.hadrenabled 設定為 1 來啟用可用性組。 必須重啟 SQL Server,該設定才能生效。
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 sudo systemctl restart mssql-server
驗證建立庫
a) 建立建立庫的儲存過程,如有這個儲存過程就不用建立了。
CREATE PROCEDURE [dbo].[PROC_CREATE_DB] @DB_NAME varchar(100), @data_path_root varchar(256) = 'D:\DBData\' --'/mssql/data/' AS BEGIN IF DB_ID (@DB_NAME) IS NOT NULL EXECUTE ('DROP DATABASE ' + @DB_NAME) -- execute the CREATE DATABASE statement EXECUTE ('CREATE DATABASE ' + @DB_NAME + ' ON ( NAME = '''+ @DB_NAME +''', FILENAME = '''+ @data_path_root + @DB_NAME + '.mdf'', SIZE = 500, MAXSIZE = UNLIMITED, FILEGROWTH = 500 ) LOG ON ( NAME = '''+ @DB_NAME +'_log'', FILENAME = '''+ @data_path_root + @DB_NAME + '_log.ldf'', SIZE = 50MB, MAXSIZE = UNLIMITED, FILEGROWTH = 50 )' ) EXECUTE ('ALTER DATABASE ' + @DB_NAME + ' SET RECOVERY SIMPLE') END
b) 執行建立庫的儲存過程,注意路徑
EXEC PROC_CREATE_DB '庫名','/mssql/data/' --庫名、路徑
查詢當前時間
如果與當前時間不符,則需要修改系統時間:
clock --set --date="2020-10-19 19:30:39" clock –hctosys
select GETDATE()
如果一臺伺服器同時部署了mysql,則修改時間後要去mysql查詢當前時間
select now()
建立使用者並分配許可權
需要SA使用者登入才有許可權設定。
a) 應用程式和管理人員賬號
Linux上的SQL Server不支援ADMINISTER BULK OPERATIONS許可權或bulkadmin角色。只有sysadmin可以在Linux上對SQL Server執行批量插入。
sysadmin讀寫許可權比較高,專門給系統相關程式或管理員使用,不得通過任何人為方式使用。
DECLARE @loginName VARCHAR(50) = '使用者名稱' DECLARE @loginPassword VARCHAR(50) = '密碼' IF EXISTS(SELECT 1 FROM sys.syslogins WHERE name = @loginName) BEGIN PRINT '登入名【' + @loginName + '】已存在。' RETURN END DECLARE @sql VARCHAR(8000) SET @sql = 'CREATE LOGIN ' + @loginName + ' WITH PASSWORD = ''' + @loginPassword + '''' EXEC(@sql) --分配角色 EXEC sys.sp_addsrvrolemember @rolename = 'sysadmin', @loginame = @loginName
所以,如果是部署在Windows的話,程式賬戶用bulkadmin、dbcreator。建議不用sysadmin。
EXEC sys.sp_addsrvrolemember @rolename = 'bulkadmin', @loginame = @loginName EXEC sys.sp_addsrvrolemember @rolename = 'dbcreator', @loginame = @loginName
刪除使用者(不要手賤!)
a) 在刪除該登入名之前,請更改相應資料庫的所有者。
USE [SLSW_YN]; EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false;
@map: 將別名及其許可權移交給新的資料庫所有者
找到對應使用者所擁有的資料庫許可權,並轉給其他使用者,如SA使用者。
SELECT 'use ['+A.NAME+']; exec dbo.sp_changedbowner @loginame = N''sa'', @map = false; ' FROM SYS.DATABASES A INNER JOIN SYS.SYSLOGINS B ON A.OWNER_SID=B.SID WHERE B.NAME='使用者名稱'
b) 執行a)產生的所有SQL語句
c) 殺掉賬號所有執行緒再刪除賬號(不殺的話,禁用以後,原來開啟的程序依然可以執行)
CREATE PROC [dbo].[PROC_mgr_login_process_kill_all] @loginName VARCHAR(255) AS BEGIN DECLARE @processes TABLE ( ID INT IDENTITY(1, 1), spid INT, ecid INT, status VARCHAR(50), loginname VARCHAR(255), hostname VARCHAR(255), blk INT, dbname VARCHAR(255), cmd VARCHAR(8000), request_id INT ) DECLARE @sql VARCHAR(8000) SET @sql = 'EXEC sp_who ''' + @loginName + '''' INSERT INTO @processes ( spid, ecid, status, loginname, hostname, blk, dbname, cmd, request_id ) EXEC(@sql) DECLARE @iLoop INT DECLARE @totalCount INT SELECT @iLoop = 1, @totalCount = COUNT(*) FROM @processes WHILE @iLoop <= @totalCount BEGIN DECLARE @spid INT SELECT @spid = spid FROM @processes WHERE ID = @iLoop SET @sql = 'KILL ' + CAST(@spid AS VARCHAR(20)) EXEC(@sql) SET @iLoop += 1 END EN
EXEC MTNOH_AAA_DB.[dbo].[PROC_mgr_login_process_kill_all] '使用者名稱'; EXEC sys.sp_droplogin @loginame = '使用者名稱';
mssql.conf格式配置
類似mysql的etc/my.cnf
/var/opt/mssql/mssql.conf檔案提供了每個設定的示例
cat /var/opt/mssql/mssql.conf
線上安裝
自 CU20 起,SQL Server 2017 開始支援 RHEL 8。 以下用於 SQL Server 2017 的命令指向 RHEL 8 儲存庫。 RHEL 8 未預安裝 SQL Server 所需的 python2。 在開始 SQL Server 的安裝步驟之前,請執行以下命令,並驗證是否選擇了 python2 作為直譯器:
sudo alternatives --config python # If not configured, install python2 and openssl10 using the following commands: sudo yum install python2 sudo yum install compat-openssl10 # Configure python2 as the default interpreter using this command: sudo alternatives --config python
有關詳細資訊,請參閱以下部落格,瞭解如何安裝 python2 並將其配置為預設直譯器: 。
如果使用 RHEL 7,請將以下路徑更改為 /rhel/7 而不是 /rhel/8。
安裝mssql-server
下載SQL Server 2017 Red Hat 儲存庫配置檔案並安裝
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo sudo yum install -y mssql-server
如果想安裝 SQL Server 2019,必須改為註冊 SQL Server 2019 儲存庫。 使用以下命令安裝 SQL Server 2019:
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo sudo yum install -y mssql-server
配置
/opt/mssql/bin/mssql-conf setup
執行 mssql-conf setup,按照提示設定 SA 密碼並選擇版本。
安裝 sqlcmd 和 bcp SQL Server 命令列工具
下載 Microsoft Red Hat 儲存庫配置檔案
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo
如果安裝了早期版本的 mssql-tools,請刪除所有舊的 unixODBC包
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
使用 unixODBC 開發人員包安裝 mssql-tools
sudo yum install -y mssql-tools unixODBC-devel
…………
其他參考離線安裝章節
無人蔘與安裝
#!/bin/bash -e # Use the following variables to control your install: # Password for the SA user (required) MSSQL_SA_PASSWORD='<YourStrong!Passw0rd>' # Product ID of the version of SQL server you're installing # Must be evaluation, developer, express, web, standard, enterprise, or your 25 digit product key # Defaults to developer MSSQL_PID='evaluation' # Install SQL Server Agent (recommended) SQL_ENABLE_AGENT='y' # Install SQL Server Full Text Search (optional) # SQL_INSTALL_FULLTEXT='y' # Create an additional user with sysadmin privileges (optional) # SQL_INSTALL_USER='<Username>' # SQL_INSTALL_USER_PASSWORD='<YourStrong!Passw0rd>' if [ -z $MSSQL_SA_PASSWORD ] then echo Environment variable MSSQL_SA_PASSWORD must be set for unattended install exit 1 fi echo Adding Microsoft repositories... sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo echo Installing SQL Server... sudo yum install -y mssql-server echo Running mssql-conf setup... sudo MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD \ MSSQL_PID=$MSSQL_PID \ /opt/mssql/bin/mssql-conf -n setup accept-eula echo Installing mssql-tools and unixODBC developer... sudo ACCEPT_EULA=Y yum install -y mssql-tools unixODBC-devel # Add SQL Server tools to the path by default: echo Adding SQL Server tools to your path... echo PATH="$PATH:/opt/mssql-tools/bin" >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc # Optional Enable SQL Server Agent : if [ ! -z $SQL_ENABLE_AGENT ] then echo Enable SQL Server Agent... sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true sudo systemctl restart mssql-server fi # Optional SQL Server Full Text Search installation: if [ ! -z $SQL_INSTALL_FULLTEXT ] then echo Installing SQL Server Full-Text Search... sudo yum install -y mssql-server-fts fi # Configure firewall to allow TCP port 1433: echo Configuring firewall to allow traffic on port 1433... sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent sudo firewall-cmd --reload # Example of setting post-installation configuration options # Set trace flags 1204 and 1222 for deadlock tracing: #echo Setting trace flags... #sudo /opt/mssql/bin/mssql-conf traceflag 1204 1222 on # Restart SQL Server after making configuration changes: echo Restarting SQL Server... sudo systemctl restart mssql-server # Connect to server and get the version: counter=1 errstatus=1 while [ $counter -le 5 ] && [ $errstatus = 1 ] do echo Waiting for SQL Server to start... sleep 5s /opt/mssql-tools/bin/sqlcmd \ -S localhost \ -U SA \ -P $MSSQL_SA_PASSWORD \ -Q "SELECT @@VERSION" 2>/dev/null errstatus=$? ((counter++)) done # Display error if connection failed: if [ $errstatus = 1 ] then echo Cannot connect to SQL Server, installation aborted exit $errstatus fi # Optional new user creation: if [ ! -z $SQL_INSTALL_USER ] && [ ! -z $SQL_INSTALL_USER_PASSWORD ] then echo Creating user $SQL_INSTALL_USER /opt/mssql-tools/bin/sqlcmd \ -S localhost \ -U SA \ -P $MSSQL_SA_PASSWORD \ -Q "CREATE LOGIN [$SQL_INSTALL_USER] WITH PASSWORD=N'$SQL_INSTALL_USER_PASSWORD', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=ON, CHECK_POLICY=ON; ALTER SERVER ROLE [sysadmin] ADD MEMBER [$SQL_INSTALL_USER]" fi echo Done!
檢查已安裝的 SQL Server 版本
若要驗證 Linux 上的 SQL Server 的當前版本和版本,請先安裝 SQL Server 命令列工具。
使用“sqlcmd”執行顯示 SQL Server 版本的 Transact-SQL 命令。
sqlcmd -S localhost -U SA -Q 'select @@VERSION'
select @@VERSION
SELECT SERVERPROPERTY('Edition')
解除安裝
若要刪除 Linux 上的“mssql-server”包,不同平臺命令會不一樣:
平臺 |
包刪除命令 |
RHEL |
sudo yum remove mssql-server |
SLES |
sudo zypper remove mssql-server |
Ubuntu |
sudo apt-get remove mssql-server |
刪除包不會刪除生成的資料庫檔案。 如果希望刪除資料庫檔案,請使用以下命令:
sudo rm -rf /var/opt/mssql/
更新或升級
若要將“mssql-server”包更新到最新版本,請根據你的平臺使用以下命令之一:
平臺 |
包更新命令 |
RHEL |
sudo yum update mssql-server |
SLES |
sudo zypper update mssql-server |
Ubuntu |
|
這些命令將下載最新包,並替換 /opt/mssql/
下的二進位制檔案。 此操作不會影響到使用者生成的資料庫和系統資料庫。
若要升級 SQL Server,請首先將配置的儲存庫更改為所需的 SQL Server 版本。
然後使用同一個 update 命令升級 SQL Server 版本。
儲存庫的作用:用於獲取資料庫引擎包、mssql-server 以及相關 SQL Server 包 。
現有五個主要儲存庫:
儲存庫 |
名稱 |
說明 |
2019 |
mssql-server-2019 |
SQL Server 2019 累積更新 (CU) 儲存庫。 |
2019 GDR |
mssql-server-2019-gdr |
SQL Server 2019 GDR 儲存庫僅用於關鍵更新。 |
2019 預覽版 |
mssql-server-preview |
SQL Server 2019 預覽版和 RC 儲存庫。
|
2017 |
mssql-server-2017 |
SQL Server 2017 累積更新 (CU) 儲存庫。 |
2017 GDR |
mssql-server-2017-gdr |
SQL Server 2017 GDR 儲存庫僅用於關鍵更新。 |
回滾
若要將 SQL Server 回滾或降級到以前的版本,請使用以下步驟:
a)標識要降級到的 SQL Server 包的版本號。 有關包版本號的列表,請參閱。
b)降級到 SQL Server 的早期版本。 在以下命令中,將 <version_number>
替換為步驟 1 中標識的 SQL Server 版本號。
平臺 |
包更新命令 |
RHEL |
sudo yum downgrade mssql-server-<version_number>.x86_64 |
SLES |
sudo zypper install --oldpackage mssql-server=<version_number> |
Ubuntu |
|
只支援降級到相同主版本(如SQL Server 2017)內的版本。
功能支援情況
相比Windows,Linux會有些功能不完全支援。
類別 |
Windows |
Linux |
說明 |
表 |
√ |
√ |
|
SQL基礎語法 |
√ |
√ |
|
儲存過程 |
√ |
√ |
|
函式 |
√ |
√ |
包括CLR函式。不支援設定了EXTERNAL_ACCESS或UNSAFE許可權的CLR程式集 |
索引 |
√ |
√ |
|
作業 |
√ |
√ |
|
檢視 |
√ |
√ |
|
事務 |
√ |
√ |
|
資料庫分割槽 |
√ |
√ |
|
連結伺服器 |
√ |
√ |
只支援SQLServer連結伺服器,不支援Mysql。低版本連線高版本會出現部分問題 |
系統表 |
√ |
√ |
|
備份、還原 |
√ |
√ |
|
呼叫bat |
√ |
× |
舊版本工單建立、更新會用到 |
BCP |
√ |
× |
xp_cmdshell、bulk insert,資料庫入庫會亂碼 |
檔案操作 |
√ |
× |
xp_cmdshell、bulk insert,資料庫入庫會亂碼 |
維護計劃 |
√ |
× |
整庫遷移
把Sqlserver2008(Windows)的資料庫遷移到Sqlserver2017(Linux)
a) 從Sqlserver2008(Windows)備份
SELECT 'BACKUP DATABASE ' + name + ' TO DISK = N''' + 'D:' + '\' + name + '.bak'' WITH COMPRESSION,NOFORMAT, NOINIT, NAME = N''' + name + '-完整 資料庫 備份'', SKIP, NOREWIND, NOUNLOAD, STATS = 10' FROM SYS.DATABASES WHERE NAME IN ('庫名1','庫名2') ORDER BY NAME
b) 在Sqlserver2017(Linux)還原
exec PROC_CREATE_DB '庫名','/mssql/data/' RESTORE DATABASE SLSW FROM DISK = '/home/slsw1009/SLSW.bak' WITH MOVE 'SLSW' TO '/home/mssqldata/SLSW.mdf', MOVE 'SLSW_log' TO '/home/mssqldata/SLSW.ldf', STATS = 1, REPLACE, RECOVERY GO
恢復資料庫時出現Exclusive access could not be obtained because the database is in use錯誤,那是因為庫正在使用。
執行以下query語句將資料庫離線(把[db_name]替換成你的資料庫名,下同)
use master alter database [db_name] set offline with rollback immediate
接著進行資料庫恢復的相關操作
RESTORE DATABASE SLSW FROM DISK = '/home/slsw1009//SLSW.bak' WITH MOVE 'SLSW' TO '/home/mssqldata/SLSW.mdf', MOVE 'SLSW_log' TO '/home/mssqldata/SLSW.ldf', STATS = 1, REPLACE, RECOVERY GO
最後執行下面的query語句將資料庫恢復線上
use master alter database [db_name] set online with rollback immediate;
c) 在Sqlserver2017(Linux)備份
備份路徑要有mssql使用者的許可權
mkdir -p /home/mssqlbackup chown mssql /home/mssqlbackup chgrp mssql /home/mssqlbackup
BACKUP DATABASE TestDB TO DISK = N'/home/mssqlbackup/TestDB.bak' WITH COMPRESSION,NOFORMAT, NOINIT, NAME = N'TestDB_BACKUP', SKIP, NOREWIND, NOUNLOAD, STATS = 10
已知問題
a) 安裝SQL Server的主機名的長度必須為15個字元或更少
解決方法:將/ etc / hostname中的名稱更改為15個字元以下的長度。
b) 手動將系統時間倒退設定為時間會導致SQL Server停止更新SQL Server中的內部系統時間
解決方法:重新啟動SQL Server。
c) 僅支援單例項安裝
建議在主機上執行多個容器以具有多個不同的例項。使用docker可以輕鬆實現這一點,但是每個容器都需要偵聽不同的埠
d) Linux上不支援使用者許可權ADMINISTER BULK OPERATIONS(bulkadmin伺服器角色)
e) SQLServer和相關工具目前不支援在Windows 10上執行的Linux
f) SQL Server資料和日誌目錄不支援符號連結
g) 重置系統管理(SA)密碼
sudo systemctl stop mssql-server sudo /opt/mssql/bin/mssql-conf setup sqlcmd -S myserver -U sa -P Test\$\$
如果在SQL Server登入密碼中使用某些字元,則在終端的Linux命令中使用它們時,可能需要使用反斜槓將其轉義。例如,在終端命令/ shell指令碼中使用美元符號($)時,必須隨時對其進行轉義
(特殊字元)
2017新函式,讓人眼前一亮的特性,有時間再補測試用例了。
Translate 函式(實現批量替換)
string_agg函式(分組合並字串)
trim函式(移除左右空格、指定字元)
string_split函式(拆分字串)
資料轉成JSON格式(2016特性)
參考資料
(背景段落摘抄)