SQL server不同域之间搭建分布式可用性组

发布时间 2023-12-11 18:17:48作者: 上班去喝茶

配置 Always On 分布式可用性组

要创建分布式可用性组,必须创建两个具有各自侦听程序的可用性组。 然后将这些可用性组合并到分布式可用性组中。

两个可用性组无需处于同一位置:它们可以跨物理机、虚拟机;跨内网、云上;跨有域、无域;甚至跨平台(如Linux、Windows)。只要两个可用性组可以进行通信,就可以使用它们配置分布式可用性组。

IMG_256

本文所需环境:

域一:域名:AG01.COM (主ag)、alwayson可用性组:ag1、侦听器IP:192.168.8.7

主机一:主机名:RUNAG01.AG01.COM

IP:192.168.8.1

版本:SQL server 2016

主机二:主机名:RUNAG02.AG01.COM

IP:192.168.8.2

版本:SQL server 2016

域二:域名:AG02.COM (备ag)、alwayson可用性组:ag2 、侦听器IP:192.168.8.8

主机一:主机名:RUNDG01.AG02.COM

IP:192.168.8.3

版本:SQL server 2016

主机二:主机名:RUNDG02.AG02.COM

IP:192.168.8.4

版本:SQL server 2016

 

搭建域环境和安装数据库省略

创建端点

设置端点侦听程序以侦听所有 IP 地址

确保端点可在分布式可用性组中的不同可用性组之间进行通信。 如果将一个可用性组设置为端点上的特定网络,分布式可用性组将无法正常工作。 在分布式可用性组中承载副本的每台服务器上,将侦听器设置为侦听所有 IP 地址 (LISTENER_IP = ALL)。

创建一个端点以侦听所有 IP 地址

例如,以下脚本可在 TCP 端口 5022 上创建侦听所有 IP 地址的侦听程序端点,不带证书的端点。

SQL:

CREATE ENDPOINT [Hadr_endpoint]

STATE=STARTED

AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)

FOR DATA_MIRRORING (

ROLE = ALL,

AUTHENTICATION = WINDOWS NEGOTIATE,

ENCRYPTION = REQUIRED ALGORITHM AES

)

GO

更改一个端点以侦听所有 IP 地址

例如,以下脚本可更改侦听程序端点以侦听所有 IP 地址。

SQL:

ALTER ENDPOINT [aodns-hadr]

AS TCP (LISTENER_IP = ALL)

GO

创建带证书的端点

1.将托管主要副本的每个实例都需要数据库主密钥。 如果主密钥不存在,运行以下命令:

SQL

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd';

GO

2.在将为主要副本的实例上,创建将用于次要副本上的入站连接和用于保护主要副本上的端点的证书。

SQL

CREATE CERTIFICATE InstanceA_Cert

WITH SUBJECT = 'InstanceA Certificate';

GO

3.备份该证书。 如有必要,可以使用私钥提供进一步保护。 此示例使用私钥。

SQL

BACKUP CERTIFICATE InstanceA_Cert

TO FILE = 'Backup_path\InstanceA_Cert.cer';

WITH PRIVATE KEY(

FILE = 'C:\Asiyao',

ENCRYPTION BY PASSWORD = 'P@ssw0rd');

;

GO

重复步骤 2 和 3 以创建和备份每个次要副本的证书,并对证书采用适当的名称,如 InstanceB_Cert。

4.在主要副本上,必须为可用性组的每个次要副本创建登录名。 此登录名将被授予权限,以连接到域独立可用性组使用的端点。 例如,对于名为 InstanceB 的副本:

SQL

CREATE LOGIN InstanceB_Login WITH PASSWORD = 'P@ssw0rd';

GO

5.在每个次要副本上,为主要副本创建登录名。 此登录名将被授予权限,以连接到端点。 例如,在名为 InstanceB 的副本上:

SQL

CREATE LOGIN InstanceA_Login WITH PASSWORD = 'P@ssw0rd';

GO

6.在所有实例上,为创建的每个登录名创建一个用户。 在还原证书时会使用此用户。 例如,若要为主要副本创建用户:

