探索SQL Server 2022在Ubuntu 20.04上的安裝、配置、備份與常見問題

最近新項目要上線,考慮成本,放棄雲數據庫,選擇自行安裝,數據庫選擇SQL Server 2022,系統選擇Ubuntu 20.04。

//SQL Server 2022文檔地址

https://learn.microsoft.com/zh-cn/sql/sql-server/?view=sql-server-ver16

SQL Server 2022 安裝

SQL Server 2022先決條件:服務器內存至少需要2 GB 。

1、導入公共存儲庫 GPG 密鑰

$ wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

2、註冊 SQL Server Ubuntu 存儲庫

sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"

3、運行以下命令以安裝 SQL Server

sudo apt-get updatesudo apt-get install -y mssql-server

4、等待安裝完成後,運行 mssql-conf setup

按照提示選擇數據庫版本及設置 SA 密碼。其中數據庫版本Evaluation、Developer 和 Express 版爲免費版本。

sudo /opt/mssql/bin/mssql-conf setup

注意:SA 賬戶密碼需要最小長度爲 8 個字符,包括大寫和小寫字母、十進制數字和/或非字母數字符號。

此時如果正常,那恭喜您!但我嘗試了好幾次,都卡在了這裏,系統提示:error while loading shared libraries: liblber-2.4.so.2

文本

描述已自動生成

網上查了一堆資料,最終找到了解決辦法:

下載安裝libldap-2.4-2_2.4.47+dfsg.4-1+eagle_amd64包

wget https://community-packages.deepin.com/deepin/pool/main/o/openldap/libldap-2.4-2_2.4.47%2Bdfsg.4-1%2Beagle_amd64.debsudo dpkg -i libldap-2.4-2_2.4.47+dfsg.4-1+eagle_amd64.deb

再次運行 mssql-conf setup,繼續設置,再次遇到問題,系統提示:error while loading shared libraries: libssl1.1,解決辦法:

下載安裝libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64包

wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.debsudo dpkg -i libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb

最後運行 mssql-conf setup,完成設置,沒再報錯。

5、驗證服務是否正常運行

systemctl status mssql-server --no-pager

文本

描述已自動生成此時SQL Server 已在 Ubuntu 上正常運行。

6、打開 SQL Server TCP 端口(默認值爲 1433)

開啓內網遠程訪問,我們使用的是騰訊雲,需要設置安全組,內網放行1433端口。

SQL Server 2022 配置

SQL Server 數據庫安裝完成後,還需要進行一些常規配置。

1、啓用 SQL Server 代理

爲了進行日常數據備份等任務,我們需要開啓代理:

sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
//重啓服務生效
sudo systemctl restart mssql-server

2、更改默認數據或日誌目錄位置

使用 filelocation.defaultdatadir 和 filelocation.defaultlogdir 設置可更改創建新數據庫和日誌文件的位置。默認路徑爲:/var/opt/mssql/data。可以使用以下步驟進行修改:

//爲新的數據庫數據和日誌文件創建目標目錄
sudo mkdir /home/d/mssql/data

//將目錄的所有者和組更改爲 mssql 用戶
sudo chown mssql  /home/d/mssql/data
sudo chgrp mssql  /home/d/mssql/data

//使用 mssql-conf 通過 set 命令更改默認數據目錄
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /home/d/mssql/data

//使用 mssql-conf 通過 set 命令更改默認日誌文件目錄
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /home/d/mssql/data

//重啓服務生效
sudo systemctl restart mssql-server

3、更改生成備份文件的默認位置

使用 filelocation.defaultbackupdir 設置可更改生成備份文件位置。默認路徑爲:/var/opt/mssql/data。可以使用以下步驟進行修改:

//爲新的備份文件創建目標目錄
sudo mkdir /home/d/mssql/bak/ -p

//將目錄的所有者和組更改爲 mssql 用戶
sudo chown mssql /home/d/mssql/backup
sudo chgrp mssql /home/d/mssql/backup

//使用 mssql-conf 通過 set 命令更改默認備份目錄
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultbackupdir /home/d/mssql/backup

//重啓 SQL Server 服務
sudo systemctl restart mssql-server

更多配置請查看文檔:

