我有一个数据库 Microsoft SQL Server 2008 r2。定义了一个名为 marie 的用户,该用户可以访问主数据库上的表;这很好用。现在,我希望 marie 能够执行此查询:
SELECT resource_type,spid,login_time,status,hostname,program_name,nt_domain,nt_username,loginame
FROM sys.dm_tran_locks dl
JOIN sys.sysprocesses sp on dl.request_session_id = sp.spid
Run Code Online (Sandbox Code Playgroud)
涉及的表是主表;我如何允许玛丽阅读它们?我已经尝试以 dbo 身份执行以下操作:
GRANT ALL on sys.dm_tran_locks TO marie
GRANT ALL on sys.sysprocesses TO marie
Run Code Online (Sandbox Code Playgroud)
尽管如此,当 marie 尝试执行上面的查询时,错误是:
Msg 297, Level 16, State 1, Line 1
The user does not have permission to perform this action.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我有一个中央数据库,我将所有服务器上的作业结果写回。我通过 SQL 作业中的 powershell 将 3 个参数传递回中央服务器上的 sp 验证作业应该在当时运行等。然后通过 SSRS 公开信息,以便我们可以看到作业失败/长时间运行的作业/ & 尚未运行但应该运行的作业(或者如果有人搞砸了时间表)。
为此,我在每台服务器上的每个作业中添加了 2 个作业步骤,并且我想将脚本减少到每个作业中仅添加 1 个步骤……甚至可能从网络共享中调用它。
但我的问题是我传递的 3 个参数之一。我需要从正在执行的作业中获取正在执行的作业 ID 或作业名称,因此我不必对名称参数进行硬编码。我传递的 3 个参数是 jobid、status(success/fail)、errormsg。我编写的 powershell 脚本非常简单。
Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME/ID','Success/FAIL','BAD MESSAGE HERE'"
这将我需要的东西写到桌子上。我查看了 msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / 但这些都不能保证在有超过 1 个作业在执行的情况下我得到正确执行作业的 ID 或名称同时。
我什至尝试查看 sys.sysprocesses,但我认为由于代理作业是一个 powershell 脚本,它显示为“.Net SqlClient 数据提供程序”,因此我无法从显示为“SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C : Step 1)”---这是我从Denny Cherry 的帖子中学到的- 谢谢 Denny-
任何关于如何获取正在执行的 jobid 的想法将不胜感激。
谢谢,
克里斯
所以我最近才在始终在线的 AG 上启用 CDC。虽然许多消息来源声称在alwaysON AG上启用CDC就像在任何独立服务器上一样简单,但事实证明事实并非如此。正如 MS所说:
您应该在故障转移之前在所有可能的故障转移目标上创建[CDC 捕获和清理]作业,并将它们标记为禁用,直到主机上的可用性副本成为新的主副本。当本地数据库成为辅助数据库时,还应禁用在旧主数据库上运行的 CDC 作业。若要禁用和启用作业,请使用 sp_update_job (Transact-SQL) 的 @enabled 选项。有关创建 CDC 作业的详细信息,请参阅 sys.sp_cdc_add_job (Transact-SQL)。
事实证明,在我们在主副本上启用 CDC 后,辅助副本上绝对没有发生任何事情。因此,根据 MS 的建议,我进行了手动故障转移,并在那里创建了作业,然后又进行了一次故障转移回原始主数据库。
显然,正如上面引用中所暗示的那样,尽管 CDC 应该与alwaysOn AG 完全兼容,但它完全无法确定它当前是在主副本还是辅助副本上运行。
那么,背景介绍完了,让我们来回答我的问题:如何保证 CDC 作业始终在当前主副本上启用?并始终在辅助设备上禁用(以免产生错误)?
显然,alwaysOn AG 的一个重要点是,无论出于何种原因,您都不需要在主数据库因任何原因发生故障时手动到达那里,因为辅助数据库将弥补空闲并保持系统在线,我认为然后预计它会创建每个副本上的一个作业,不断轮询它们的状态并改变 CDC 作业的状态?
如果这是正确的,您对如何进行此操作有什么具体建议、具体脚本或指南等吗?因为显然这在全球范围内是一个相当普遍的困境,我必须在每个副本上手动创建一个新的 TSQL 作业,只是为了使用alwaysOn AG 执行 CDC 的基本基本功能,这似乎很奇怪。
这似乎不太可能,这就是我问的原因。或者我误解了什么?谢谢!
当使用 AOHA 集群的 SQL Server 代理调度作业时,是否像您将服务器分开一样使用主目标配置?或者是否有更好的方法将作业分发到所有服务器,以便在主服务器出现故障时其中一个副本可以获取它们?
在 MS SQL Server 2014 AlwaysOn AG 设置中,我想为给定的可用性组安排备份作业。最终目标是在同步的辅助节点上运行定期备份,最重要的是,不受特定辅助节点的可用性限制。
到目前为止,我看到的方法是使用 SQL Server 调度程序,在所有正在运行的实例上设置相同的作业,并将条件逻辑引入调度程序步骤,以确定角色是主要角色还是次要角色。由于以下几个原因,这对我的用例不起作用:
备份作业包括BACKUP LOG [...] WITH COMPRESSION, NOINIT, NOFORMAT每 15 分钟运行一次。
现在,我正在考虑创建一个绑定到相应 AG 的故障转移集群角色的集群计划任务,但想知道是否有更简单和简化的方法来实现这一点。
我有只需要在 AlwaysOn 可用性组上的主要副本上的 SQL 作业。最初创建作业时,ServerA 是主要的,后来 ServerB 成为主要的,因此 ServerA 上的作业失败,必须在 ServerB 上手动重新创建作业才能正常运行。
仅在 AlwaysOn 可用性组的主副本上运行作业的方法是什么?
IF (SELECT ars.role_desc
FROM sys.dm_hadr_availability_replica_states ars
INNER JOIN sys.availability_groups ag
ON ars.group_id = ag.group_id
AND ars.is_local = 1) <> 'PRIMARY'
BEGIN
--We're on the secondary node, throw an error
THROW 50001, 'Unable to execute job on secondary node',1
END
Run Code Online (Sandbox Code Playgroud)
设置此步骤以在成功时继续下一步,并在失败时退出报告成功的作业。
你能解释一下如何在所有现有的 SQL 服务器作业中添加这个步骤吗?