介绍
Microsoft 支持 Linux 上的 SQL Server,它具有许多与 Windows 版本相同的功能。您可以将数据库从 Windows 恢复到 Linux SQL,反之亦然。Linux SQL 适用于 Red Hat、Ubuntu、SUSE 企业、Kubernetes 容器和 Docker。
基于 Windows 的 SQL 实例支持 SQL Server Always On 可用性组以实现高可用性和灾难恢复。如果您不熟悉 Windows AG 配置,请参阅有关 Always on 可用性组的广泛系列(底部的 Toc)。
如果您同时拥有 Windows 和 Linux SQL Server,是否可以在它们之间配置可用性组?让我们在本文中探讨这一点。
要求
我们需要以下环境来实现 Windows 和 Linux Always On。
- 基于 Windows 的 SQL 实例:对于本文,我们使用 SQL Server 2019 开发人员版。
- SQL 实例:WindowsSQL
- Linux SQL 实例:参考Linux 上的 SQL Server类别,在 Ubuntu 上部署 SQL 实例。Linux SQL 实例应运行 SQL 2019 开发人员版。
- SQL 实例:LinuxSQL

步骤 1:配置 Always-on for Windows SQL 实例
对于演示,我们如下配置 SQL Server Always On 可用性组配置。
- 主 AG:Windows SQL 实例
- 辅助 AG:Linux SQL 实例
在 Windows 中启用 Always on 可用性组
启动 SQL Server 配置管理器并选中选项 - 启用 Always On 可用性组。

单击确定并重新启动 SQL 服务以启用可用性组。

混合模式认证
连接到 Windows SQL 实例,点击 SQL Server 属性中的安全,并确保它对 SQL 实例使用混合模式身份验证(SQL Server 和 Windows 身份验证模式)。

配置主机文件
在主机文件中,指定 Linux 服务器的 IP 地址和主机名。从 C:\Windows\System32\drivers\etc 在记事本中打开主机文件并添加 Linux 主机名、IP 地址。
对于我的环境,我按以下格式输入 Linux 服务器的 IP 地址和主机名。
192.168.0.102 linuxsql
Windows 防火墙
如果您使用 Windows 防火墙,请确保它允许端口 1433 和 5022 进行通信。
创建数据库用户
使用 CREATE LOGIN 和 CREATE USER 语句在主副本实例上创建数据库登录名和密码。
CREATE LOGIN dbm_login WITH PASSWORD = 'Test@1234';
Go
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
创建主密钥和证书,然后使用私钥备份证书
在这一步中,我们创建一个数据库主密钥和证书。此外,我们获取证书及其私钥备份。稍后,我们需要使用此证书备份将证书部署在 Linux SQL 实例上。
- 创建主密钥:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Test@1234';
- 创建证书
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
- 备份证书并用密码加密
BACKUP CERTIFICATE dbm_certificate
TO FILE = 'C:\temp\dbm_certificate.cer'
WITH PRIVATE KEY (
FILE = 'C:\temp\dbm_certificate.pvk',
ENCRYPTION BY PASSWORD = ' Test@1234'
);
GO
步骤 2:配置 Always-on for Linux SQL 实例
在 Linux 中启用 Always on 可用性组
Linux 上的 SQL Server 提供 mssql-conf 实用程序来启用 HADR 始终在线功能。运行以下命令以通过 mssql-conf 启用 hadr。
sudo /opt/mssql/bin/mssql-conf 设置 hadr.hadrenabled 1
启用 HADR 功能后,使用以下命令重新启动 SQL 服务 -
sudo systemctl restart mssql-server.service
配置主机文件
在 Linux 环境中,主机文件位于 /etc/hosts。使用 vi 编辑器输入 Windows SQL Server 名称和 IP 地址。以下屏幕截图指定了 Windows 操作系统的 192.168.0.100 IP 地址。