https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-configure-mssql-conf?view=sql-server-ver16

4、設置數據庫自動備份

備份是保護數據的唯一方法,爲了防止數據丟失和保障業務的持續性,需要對數據進行備份。這裏採用的方案是按周進行完整備份,按天進行差異備份,按小時進行事務備份,在還原數據時,只需要選擇完全備份、差異備份集和事務備份,打上勾後進行還原即可。

完整備份是指備份整個數據庫,包括表、索引、視圖和存儲過程等所有數據庫對象,完整備份所需時間較長,佔用空間也最多,但恢復數據時只需還原單個文件,因此最爲簡單和快速。

差異備份是針對上一次完全備份來說的,它只備份自上次完全備份之後發生更改的數據。因此,差異備份比完全備份小,還原也比完全備份快且對性能影響最小。

事務日誌備份是指備份數據庫的事務日誌,它包含了自上次事務日誌備份以來發生的所有事務。它需要依賴於一個完整備份和一個或多個差異或事務日誌備份,還原時需要按照順序還原所有相關的備份。因此,事務日誌備份的優點是佔用空間最小,備份時間最短,可以恢復到任何點的時間,甚至可以恢復到故障發生時的狀態(尾部日誌備份)。缺點是還原速度最慢,需要多個步驟和文件,如果中間有一個文件丟失或損壞,就無法完成還原。

我使用 SQL Server 代理中提供的作業來執行計劃,新建三個作業,一個執行完整備份任務,一個執行差異備份任務,還有一個執行事務備份任務。如下圖所示

文本

中度可信度描述已自動生成

首先、設置作業的步驟,我們可以在步驟中添加執行備份任務的腳本。

圖形用戶界面, 文本, 應用程序, 電子郵件

描述已自動生成

然後、設置作業計劃,指定腳本執行的時間週期及間隔。

圖形用戶界面, 應用程序

描述已自動生成

這樣就可以了,以上爲演示截圖。

SQL Server 完整備份腳本:

-- 聲明一個變量,獲取當前時間
DECLARE @Dt DATETIME2(7) = GETDATE();​
-- 聲明一個變量,設置數據庫名
DECLARE @Name VARCHAR(20) = 'test';
-- 聲明一個變量,存儲備份文件的路徑,並使用112格式代碼轉換日期
DECLARE @Path VARCHAR(100) = CONCAT('/home/d/mssql/backup/',@Name,'_',CONVERT(VARCHAR(8),@Dt ,112),'_full.bak');
-- 聲明一個變量,存儲完整備份集的名稱
DECLARE @FullName VARCHAR(20) = CONCAT(@Name,'_full');​
-- 創建一個新的備份文件,並寫入完整備份
BACKUP DATABASE @Name
  TO DISK = @Path
  WITH FORMAT, -- 創建新的介質集並清除所有現有備份集
    NAME = @FullName, -- 指定完整備份集的名稱
    DESCRIPTION = 'Full backup', -- 指定介質集的描述
    COMPRESSION, -- 啓用數據壓縮
    CHECKSUM; -- 啓用校驗和檢測
GO

SQL Server 差異備份腳本:

-- 聲明一個變量,獲取當前時間
DECLARE @Dt DATETIME2(7) = GETDATE();​
-- 聲明一個變量,設置數據庫名
DECLARE @Name VARCHAR(20) = 'test';
-- 聲明一個變量,存儲備份文件的路徑,並使用112格式代碼轉換日期
DECLARE @Path VARCHAR(100) = CONCAT('/home/d/mssql/backup/',@Name,'_',CONVERT(VARCHAR(8),@Dt ,112),'_diff.bak');
-- 聲明一個變量,存儲差異備份集的名稱
DECLARE @DiffName VARCHAR(20) = CONCAT(@Name,'_diff');
-- 寫入差異備份,並覆蓋現有的備份文件
BACKUP DATABASE @Name
  TO DISK = @Path
  WITH 
    --INIT, -- 覆蓋現有的備份文件
    DIFFERENTIAL, -- 指定差異備份
    NAME = @DiffName, -- 指定差異備份集的名稱
    DESCRIPTION = 'Differential backup', -- 指定介質集的描述
    COMPRESSION, -- 啓用數據壓縮
    CHECKSUM; -- 啓用校驗和檢測