SQL

CREATE USER InstanceA_User FOR LOGIN InstanceA_Login;

GO

对于可能是主要副本的任何副本,在所有相关次要副本上创建登录名和用户。

7.在每个实例上,为创建了登录名和用户的其他实例还原证书。 在主要副本上,还原所有次要副本证书。 在每个次要副本上,还原主要副本的证书,另外在任何其他副本上,也可能是还原主要副本的证书。 例如:

SQL

CREATE CERTIFICATE [InstanceB_Cert]

AUTHORIZATION InstanceB_User

FROM FILE = 'Restore_path\InstanceB_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Bsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

8.创建可用性组可在将为副本的实例上使用的端点。 对于可用性组,端点必须具有类型 DATABASE_MIRRORING。 SQL

CREATE ENDPOINT DIAG_EP

STATE = STARTED

AS TCP (

LISTENER_PORT = 5022,

LISTENER_IP = ALL

)

FOR DATABASE_MIRRORING (

AUTHENTICATION = CERTIFICATE InstanceX_Cert,

ROLE = ALL

)

向在该实例上创建的每个登录名分配权限,使其能够连接到端点。

SQL

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceX_Login];

GO

本次环境执行语句:

创建证书:

对于分布式可用性组,每个基础可用性组中的主要副本必须具有彼此的证书,即8.1端点使用8.3证书,8.3端点使用8.1证书;又因同alwayson组中端点必须一模一样,所以8.1和8.2使用8.3证书,8.3和8.4使用8.1证书。 如果已有未使用证书的端点,请使用 ALTER ENDPOINT 重新配置这些端点,以反映证书的使用

192.168.8.1:

SQL:

CREATE LOGIN InstanceA_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceA_User FOR LOGIN InstanceA_Login;

CREATE LOGIN InstanceB_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceB_User FOR LOGIN InstanceB_Login;

CREATE LOGIN InstanceC_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceC_User FOR LOGIN InstanceC_Login;

CREATE LOGIN InstanceD_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceD_User FOR LOGIN InstanceD_Login;

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Strong Password'; GO

CREATE CERTIFICATE InstanceA_Cert WITH SUBJECT = 'InstanceA Certificate'; GO

BACKUP CERTIFICATE InstanceA_Cert

TO FILE = 'C:\InstanceA_Cert.cer'

WITH PRIVATE KEY(

FILE = 'C:\Asiyao',

ENCRYPTION BY PASSWORD = 'P@ssw0rd');

;

GO

192.168.8.2:

SQL:

CREATE LOGIN InstanceA_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceA_User FOR LOGIN InstanceA_Login;

CREATE LOGIN InstanceB_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceB_User FOR LOGIN InstanceB_Login;

CREATE LOGIN InstanceC_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceC_User FOR LOGIN InstanceC_Login;

CREATE LOGIN InstanceD_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceD_User FOR LOGIN InstanceD_Login;

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'; GO

CREATE CERTIFICATE InstanceB_Cert WITH SUBJECT = 'InstanceB Certificate'; GO

BACKUP CERTIFICATE InstanceB_Cert

TO FILE = 'C:\InstanceB_Cert.cer'

WITH PRIVATE KEY(

FILE = 'C:\Bsiyao',

ENCRYPTION BY PASSWORD = 'P@ssw0rd');

;

GO

192.168.8.3:

SQL:

CREATE LOGIN InstanceA_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceA_User FOR LOGIN InstanceA_Login;

CREATE LOGIN InstanceB_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceB_User FOR LOGIN InstanceB_Login;

CREATE LOGIN InstanceC_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceC_User FOR LOGIN InstanceC_Login;

CREATE LOGIN InstanceD_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceD_User FOR LOGIN InstanceD_Login;

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'; GO

CREATE CERTIFICATE InstanceC_Cert WITH SUBJECT = 'InstanceC Certificate'; GO

BACKUP CERTIFICATE InstanceC_Cert

TO FILE = 'C:\InstanceC_Cert.cer'

