探索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

👇感谢阅读,点赞+分享+收藏+关注👇
图形用户界面, 文本, 应用程序, 聊天或短信

描述已自动生成
文章出自猿惑豁微信公众号
posted @ 2023-10-09 15:33  anech  阅读(579)  评论(0编辑  收藏  举报