sql2022 on linux 日志传送配置
必备条件
在 Linux 上安装 SQL Server 代理(所有节点)
本文介绍如何在 Linux 上启用或安装 SQL Server 代理。
SQL Server 代理运行计划的 SQL Server 作业。 从 SQL Server 2017 (14.x) CU 4 开始,SQL Server 代理包含在 mssql-server 包中,默认情况下处于禁用状态。 有关此版本 SQL Server 代理支持的功能和版本信息,请参阅 Linux 上的 SQL Server 2017 发行说明。
说明
必须先按照以下步骤在 Linux 上启用或安装 SQL Server 代理后,才能使用该代理。
- 在 - /etc/hosts文件中添加主机名(包含和不包含域)。 以下行展示了这些条目的格式:- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14- "IP Address" "hostname" 
 "IP Address" "hostname.domain.com"
 # 如下:
 [root@sql2022-primary /]# cat /etc/hosts
 127.0.0.1 localhost
 ::1 localhost ip6-localhost ip6-loopback
 fe00::0 ip6-localnet
 ff00::0 ip6-mcastprefix
 ff02::1 ip6-allnodes
 ff02::2 ip6-allrouters
 10.10.10.126 sql2022-primary
 10.10.10.127 sql2022-standby
 [root@sql2022-primary /]#