WITH PRIVATE KEY(

FILE = 'C:\Csiyao',

ENCRYPTION BY PASSWORD = 'P@ssw0rd');

;

GO

192.168.8.4:

SQL:

CREATE LOGIN InstanceA_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceA_User FOR LOGIN InstanceA_Login;

CREATE LOGIN InstanceB_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceB_User FOR LOGIN InstanceB_Login;

CREATE LOGIN InstanceC_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceC_User FOR LOGIN InstanceC_Login;

CREATE LOGIN InstanceD_Login WITH PASSWORD = 'P@ssw0rd';

CREATE USER InstanceD_User FOR LOGIN InstanceD_Login;

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd'; GO

CREATE CERTIFICATE InstanceD_Cert WITH SUBJECT = 'InstanceD Certificate'; GO

BACKUP CERTIFICATE InstanceD_Cert

TO FILE = 'C:\InstanceD_Cert.cer'

WITH PRIVATE KEY(

FILE = 'C:\Dsiyao',

ENCRYPTION BY PASSWORD = 'P@ssw0rd');

;

GO

创建端点:

将每台服务器上的证书加私钥传输到其他三节点上后创建端点;

192.168.8.1:

SQL:

CREATE CERTIFICATE [InstanceB_Cert]

AUTHORIZATION InstanceB_User

FROM FILE = 'C:\InstanceB_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Bsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceC_Cert]

AUTHORIZATION InstanceC_User

FROM FILE = 'C:\InstanceC_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Csiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceD_Cert]

AUTHORIZATION InstanceD_User

FROM FILE = 'C:\InstanceD_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Dsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE ENDPOINT DIAG_EP

STATE = STARTED

AS TCP (

LISTENER_PORT = 5022,

LISTENER_IP = ALL

)

FOR DATABASE_MIRRORING (

AUTHENTICATION = CERTIFICATE InstanceC_Cert,

ROLE = ALL

)

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceA_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceB_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceC_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceD_Login]; GO

192.168.8.2:

SQL:

CREATE CERTIFICATE [InstanceA_Cert]

AUTHORIZATION InstanceA_User

FROM FILE = 'C:\InstanceA_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Asiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceC_Cert]

AUTHORIZATION InstanceC_User

FROM FILE = 'C:\InstanceC_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Csiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceD_Cert]

AUTHORIZATION InstanceD_User

FROM FILE = 'C:\InstanceD_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Dsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE ENDPOINT DIAG_EP

STATE = STARTED

AS TCP (

LISTENER_PORT = 5022,

LISTENER_IP = ALL

)

FOR DATABASE_MIRRORING (

AUTHENTICATION = CERTIFICATE InstanceC_Cert,

ROLE = ALL

)

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceA_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceB_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceC_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceD_Login]; GO

192.168.8.3:

SQL:

CREATE CERTIFICATE [InstanceA_Cert]

AUTHORIZATION InstanceA_User

FROM FILE = 'C:\InstanceA_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Asiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceB_Cert]

AUTHORIZATION InstanceB_User

FROM FILE = 'C:\InstanceB_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Bsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceD_Cert]

AUTHORIZATION InstanceD_User

FROM FILE = 'C:\InstanceD_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Dsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE ENDPOINT DIAG_EP

STATE = STARTED

AS TCP (

LISTENER_PORT = 5022,

LISTENER_IP = ALL

)

FOR DATABASE_MIRRORING (

AUTHENTICATION = CERTIFICATE InstanceA_Cert,

ROLE = ALL

)

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceA_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceB_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceC_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceD_Login]; GO

192.168.8.4:

SQL:

CREATE CERTIFICATE [InstanceA_Cert]

AUTHORIZATION InstanceA_User

FROM FILE = 'C:\InstanceA_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Asiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceB_Cert]

AUTHORIZATION InstanceB_User

FROM FILE = 'C:\InstanceB_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Bsiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE CERTIFICATE [InstanceC_Cert]

AUTHORIZATION InstanceC_User

FROM FILE = 'C:\InstanceC_Cert.cer'

WITH PRIVATE KEY (FILE = 'C:\Csiyao',

DECRYPTION BY PASSWORD = 'P@ssw0rd');

GO

CREATE ENDPOINT DIAG_EP

STATE = STARTED

AS TCP (

LISTENER_PORT = 5022,

LISTENER_IP = ALL

)

FOR DATABASE_MIRRORING (

AUTHENTICATION = CERTIFICATE InstanceA_Cert,

ROLE = ALL

)

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceA_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceB_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceC_Login]; GO

GRANT CONNECT ON ENDPOINT::DIAG_EP TO [InstanceD_Login]; GO

创建第一个可用性组

在第一个 Windows Server 故障转移群集 (WSFC) 上创建可用性组。

在此示例中, 主可用性组的主要副本在分布式可用性组中称为全局主要副本。 RUNAG01 是此示例中的全局主要副本。

192.168.8.1上执行:

SQL:

CREATE AVAILABILITY GROUP [ag1]

FOR DATABASE run

REPLICA ON N'RUNAG01' WITH (ENDPOINT_URL = N'TCP://RUNAG01.AG01.COM:5022',

FAILOVER_MODE = AUTOMATIC,

AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

BACKUP_PRIORITY = 50,

SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),

SEEDING_MODE = AUTOMATIC),

N'RUNAG01' WITH (ENDPOINT_URL = N'TCP://RUNAG02.AG01.COM:5022',

FAILOVER_MODE = AUTOMATIC,

AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

BACKUP_PRIORITY = 50,

SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),

SEEDING_MODE = AUTOMATIC);

GO

 

备注

上述示例使用自动种子设定,其中 SEEDING_MODE 设置为 AUTOMATIC,用于副本和分布式可用性组。 此配置将设置次要副本和次要可用性组自动填充,而无需手动备份和还原主要数据库。

将次要副本联接到主要可用性组

任何次要副本都必须使用 JOIN 选项联接到具有 ALTER AVAILABILITY GROUP 的可用性组。 由于在此示例中使用了自动种子设定,因此也必须调用具有 GRANT CREATE ANY DATABASE 选项的 ALTER AVAILABILITY GROUP。 此设置允许可用性组创建数据库并开始从主要副本自动进行种子设定。

在此示例中,在次要副本 RUNAG02上运行以下命令,以联接 ag1 可用性组。 允许可用性组在次要副本上创建数据库。

192.168.8.2上执行:

SQL

ALTER AVAILABILITY GROUP [ag1] JOIN

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE

GO

备注

当可用性组在辅助副本上创建数据库时,它将数据库所有者设置为运行 ALTER AVAILABILITY GROUP 语句的帐户以授予创建任意数据库的权限。 有关详细信息,请参阅授予可用性组在复制副本上创建数据库的权限。

为主要可用性组创建侦听程序

接下来,在第一个 WSFC 上为主要可用性组添加侦听器。 在此示例中,侦听器名为 ag1-listener。 有关创建侦听程序的详细说明,请参阅创建或配置可用性组侦听程序 (SQL Server)。

192.168.8.1上执行:

SQL

ALTER AVAILABILITY GROUP [ag1]

ADD LISTENER 'ag1-listener' (

WITH IP ('192.168.8.7') ,

PORT = 60173);

GO

 

创建第二个可用性组

在第二个 Windows Server 故障转移群集 (WSFC) 上创建可用性组。

然后,在第二个 WSFC 上创建次要可用性组 ag2。 在这种情况下,不会指定数据库,因为它会自动从主要可用性组进行种子设定。 辅助可用性组的主要副本在分布式可用性组中称为转发器。 在此示例中,RUNDG01 是转发器。

192.168.8.3上执行:

SQL

CREATE AVAILABILITY GROUP [ag2]

FOR

REPLICA ON N'RUNDG02' WITH (ENDPOINT_URL = N'TCP://RUNDG01.AG02.COM:5022',

FAILOVER_MODE = MANUAL,

AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

BACKUP_PRIORITY = 50,

SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),