配置 Linux 防火墙
如果您在 Linux 中使用防火墙,请确保它允许端口 5022 用于端点通信。
创建数据库用户
连接到 Linux SQL 实例并使用以下脚本创建登录。
CREATE LOGIN dbm_login WITH PASSWORD = 'Test@1234';
Go
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
步骤 3:将证书和私钥从 Windows 复制到 Linux 服务器
我们需要将证书备份及其私钥从 Windows 复制到 Linux SQL Server。您可以使用 FileZilla 等应用程序将文件从 Windows 服务器复制到 Linux。我们需要将证书和私钥保存在/var/opt/mssql/data中。
此外,使用以下脚本为 mssql 用户设置所有者和组权限。
sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.pvk
sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.cer

配置跨平台 SQL Server Always On 可用性组
2022 年 8 月 10 日, 作者:拉金德拉·古普塔
ApexSQL 定价
Always On 可用性组系列 文章将展示如何在 Windows 和 Linux SQL 实例之间配置 SQL Server Always On 可用性组。
介绍
Microsoft 支持 Linux 上的 SQL Server,它具有许多与 Windows 版本相同的功能。您可以将数据库从 Windows 恢复到 Linux SQL,反之亦然。Linux SQL 适用于 Red Hat、Ubuntu、SUSE 企业、Kubernetes 容器和 Docker。
基于 Windows 的 SQL 实例支持 SQL Server Always On 可用性组以实现高可用性和灾难恢复。如果您不熟悉 Windows AG 配置,请参阅有关 Always on 可用性组的广泛系列(底部的 Toc)。
如果您同时拥有 Windows 和 Linux SQL Server,是否可以在它们之间配置可用性组?让我们在本文中探讨这一点。
要求
我们需要以下环境来实现 Windows 和 Linux Always On。
基于 Windows 的 SQL 实例:对于本文,我们使用 SQL Server 2019 开发人员版。
SQL 实例:WindowsSQL
Linux SQL 实例:参考Linux 上的 SQL Server类别,在 Ubuntu 上部署 SQL 实例。Linux SQL 实例应运行 SQL 2019 开发人员版。
SQL 实例:LinuxSQL
在 Windows 和 Linux SQL 之间配置 SQL Server Always On 可用性组的步骤
本文在 Windows 和 Linux SQL 实例之间配置跨平台 AG。您不能在这里使用集群,因为没有集群机制来管理 Linux 和 Windows 服务器。
Windows 到 Linux 辅助 SQL Server Always On 可用性组
步骤 1:配置 Always-on for Windows SQL 实例
对于演示,我们如下配置 SQL Server Always On 可用性组配置。
主 AG:Windows SQL 实例
辅助 AG:Linux SQL 实例
在 Windows 中启用 Always on 可用性组
启动 SQL Server 配置管理器并选中选项 - 启用 Always On 可用性组。
在 Windows 中启用 Always on 可用性组
单击确定并重新启动 SQL 服务以启用可用性组。
警告
混合模式认证
连接到 Windows SQL 实例,点击 SQL Server 属性中的安全,并确保它对 SQL 实例使用混合模式身份验证(SQL Server 和 Windows 身份验证模式)。
混合模式认证
配置主机文件
在主机文件中,指定 Linux 服务器的 IP 地址和主机名。从 C:\Windows\System32\drivers\etc 在记事本中打开主机文件并添加 Linux 主机名、IP 地址。
对于我的环境,我按以下格式输入 Linux 服务器的 IP 地址和主机名。
192.168.0.102 linuxsql
Windows 防火墙
如果您使用 Windows 防火墙,请确保它允许端口 1433 和 5022 进行通信。
创建数据库用户
使用 CREATE LOGIN 和 CREATE USER 语句在主副本实例上创建数据库登录名和密码。
CREATE LOGIN dbm_login WITH PASSWORD = ‘Test@1234’;
Go
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
创建主密钥和证书,然后使用私钥备份证书
在这一步中,我们创建一个数据库主密钥和证书。此外,我们获取证书及其私钥备份。稍后,我们需要使用此证书备份将证书部署在 Linux SQL 实例上。
创建主密钥:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘Test@1234’;
创建证书
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = ‘dbm’;
备份证书并用密码加密
BACKUP CERTIFICATE dbm_certificate
TO FILE = ‘C:\temp\dbm_certificate.cer’
WITH PRIVATE KEY (
FILE = ‘C:\temp\dbm_certificate.pvk’,
ENCRYPTION BY PASSWORD = ’ Test@1234’
);
GO
步骤 2:配置 Always-on for Linux SQL 实例
在 Linux 中启用 Always on 可用性组
Linux 上的 SQL Server 提供 mssql-conf 实用程序来启用 HADR 始终在线功能。运行以下命令以通过 mssql-conf 启用 hadr。
sudo /opt/mssql/bin/mssql-conf 设置 hadr.hadrenabled 1
启用 HADR 功能后,使用以下命令重新启动 SQL 服务 -
sudo systemctl restart mssql-server.service
配置主机文件
在 Linux 环境中,主机文件位于 /etc/hosts。使用 vi 编辑器输入 Windows SQL Server 名称和 IP 地址。以下屏幕截图指定了 Windows 操作系统的 192.168.0.100 IP 地址。
配置主机文件
配置 Linux 防火墙
如果您在 Linux 中使用防火墙,请确保它允许端口 5022 用于端点通信。
创建数据库用户
连接到 Linux SQL 实例并使用以下脚本创建登录。
CREATE LOGIN dbm_login WITH PASSWORD = ‘Test@1234’;
Go
CREATE USER dbm_user FOR LOGIN dbm_login;
GO
步骤三:将证书和私钥从 Windows 复制到 Linux 服务器
我们需要将证书备份及其私钥从 Windows 复制到 Linux SQL Server。您可以使用 FileZilla 等应用程序将文件从 Windows 服务器复制到 Linux。我们需要将证书和私钥保存在/var/opt/mssql/data中。
此外,使用以下脚本为 mssql 用户设置所有者和组权限。
sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.pvk
sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.cer
检查目录空间
步骤四:在 Linux 实例上创建证书
此步骤使用从 Windows SQL 复制的证书备份和私钥创建证书。
该脚本指定 SQL 用户dbm_user进行授权。
在 - DECRYPTION BY PASSWORD 部分中指定解密密码。此密码应与我们使用 ENCRYPTION BY PASSWORD 进行证书备份时使用的密码相同。

