SQL Server AlwaysOn下通过SQLAgent服务实现索引优化等任务
SQL Server Always On高可用下SQL Agent服务并非高可用,即这个服务是独立运行在各自的机器上的。这样就带来了一个问题,如想通过SQL Agent服务来实现索引优化,备份等任务时,如何保证任务在当前可以操作的数据库上执行,以保证计划按设计执行。
下面以索引重新生成计划为例进行说明:
(SQL Server Always On 为非域模式)
1. 将启动SQL Server的域用户或者非域用户增加为msdb下的SQLAgentOperatorRole和SQLAgentUserRole和SQLAgentReaderRole角色。以保证可以执行SQL Agent计划的权限。
2. 维护计划向导选择重新生成索引
3. 配置的时候服务器默认为本地服务器,所以并不具备高可用的功能
4. 为了解决该问题,需要增加判断当前运行的库是否主库的脚本,如果不是主库,则抛出异常,不在做优化的操作
T-SQL语句如下:
declare @errmsg nvarchar(300)='This is not primary replia'
if ((select sys.fn_hadr_is_primary_replica('V73GFTV20200804CLJ'))<>1)
begin
raiserror(@errmsg,16,1)
end
5. 测试验证
a) 当前库是辅助库的时候,执行失败,提示This is not primary replia
b) 当前库是主库的时候,成功完成调度
6. 然后在另外一个节点上,配置相同的计划
通过上述的配置就可以实现SQL Agent的计划只运行在主库上,来实现不管当前运行的主库在哪个节点上,都可以完成设计的计划。
注:
基于索引重新生成,建议还是通过自己写脚本的方式来实现,不要依赖于维护计划的重新生成索引服务。因为该计划默认会对每张表都进行一些SQL检查,导致执行时间变长。
declare @sql varchar(max)
set @sql=''
select @sql=@sql+'dbcc dbreindex('+name+')'+char(13) from
sys.tables where name not like 'tmp%' and name not like 'z[_]%'
if len(@sql)>0
exec(@sql)
SQL Server AlwaysOn下通过SQLAgent服务实现索引优化等任务
本文2024-09-23 01:17:53发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-145034.html