SEEDING_MODE = AUTOMATIC),

N'RUNDG02' WITH (ENDPOINT_URL = N'TCP://RUNDG02.AG02.COM:5022',

FAILOVER_MODE = MANUAL,

AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,

BACKUP_PRIORITY = 50,

SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),

SEEDING_MODE = AUTOMATIC);

GO

备注

该次要可用性组必须使用相同的数据库镜像端点(此示例中为端口 5022)。 否则,在本地故障转移后,副本会停止。

将次要副本联接到次要可用性组

在此示例中,在次要副本 RUNDG02上运行以下命令,以联接 ag2 可用性组。 允许可用性组在次要副本上创建数据库以支持自动种子设定。

192.168.8.4上执行:

SQL

ALTER AVAILABILITY GROUP [ag2] JOIN

ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE

GO

为次要可用性组创建侦听器

接下来,在第二个 WSFC 上添加次要可用性组的侦听器。 在此示例中,侦听器名为 ag2-listener。 有关创建侦听程序的详细说明,请参阅创建或配置可用性组侦听程序 (SQL Server)。

192.168.8.4上执行:

SQL

ALTER AVAILABILITY GROUP [ag2]

ADD LISTENER 'ag2-listener' ( WITH IP ('192.168.8.8') , PORT = 60173);

GO

在第一个群集上创建分布式可用性组

在第一个 WSFC 上创建分布式可用性组(此示例中命名为 distributedag )。 使用具有 DISTRIBUTED 选项的 CREATE AVAILABILITY GROUP 命令。 AVAILABILITY GROUP ON 参数指定了成员可用性组、ag1 和 ag2。

主域使用自动种子设定创建分布式可用性组,请使用以下 Transact-SQL 代码:

192.168.8.1上执行:

SQL

CREATE AVAILABILITY GROUP [distributedag]

WITH (DISTRIBUTED)

AVAILABILITY GROUP ON

'ag1' WITH

(

LISTENER_URL = 'tcp://192.168.8.7:5022',

AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,

FAILOVER_MODE = MANUAL,

SEEDING_MODE = AUTOMATIC

),

'ag2' WITH

(

LISTENER_URL = 'tcp://192.168.8.8:5022',

AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,

FAILOVER_MODE = MANUAL,

SEEDING_MODE = AUTOMATIC

);

GO

备注

本次环境未配置dns解析域名,因此tcp直接使用侦听器IP加端口。

LISTENER_URL 为每个可用性组指定了侦听程序与可用性组的数据库镜像端点。 在此示例中,为端口 5022 (不是用于创建侦听程序的端口 60173 )。 如果使用的是负载均衡器,对于 Azure 中的实例,请向分布式可用性组端口添加负载均衡规则。 向侦听器端口添加规则,除了 SQL Server 实例端口。

在第二个群集上联接分布式可用性组

然后,在第二个 WSFC 上联接分布式可用性组。

本次使用手动种子设定联接分布式可用性组,请使用以下 Transact-SQL 代码:

192.168.8.3上执行:

SQL

ALTER AVAILABILITY GROUP [distributedag]

JOIN

AVAILABILITY GROUP ON

'ag1' WITH

(

LISTENER_URL = 'tcp://192.168.8.7:5022',

AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,

FAILOVER_MODE = MANUAL,

SEEDING_MODE = MANUAL

),

'ag2' WITH

(

LISTENER_URL = 'tcp://192.168.8.8:5022',

AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,

FAILOVER_MODE = MANUAL,

SEEDING_MODE = MANUAL

);

GO

备注

本次环境未配置dns解析域名,因此tcp直接使用侦听器IP地址加端口。

如果使用手动种子设定在转发器上创建数据库,请从全局主数据库执行完整备份和事务日志备份,并使用 NORECOVERY 选项将其还原到转发器。 (备份还原过程省略)

之后,在转发器上运行以下内容

192.168.8.3上执行:

SQL

ALTER DATABASE [run] SET HADR AVAILABILITY GROUP = [distributedag]

从可用性组数据库添加省略。

至此分布式可用性组搭建完毕。