主頁 > 資料庫 > SQL Server On Linux:基于實際專案案例,總結功能支持情況及相關問題解決方案

SQL Server On Linux:基于實際專案案例,總結功能支持情況及相關問題解決方案

2021-01-12 07:08:27 資料庫

  上個月,有個朋友問我說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.0418.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

sudo apt-get update
sudo apt-get install mssql-server

  這些命令將下載最新包,并替換 /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

sudo apt-get install mssql-server=<version_number> sudo systemctl start mssql-server

  只支持降級到相同主版本(如SQL Server 2017)內的版本,

功能支持情況

  相比WindowsLinux會有些功能不完全支持,

類別

Windows

Linux

說明

 

SQL基礎語法

 

存盤程序

 

函式

包括CLR函式,不支持設定了EXTERNAL_ACCESSUNSAFE權限的CLR程式集

索引

 

作業

 

視圖

 

事務

 

資料庫磁區

 

鏈接服務器

只支持SQLServer鏈接服務器,不支持Mysql,低版本連接高版本會出現部分問題

系統表

 

備份、還原

 

呼叫bat

×

舊版本工單創建、更新會用到

BCP

×

xp_cmdshellbulk insert,資料庫入庫會亂碼

檔案操作

×

xp_cmdshellbulk insert,資料庫入庫會亂碼

維護計劃

×

 


整庫遷移

  把Sqlserver2008Windows)的資料庫遷移到Sqlserver2017Linux

  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 OPERATIONSbulkadmin服務器角色)

 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/247559.html

標籤:SQL Server

上一篇:sas字符轉數值問題

下一篇:SQL Server On Linux:基于實際專案案例,總結功能支持情況及相關問題解決方案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more