步骤五:在 Windows(主要)和 Linux(次要)AG 副本上创建端点
在 Windows 和 Linux AG 副本上执行以下 CREATE ENDPOINT 脚本。它使用端口 5022 进行通信。
该脚本还启动端点 (STATE=STARTED),并向端点上的 SQL 登录授予连接权限。它为认证目的指定证书。

步骤 六:在主副本上创建可用性组
在 Windows SQL(主副本)上执行以下脚本以创建可用性组。该脚本使用以下值。
CLUSTER_TYPE=NONE:我们在跨平台 SQL Server Always On 可用性组中没有集群。因此,将 CLUSTER_TYP 用作 NONE。
可用性模式:使用异步提交可用性模式。
- SEEDING MODE:使用手动种子模式,因为 Windows 和 Linux 中的数据库路径不同。
- FAILOVER_MODE:仅支持手动故障转移。
- SECONDARY_ROLE:允许辅助 AG 的所有连接。
CREATE AVAILABILITY GROUP [ag1]
WITH (CLUSTER_TYPE = NONE)
FOR REPLICA ON
N'WindowsSQL'
WITH (
ENDPOINT_URL = N'tcp://WindowsSQL:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = MANUAL,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N'LinuxSQL'
WITH (
ENDPOINT_URL = N'tcp://LinuxSQL:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = MANUAL,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
)
GO
步骤七:加入辅助副本上的可用性组
在辅助副本上,使用 ALTER AVAILABILITY GROUP 语句加入可用性组。
ALTER AVAILABILITY GROUP
[ag1] JOIN WITH (CLUSTER_TYPE = NONE)
步骤八:将数据库添加到可用性组
在主副本中创建一个新数据库并执行以下步骤。
- 在 Windows(主)SQL 上进行完整备份
- 使用 FileZilla 将完整备份复制到 Linux SQL。
- 在 Linux SQL 实例中将备份恢复为 NORECOVERY MODE。
- 在主副本上运行以下语句以将数据库添加到可用性组中
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [ImportDB]
GO
步骤九:启动 AG 仪表板并查看其运行状况
连接到 SSMS 中的主 SQL 实例并启动 AG 仪表板。如下所示,可用性组状态是健康的。AG是异步状态;因此,它的同步状态是Synchronizing。

跨平台系统中的 SQL Server Always On 可用性组故障转移
您可以通过两种方式在跨平台集群中从主副本故障转移到辅助副本。
- 没有数据丢失的手动故障转移
- 可能会丢失数据的强制故障转移
让我们探索 AG 故障转移的两种方法。
没有数据丢失的手动故障转移
您可以按照以下步骤进行手动故障转移,而不会丢失数据。
- 连接主副本并将AG模式修改为同步提交。
ALTER AVAILABILITY GROUP [ag1]
MODIFY REPLICA ON N'linuxsql'
WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
Go
ALTER AVAILABILITY GROUP [ag1]
MODIFY REPLICA ON N'WindowsSQL'
WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT)
GO
它将副本更改为同步状态。