- 根据你的 SQL Server 版本,按照以下某个部分中的说明进行操作: - 版本 - 说明 - SQL Server 2017 (14.x) CU 4 及更高版本 - [启用 SQL Server 代理](#启用 SQL Server 代理) - SQL Server 2017 (14.x) CU 3 及更低版本 - [安装 SQL Server 代理](#安装 SQL Server 代理) 
启用 SQL Server 代理
对于 SQL Server 2017 (14.x) CU 4 及更高版本,只需启用 SQL Server 代理。 无需安装单独的包。
若要启用 SQL Server 代理,请按照以下步骤进行操作。
| 1 | sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true | 
如果在安装了代理的情况下从 SQL Server 2017 (14.x) CU 3 或更低版本进行升级,将自动启用 SQL Server 代理并卸载以前的代理包。
[!note]
SQL Server Management Studio 对象资源管理器不会显示 SQL Server 代理节点的内容,除非启用了 代理 XPs 服务器配置选项,与 SQL Server 代理服务状态无关。
安装 SQL Server 代理
对于 SQL Server 2017 (14.x) CU 3 及更低版本,必须安装 SQL Server 代理包。
以下安装说明仅适用于 SQL Server 2017 (14.x) CU 3 及更低版本。 在安装 SQL Server 代理之前,请先安装 SQL Server,其会在安装 mssql-server-agent 包时配置所需的密钥和存储库。
为平台安装 SQL Server 代理。
- RHEL - 通过下列步骤在 Red Hat Enterprise Linux 上安装 mssql-server-agent。 - 1 
 2- sudo yum install mssql-server-agent 
 sudo systemctl restart mssql-server- 如果安装了 mssql-server-agent,则可使用下列命令将其更新至最新版本: - 1 
 2
 3- sudo yum check-update 
 sudo yum update mssql-server-agent
 sudo systemctl restart mssql-server- 如果需要脱机安装,请在Linux 上的 SQL Server 2017 发行说明中找到 SQL Server 代理包下载。 然后执行与文章安装 SQL Server 所述相同的脱机安装步骤。 
- Ubuntu - 通过下列步骤在 Ubuntu 上安装 mssql-server-agent。 - 1 
 2
 3- sudo apt-get update 
 sudo apt-get install mssql-server-agent
 sudo systemctl restart mssql-server- 如果安装了 mssql-server-agent,则可使用下列命令将其更新至最新版本: - 1 
 2
 3- sudo apt-get update 
 sudo apt-get install mssql-server-agent
 sudo systemctl restart mssql-server- 如果需要脱机安装,请在Linux 上的 SQL Server 2017 发行说明中找到 SQL Server 代理包下载。 然后执行与文章安装 SQL Server 所述相同的脱机安装步骤。 
- SLES - 通过下列步骤在 SUSE Linux Enterprise Server 上安装 mssql-server-agent。 - 安装 mssql-server-agent - 1 
 2- sudo zypper install mssql-server-agent 
 sudo systemctl restart mssql-server- 如果安装了 mssql-server-agent,则可使用下列命令将其更新至最新版本: - 1 
 2
 3- sudo zypper refresh 
 sudo zypper update mssql-server-agent
 sudo systemctl restart mssql-server- 如果需要脱机安装,请在Linux 上的 SQL Server 2017 发行说明中找到 SQL Server 代理包下载。 然后执行与文章安装 SQL Server 所述相同的脱机安装步骤。 
基于NFS配置日志传送
其过程跟基于CIFS的没啥不同
生成测试机
| 1 | [root@docker2 ~]# docker run --name sql2022-primary --hostname sql2022-primary --network=ipvlan-l2 --ip=10.10.10.126 --mount source=mssqlbackup,target=/mssqlbackup --privileged -d registry.cn-hangzhou.aliyuncs.com/zonghengsihai/mssql:sql2022-developer-20241125 /sbin/init | 
| 1 | -- 主服务器中创建主数据库DB-Primary,并创建测试数据 | 
共享目录配置
- 配置主数据库使用完整恢复模式,并在主服务器上配置一个共享文件见用来存储主数据库的事务日志备份 - 在配置日志传送之前,您必须创建共享,以便辅助服务器可以访问事务日志备份。 这是对生成事务日志备份的目录的共享。 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48- # 安装NFS 
 dnf install -y nfs-utils.x86_64
 systemctl enable nfs-server --now
 # 创建事务日志备份目录
 [root@sql2022 /]# mkdir /mssqlbckup
 [root@sql2022 /]# chmod a+w /mssqlbackup/
 # 配置NFS
 vi /etc/exports
 /mssqlbackup *(rw) # 所有人可以读写
 systemctl restart nfs-server
 # 查看
 [root@sql2022 /]# exportfs -v
 /mssqlbackup <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
 [root@sql2022 /]# showmount -e localhost
 Export list for localhost:
 /mssqlbackup *
 [root@sql2022 /]# exportfs -ra
 [root@sql2022 /]#
 # 主库设置目录权限后备库会自定相同
 [root@sql2022 /]# chmod 777 /mssqlbackup
 [root@sql2022 /]# ll /
 total 8
 dr-xr-xr-x 2 root root 6 May 16 2022 afs
 lrwxrwxrwx 1 root root 7 May 16 2022 bin -> usr/bin
 drwxr-xr-x 15 root root 3160 Jun 12 16:23 dev
 drwxr-xr-x 1 root root 4096 Jun 12 16:29 etc
 drwxr-xr-x 2 root root 6 May 16 2022 home
 lrwxrwxrwx 1 root root 7 May 16 2022 lib -> usr/lib
 lrwxrwxrwx 1 root root 9 May 16 2022 lib64 -> usr/lib64
 drwx------ 2 root root 6 May 14 2023 lost+found
 drwxr-xr-x 2 root root 6 May 16 2022 media
 drwxr-xr-x 2 root root 6 May 16 2022 mnt
 drwxrwxrwx 2 root root 6 Jun 12 16:00 mssqlbackup
 drwxr-xr-x 5 root root 57 Nov 25 2024 opt
 dr-xr-xr-x 626 root root 0 Jun 12 16:23 proc
 dr-xr-x--- 1 root root 22 Jun 12 16:29 root
 drwxr-xr-x 16 root root 520 Jun 12 16:28 run
 lrwxrwxrwx 1 root root 8 May 16 2022 sbin -> usr/sbin
 drwxr-xr-x 2 root root 6 May 16 2022 srv
 dr-xr-xr-x 13 root root 0 Jun 12 16:23 sys
 drwxrwxrwt 1 root root 4096 Jun 14 13:25 tmp
 drwxr-xr-x 1 root root 81 May 14 2023 usr
 drwxr-xr-x 1 root root 76 Jun 29 2023 var
 [root@sql2022 /]#
- 备库上挂载主库上的NFS目录 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21- # 安装showmount 
 dnf install nfs-utils-1:2.5.4-34.el9.x86_64
 # 必须安装,否则挂在时提示:
 [root@sql2022-standby /]# mount -t nfs 10.10.10.126:/mssqlbackup /primarydb_backups/
 mount: /primarydb_backups: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
 [root@sql2022 /]# showmount –e 10.10.10.126
 showmount: only one hostname is allowed
 [root@sql2022 /]#
 # 挂载
 [root@sql2022 /]# mount -t nfs 10.10.10.126:/mssqlbackup /primarydb_backups/
 [root@sql2022 /]# df -Th
 Filesystem Type Size Used Avail Use% Mounted on
 overlay overlay 200G 133G 68G 67% /
 tmpfs tmpfs 64M 0 64M 0% /dev
 shm tmpfs 64M 0 64M 0% /dev/shm
 /dev/mapper/docker_vg-docker_lv xfs 200G 133G 68G 67% /etc/hosts
 tmpfs tmpfs 6.3G 8.1M 6.3G 1% /run
 10.10.10.126:/mssqlbackup nfs 200G 133G 68G 67% /primarydb_backups
 [root@sql2022 /]#
配置SQL Server日志传送
- 在主服务器上备份数据库: - 1 
 2
 3
 4
 5
 6
 7
 8- ALTER DATABASE "DB-Primary" SET RECOVERY FULL; 
 USE [DB-Primary];
 GO
 BACKUP DATABASE [DB-Primary]
 TO DISK='/mssqlbackup/DB-Primary.bak'
 WITH NOINIT,MEDIANAME='DB-Primary Backup Media',NAME='Full Backup of DB-Primary';
 go
- 在主服务器上配置日志传送: - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52- DECLARE @LS_BackupJobId AS UNIQUEIDENTIFIER; 
 DECLARE @LS_PrimaryId AS UNIQUEIDENTIFIER;
 DECLARE @SP_Add_RetCode AS INT;
 EXECUTE @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database
 @database = N'DB-Primary',
 @backup_directory = N'/mssqlbackup',
 @backup_share = N'/mssqlbackup',
 @backup_job_name = N'LSBackup_DB-Primary',
 @backup_retention_period = 4320,
 @backup_compression = 2,
 @backup_threshold = 60,
 @threshold_alert_enabled = 1,
 @history_retention_period = 5760,
 @backup_job_id = @LS_BackupJobId OUTPUT,
 @primary_id = @LS_PrimaryId OUTPUT,
 @overwrite = 1;
 IF (@@ERROR = 0 AND @SP_Add_RetCode = 0)
 BEGIN
 DECLARE @LS_BackUpScheduleUID AS UNIQUEIDENTIFIER;
 DECLARE @LS_BackUpScheduleID AS INT;
 EXECUTE msdb.dbo.sp_add_schedule
 @schedule_name = N'LSBackupSchedule',
 @enabled = 1,
 @freq_type = 4,
 @freq_interval = 1,
 @freq_subday_type = 4,
 @freq_subday_interval = 15,
 @freq_recurrence_factor = 0,
 @active_start_date = 20170418,
 @active_end_date = 99991231,
 @active_start_time = 0,
 @active_end_time = 235900,
 @schedule_uid = @LS_BackUpScheduleUID OUTPUT,
 @schedule_id = @LS_BackUpScheduleID OUTPUT;
 EXECUTE msdb.dbo.sp_attach_schedule
 @job_id = @LS_BackupJobId,
 @schedule_id = @LS_BackUpScheduleID;
 EXECUTE msdb.dbo.sp_update_job @job_id = @LS_BackupJobId, @enabled = 1;
 END
 EXECUTE master.dbo.sp_add_log_shipping_alert_job;
 EXECUTE master.dbo.sp_add_log_shipping_primary_secondary
 @primary_database = N'DB-Primary',
 @secondary_server = N'10.10.10.127',
 @secondary_database = N'DB-Standby',
 @overwrite = 1;
- 在辅助服务器上还原数据库: - 1 
 2
 3- RESTORE DATABASE [DB-Standby] 
 FROM DISK = '/primarydb_backups/DB-Primary.bak'
 WITH NORECOVERY;
- 在辅助服务器上配置日志传送: - 备库上先创建一个用来存储备库日志的目录:(看官方示例,其实所谓的源和目标都可以使用/primarydb_backups/ - 1 
 2
 3
 4- [root@sql2022-standby /]# mkdir /standbydb_backups 
 [root@sql2022-standby /]# chmod 777 /standbydb_backups
 [root@sql2022-standby /]#- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92- DECLARE @LS_Secondary__CopyJobId AS UNIQUEIDENTIFIER; 
 DECLARE @LS_Secondary__RestoreJobId AS UNIQUEIDENTIFIER;
 DECLARE @LS_Secondary__SecondaryId AS UNIQUEIDENTIFIER;
 DECLARE @LS_Add_RetCode AS INT;
 EXECUTE @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary
 @primary_server = N'10.10.10.126',
 @primary_database = N'DB-Primary',
 @backup_source_directory = N'/primarydb_backups/',
 @backup_destination_directory = N'/standbydb_backups/',
 @copy_job_name = N'LSCopy_10.10.10.126_DB-Primary',
 @restore_job_name = N'LSRestore_10.10.10.126_DB-Primary',
 @file_retention_period = 4320,
 @overwrite = 1,
 @copy_job_id = @LS_Secondary__CopyJobId OUTPUT,
 @restore_job_id = @LS_Secondary__RestoreJobId OUTPUT,
 @secondary_id = @LS_Secondary__SecondaryId OUTPUT
 IF (@@ERROR = 0 AND @LS_Add_RetCode = 0)
 BEGIN
 DECLARE @LS_SecondaryCopyJobScheduleUID AS UNIQUEIDENTIFIER;
 DECLARE @LS_SecondaryCopyJobScheduleID AS INT;
 EXECUTE msdb.dbo.sp_add_schedule
 @schedule_name = N'DefaultCopyJobSchedule',
 @enabled = 1,
 @freq_type = 4,
 @freq_interval = 1,
 @freq_subday_type = 4,
 @freq_subday_interval = 15,
 @freq_recurrence_factor = 0,
 @active_start_date = 20170418,
 @active_end_date = 99991231,
 @active_start_time = 0,
 @active_end_time = 235900,
 @schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT,
 @schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT;
 EXECUTE msdb.dbo.sp_attach_schedule
 @job_id = @LS_Secondary__CopyJobId,
 @schedule_id = @LS_SecondaryCopyJobScheduleID;
 DECLARE @LS_SecondaryRestoreJobScheduleUID AS UNIQUEIDENTIFIER;
 DECLARE @LS_SecondaryRestoreJobScheduleID AS INT;
 EXECUTE msdb.dbo.sp_add_schedule
 @schedule_name = N'DefaultRestoreJobSchedule',
 @enabled = 1,
 @freq_type = 4,
 @freq_interval = 1,
 @freq_subday_type = 4,
 @freq_subday_interval = 15,
 @freq_recurrence_factor = 0,
 @active_start_date = 20170418,
 @active_end_date = 99991231,
 @active_start_time = 0,
 @active_end_time = 235900,
 @schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT,
 @schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT;
 EXECUTE msdb.dbo.sp_attach_schedule
 @job_id = @LS_Secondary__RestoreJobId,
 @schedule_id = @LS_SecondaryRestoreJobScheduleID;
 END
 DECLARE @LS_Add_RetCode2 AS INT;
 IF (@@ERROR = 0 AND @LS_Add_RetCode = 0)
 BEGIN
 EXECUTE @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database
 @secondary_database = N'DB-Standby',
 @primary_server = N'10.10.10.126',
 @primary_database = N'DB-Primary',
 @restore_delay = 0,
 @restore_mode = 0,
 @disconnect_users = 0,
 @restore_threshold = 45,
 @threshold_alert_enabled = 1,
 @history_retention_period = 5760,
 @overwrite = 1;
 END
 IF (@@ERROR = 0 AND @LS_Add_RetCode = 0)
 BEGIN
 EXECUTE msdb.dbo.sp_update_job
 @job_id = @LS_Secondary__CopyJobId,
 @enabled = 1;
 EXECUTE msdb.dbo.sp_update_job
 @job_id = @LS_Secondary__RestoreJobId,
 @enabled = 1;
 END
验证日志传送是否正常运行
- 通过在主服务器上启动以下作业来验证日志传送是否正常运行: - 1 
 2
 3
 4
 5- USE msdb; 
 GO
 EXECUTE dbo.sp_start_job N'LSBackup_DB-Primary';
 GO
- 通过在辅助服务器上启动以下作业来验证日志传送是否正常运行: - 1 
 2
 3
 4
 5
 6
 7
 8- USE msdb; 
 GO
 EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
 GO
 EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
 GO
- 可以通过SSMS的Agent中的作业,作业活动监视器,警报来查看日志传送作业执行的历史记录,其中有三个作业: - 警报作业
- copy作业
- restore作业
 
- 通过执行以下命令验证日志传送故障转移是否正常运行: - [!caution] - 此命令将使辅助数据库处于联机状态并中断日志传送配置。 运行此命令后,将需要重新配置日志传送。 - 1 - RESTORE DATABASE [DB-Standby] WITH RECOVERY; 
关于监视库
以上测试中是没有使用监视库的,其配置方法参见下面通过SSMS导出的T-SQL代码。
也可以通过SSMS来添加监视实例。
| 1 | 
 | 
查看日志传送报表
- 连接到监视服务器、主服务器或辅助服务器。
- 在对象资源管理器中,右键单击服务器实例,依次指向“报表”和“标准报表”。
- 单击 “事务日志传送状态” 。
[!note]
SQL Server Management Studio (SSMS) 中的日志传送状态报告需要远程访问才能正常工作。