最近新項目要上線,考慮成本,放棄雲資料庫,選擇自行安裝,資料庫選擇SQL Server 2022,系統選擇Ubuntu 20.04。 //SQL Server 2022文檔地址 https://learn.microsoft.com/zh-cn/sql/sql-server/?view=sql-se ...
最近新項目要上線,考慮成本,放棄雲資料庫,選擇自行安裝,資料庫選擇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
更多配置請查看文檔:
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 資料庫的備份和還原文檔:
Linux 上的 SQL Server 的性能最佳做法和配置指南: