上個月,有個朋友問我說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 存盤庫中,地址為 https://packages.microsoft.com
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 并將其配置為默認解釋器: https://www.redhat.com/en/blog/installing-microsoft-sql-server-red-hat-enterprise-linux-8-beta ,
如果使用 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腳本中使用美元符號($)時,必須隨時對其進行轉義
https://tldp.org/LDP/abs/html/special-chars.html(特殊字符)
2017新函式,讓人眼前一亮的特性,有時間再補測驗用例了,
Translate 函式(實作批量替換)
string_agg函式(分組合并字串)
trim函式(移除左右空格、指定字符)
string_split函式(拆分字串)
資料轉成JSON格式(2016特性)
參考資料
https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-configure-mssql-conf?view=sql-server-linux-2017 (微軟官方檔案)
https://www.cnblogs.com/shanyou/p/5272628.html (背景段落摘抄)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/247561.html
標籤:其他
上一篇:SQL Server On Linux:基于實際專案案例,總結功能支持情況及相關問題解決方案
下一篇:Oracle學習筆記
