ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO
#### 6.4创建高可用组
可以用SSMS工具和T-SQL两种方式,下面以T-SQL为例:
运行以下脚本在`主节点`中创建一个可用性组。 请注意,选择`CLUSTER_TYPE = NONE`选项是因为它是在没有诸如Pacemaker或Windows Server故障转移群集之类的群集管理平台的情况下安装的。
如果要在Linux上安装AlwaysOn AG,则应为Pacemaker选择CLUSTER\_TYPE = EXTERNAL:
CREATE AVAILABILITY GROUP [AG1]
WITH (CLUSTER_TYPE = NONE)
FOR REPLICA ON
N’sql01’
WITH (
ENDPOINT_URL = N’tcp://192.168.1.30:5022’,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N’sql02’
WITH (
ENDPOINT_URL = N’tcp://192.168.1.31:5022’,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N’sql03’
WITH (
ENDPOINT_URL = N’tcp://192.168.1.32:5022’,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
);
GO
在从库中执行以下命令,将从库加入到AG组中
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO
至此在Docker容器中安装SQL Server Alwayson集群已经完成了!
>
> 注意:当指定`CLUSTER_TYPE = NONE`创建可用组时,在执行故障转移时需执行以下命令
>
>
>
> ```
> -- 将主角色转移到可用性组中的某个备份副本
> ALTER AVAILABILITY GROUP [ag1] FORCE_FAILOVER_ALLOW_DATA_LOSS;
> -- 尝试进行优雅的故障转移,如果不能完成,则允许丢失数据
> -- ALTER AVAILABILITY GROUP [ag1] FAILOVER;
>
> ```
>
>
#### 6.5测试
在主库上创建一个数据库,并加入到可用组AG中。
–创建数据库
CREATE DATABASE agtestdb;
GO
ALTER DATABASE agtestdb SET RECOVERY FULL;
GO
BACKUP DATABASE agtestdb TO DISK = ‘/var/opt/mssql/data/agtestdb.bak’;
GO
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [agtestdb];
GO
– 创建表
use agtestdb
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Name NVARCHAR(50),
Description NVARCHAR(100)
);
– 插入数据
DECLARE @counter INT = 1;
WHILE @counter <= 100
BEGIN
INSERT INTO ExampleTable (ID, Name, Description)
VALUES (@counter, 'Name ’ + CAST(@counter AS NVARCHAR(10)), 'Description for ’ + CAST(@counter AS NVARCHAR(10)));
SET @counter = @counter + 1;
END;
GO
通过SSMS查看同步状态是否正常.
#### 6.6监控 AG 状态
通过以下这些视图可以监控 AG 中各个部分的状态。
**group的监控**
>
> select \* from sys.availability\_groups; select \* from sys.availability\_groups\_cluster; select \* from sys.dm\_hadr\_availability\_group\_states;
>
>
>
**replica 的监控**
>
> select \* from sys.availability\_replicas; select \* from sys.dm\_hadr\_availability\_replica\_states; select \* from sys.dm\_hadr\_availability\_replica\_cluster\_nodes; select \* from sys.dm\_hadr\_availability\_replica\_cluster\_states;
>
>
>
**在 AG 中的 database 的监控**
>
> select \* from sys.availability\_databases\_cluster; select \* from sys.dm\_hadr\_database\_replica\_states; select \* from sys.dm\_hadr\_database\_replica\_cluster\_states; select name,database\_id,replica\_id,group\_database\_id from sys.databases;
>
>
>
#### 6.7故障转移读取缩放AG上的主要副本
每个可用性组仅有一个主要副本。 主要副本允许读取和写入操作。 若要更改哪个副本为主要副本,可进行故障转移。 在典型的可用性组中,群集管理器自动执行故障转移过程。 在群集类型为 NONE 的可用性组中,需手动执行故障转移过程。
在群集类型为 NONE 的可用性组中,有两种对主要副本进行故障转移的方法:
>
> 手动故障转移(无数据丢失)
> 强制手动故障转移(会丢失数据)
>
>
>
**手动故障转移(无数据丢失)**
主要副本可用时使用此方法,但你需要暂时或永久更改托管主要副本的实例。 若要避免潜在的数据丢失,发出手动故障转移前,确保目标次要副本为最新版本。
手动故障转移(无数据丢失):
1. 将当前的主要副本和目标次要副本设置为 SYNCHRONOUS\_COMMIT。
ALTER AVAILABILITY GROUP [AGRScale]
MODIFY REPLICA ON N’’
WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
2. 若要确定已将活动事务提交到主要副本和至少一个同步次要副本,请运行以下查询:
SELECT ag.name,
drs.database_id,
drs.group_id,
drs.replica_id,
drs.synchronization_state_desc,
ag.sequence_number
FROM sys.dm_hadr_database_replica_states drs, sys.availability_groups
ag
WHERE drs.group_id = ag.group_id;
当 synchronization\_state\_desc 为 SYNCHRONIZED 时,会同步次要副本。
3. 将 REQUIRED\_SYNCHRONIZED\_SECONDARIES\_TO\_COMMIT 更新为 1。以下脚本在名为 ag1 的可用性组上将REQUIRED\_SYNCHRONIZED\_SECONDARIES\_TO\_COMMIT 设置为 1。 运行以下脚本前,将ag1 替换为可用性组的名称:
ALTER AVAILABILITY GROUP [AGRScale]
SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
此设置可确保将每个活动事务提交到主要副本和至少一个同步次要副本。
**备注**
此设置并非特定于故障转移,应根据环境要求进行设置。
4. 将主要副本和不参与故障转移的次要副本设置为脱机,以便为角色更改做好准备:
ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
5. 将目标次要副本升级为主要副本。
ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS;
6. 将旧的主要和其他次要副本的角色更新为 SECONDARY,在托管旧的主要副本的 SQL Server 实例上运行以下命令:
ALTER AVAILABILITY GROUP [AGRScale]
SET (ROLE = SECONDARY);
**备注**
若要删除可用性组,请使用**删除可用性组**。 对于使用群集类型为 NONE 或EXTERNAL 创建的可用性组,请对可用性组的所有副本执行该命令。
7. 恢复数据移动,为托管主要副本的 SQL Server(主要和次要副本) 实例上的可用性组中的每个数据库运行以下命令:
ALTER DATABASE [db1]
SET HADR RESUME
8. 重新创建出于读取缩放目的创建且不受群集管理器管理的所有侦听器。 如果原始侦听器指向旧的主要副本,请将其删除,然后将其重新创建为指向新的主要副本。
**强制手动故障转移(会丢失数据)**
如果主要副本不可用且无法立即恢复,则需要强制执行向次要副本的故障转移(存在数据丢失)。 但是,如果原始主要副本在故障转移后恢复,它将承担主要角色。 若要避免每个副本处于不同的状态,在存在数据丢失的情况下进行强制故障转移后,从可用性组中删除原始主要副本。 原始主要副本重新联机后,从该副本完全删除该可用性组。
若要强制执行从主要副本 N1 到次要副本 N2 的手动故障转移(存在数据丢失),请执行以下步骤:
1. 在次要副本 (N2) 上,启动强制故障转移:
ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;
2. 在新的主要副本 (N2) 上,删除原始主要副本 (N1):
ALTER AVAILABILITY GROUP [AGRScale]
REMOVE REPLICA ON N’N1’;
3. 验证所有的应用程序流量均指向侦听器和/或新的主要副本。
4. 如果原始主要副本 (N1) 进入联机状态,则立即在原始主要副本 (N1) 上使可用性组AGRScale 脱机:
ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
5. 如果存在数据或未同步的更改,则通过备份或其他可满足业务需求的数据复制选项来保存这些数据。
6. 接下来,从原始主要副本 (N1) 中删除可用性组:
DROP AVAILABILITY GROUP [AGRScale];
7. 删除原始主要副本 (N1) 上的可用性组数据库:
USE [master]
GO
DROP DATABASE [AGDBRScale]
GO
8.(可选)如果需要,现可将 N1 作为新的次要副本添加回可用性组 AGRScale 中。
在主库中执行以下命令,将从库加入到AG组中
use master
ALTER AVAILABILITY GROUP AG1 ADD REPLICA ON ‘sql01’
WITH (
ENDPOINT_URL = ‘TCP://192.168.30:5022’,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
);
GO
在从库中执行以下命令,将从库加入到AG组中
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO
### 7.参考连接
1. <https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15>
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/e354301bef0e5e8756007689c70bdc61.png)
![img](https://img-blog.csdnimg.cn/img_convert/804ad6485b4f3e8ab7b4c64bfecc1055.png)
![img](https://img-blog.csdnimg.cn/img_convert/6cfbd63b82c00d6eebd00954225488eb.png)
![img](https://img-blog.csdnimg.cn/img_convert/149db5af7d145df4203b06d4c8c6307d.png)
![img](https://img-blog.csdnimg.cn/img_convert/7367bd0b1532b7c5cf4a6caf4f500f9f.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/bd819598790fc06b0376e8dcbbebbb6e.jpeg)
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/8365f42cdcfb5de848a550d4a7175c82.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/546ed6c4be7f7b74272b870cc7df9b82.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/ff08474be59a1603a58e7b0c199b6ed1.jpeg)
658293725)]
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
[外链图片转存中...(img-fiY7WoeJ-1712658293725)]
给大家整理的电子书资料:
[外链图片转存中...(img-ALpVNNVH-1712658293725)]
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-zs1BtlJ5-1712658293726)]