GO

SQL Server 事務日誌備份腳本:

-- 聲明一個變量,獲取當前時間
DECLARE @Dt DATETIME2(7) = GETDATE();​
-- 聲明一個變量,設置數據庫文件名
DECLARE @Name VARCHAR(20) = 'test';
-- 聲明一個變量,存儲所需的日期
DECLARE @Date DATE;
-- 使用DATEFROMPARTS函數獲取指定日期的零點時間
SET @Date = DATEFROMPARTS(YEAR(@Dt), MONTH(@Dt), DAY(@Dt));
-- 使用DATEPART函數獲取當前時間的小時數
DECLARE @Hour INT = DATEPART(HOUR, @Dt);
-- 使用IIF函數根據當前時間是否小於5點來返回昨天或今天的日期
SET @Date = IIF(@Hour < 5, DATEADD(DAY, -1, @Date), @Date);
-- 聲明一個變量,存儲備份文件的路徑,並使用112格式代碼轉換日期
DECLARE @Path VARCHAR(100) = CONCAT('/home/d/mssql/backup/',@Name,'_',CONVERT(VARCHAR(8),@Date ,112),'_log.bak');

-- 聲明一個變量,存儲事務日誌備份集的名稱
DECLARE @LogName VARCHAR(20) = CONCAT(@Name,'_log');
-- 寫入事務日誌備份,並覆蓋現有的備份文件
BACKUP LOG @Name
  TO DISK = @Path
  WITH
    --INIT, -- 覆蓋現有的備份文件
    NAME = @LogName, -- 指定事務日誌備份集的名稱
    DESCRIPTION = 'Transaction log backup', -- 指定介質集的描述
    COMPRESSION, -- 啓用數據壓縮
    CHECKSUM; -- 啓用校驗和檢測
GO

爲了防止磁盤空間不足,我們需要定期清理備份文件,這裏我們使用sh腳本來執行刪除30天以前的文件:

sudo vim /home/d/mssql/backup/bakup_clear.sh

#!/bin/bash
find /home/d/mssql/backup -mtime +30 -name "*.bak" -exec rm -rf {} \

#在/home/ubuntu/backup目錄下,找到所有修改時間超過30天且文件名以.bak結尾的文件或目錄,並刪除它們,解釋一下:

#find /home/ubuntu/backup:這是find命令的基本用法,它會在指定的目錄(/home/ubuntu/backup)下查找文件或目錄。
#-mtime +30:這是find命令的一個選項,它會匹配那些修改時間(mtime)超過30天(+30)的文件或目錄。
#-name "*.bak":這是find命令的另一個選項,它會匹配那些文件名(name)符合指定的模式(*.bak)的文件或目錄。
#-exec rm -rf {} \;:這是find命令的最後一個選項,它會對每個匹配的文件或目錄執行指定的命令(rm -rf {}),其中{}表示匹配的文件或目錄的名稱,;表示命令的結束。

#授執行權限
sudo chmod 755 /home/d/mssql/backup/bakup_clear.sh

#設置定時任務
#打開配置文件 
sudo crontab -e
#輸入以下內容
0 1 * * * /bin/sh /home/d/mssql/backup/bakup_clear.sh

#編輯創建一個定時服務
sudo crontab -e      
#查看當前用戶的定時任務
sudo crontab -l  

//參考文檔:

https://learn.microsoft.com/zh-cn/sql/relational-databases/integrated-acceleration/use-integrated-acceleration-and-offloading?view=sql-server-ver15
//使用默認MS_XPRESS壓縮選項WITH COMPRESSION (ALGORITHM = MS_XPRESS);

SQL Server 數據庫的備份和還原文檔:

https://learn.microsoft.com/zh-cn/sql/relational-databases/backup-restore/back-up-and-restore-of-sql-server-databases?view=sql-server-ver16

Linux 上的 SQL Server 的性能最佳做法和配置指南:

https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-performance-best-practices?view=sql-server-linux-ver16

👇感謝閱讀,點贊+分享+收藏+關注👇
圖形用戶界面, 文本, 應用程序, 聊天或短信

描述已自動生成
文章出自猿惑豁微信公衆號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章