SQL Server AlwaysOn下通过SQLAgent服务实现索引优化等任务

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

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服务实现索引优化等任务

SQL Server Always On高可用下SQL Agent服务并非高可用,即这个服务是独立运行在各自的机器上的。这样就带来了一个问题,如想通过SQL ...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息