使用以下 ALTER AVAILABILITY GROUP 语句将可用性组置于离线状态。
更改可用性组 [AG1] 离线
将次要目标副本提升为主:
ALTER AVAILABILITY GROUP
AG1 FORCE_FAILOVER_ALLOW_DATA_LOSS;
以下语句将旧主节点的角色更改为辅助节点。在旧的主副本上执行以下语句。
ALTER AVAILABILITY GROUP [AG1]
SET (ROLE = SECONDARY);
可用性组中的辅助数据库仍处于 SUSPEND 状态。您可以在辅助实例上使用以下语句恢复可用性组同步。
ALTER DATABASE [ImportDB] SET HADR RESUME
现在,您可以从新的主副本重新启动 AG 仪表板,它显示 Linux SQL 实例正在作为主副本工作。

数据丢失的强制手动故障转移
假设主副本实例已关闭。因此,要使数据库在辅助副本中可用,您需要强制故障转移,并且可能会涉及数据丢失
在辅助副本(新的主副本)上,使用 FORCE_FAILOVER_ALLOW_DATA_LOSS 参数启动强制故障转移。
ALTER AVAILABILITY GROUP
[AG1] FORCE_FAILOVER_ALLOW_DATA_LOSS;
从可用性组中删除原始主副本:
ALTER AVAILABILITY GROUP [AG1]
REMOVE REPLICA ON N'linuxsql';
如果旧的主副本联机,它会尝试担任主角色。因此,一旦它上线,立即在原始主节点上使可用性组 AG1 脱机:
ALTER AVAILABILITY GROUP [AG1] OFFLINE
然后删除原始(旧)主副本上的可用性组和数据库。
DROP AVAILABILITY GROUP [AG1];
USE [master]
GO
DROP DATABASE [ImportDB]
GO
结论
本文配置了 Windows 和 Linux SQL Server 之间的跨平台 SQL Server Always On 可用性组。它有助于手动灾难恢复、迁移和读取规模的工作负载。它不支持自动故障转移,因为没有跨平台集群配置。
原文标题:Configure cross-platform SQL Server Always On Availability Groups
原文作者:Rajendra Gupta
原文地址:sqlshack.com/configure-cross-platform-sql-server-always-on-availability-groups/




