探索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
更多配置请查看文档:
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 的性能最佳做法和配置指南: