我目前正在 Maria <--> MSSQL 之间同步数据。那是2路同步。 我在 Windows 上使用 SQL Server,一切正常,直到几天前...我将所有测试数据库切换到 Linux 服务器,因此 MSSQL 在 Docker 容器(官方镜像)上运行。
我的环境
- MSSQL Docker image
- Ubuntu(还有 MacOS),确保了设备和 Docker 的 CPU 和 RAM 要求。
我的问题:
SQL 代理作业完美运行了约 10 分钟。之后,cdc.dbo_MyTrackedTable_CT
中没有捕获任何更改。
我希望这个 CDC 作业永远运行。
我收到这条消息:
Executed as user: 1b23b4b8a3ec\1b23b4b8a3ec$.
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32). [SQLSTATE 42000] (Error 217)
我的检查
EXEC msdb.dbo.sp_help_job
@job_name = N'cdc.MyDBName_capture',
@job_aspect = N'ALL' ;
返回:last_outcome_message
The job failed. The Job was invoked by User sa. The last step to run was step 2 (Change Data Capture Collection Agent).
.
接下来,做进一步的检查:
SELECT
job.*, '|' as "1"
, activity.*, '|' as "2", history.*
, CASE
WHEN history.[run_status] = 0 THEN 'Failed'
WHEN history.[run_status] = 1 THEN 'Succeeded'
WHEN history.[run_status] = 2 THEN 'Retry (step only)'
WHEN history.[run_status] = 3 THEN 'Canceled'
WHEN history.[run_status] = 4 THEN 'In-progress message'
WHEN history.[run_status] = 5 THEN 'Unknown'
ELSE 'N/A' END as Run_Status
FROM msdb.dbo.sysjobs_view job
INNER JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id
INNER JOIN msdb.dbo.sysjobhistory history ON job.job_id = history.job_id
WHERE 1=1
AND job.name = 'cdc.MyDBName_capture'
AND history.run_date = '20180122'
抱歉,我没有足够的声誉来嵌入 img,所以链接代替。
如您所见,CDC 作业将启动并运行...并...重试 10 次,10 次后,我无法再捕获更改。
我需要通过以下方式重新开始工作:
EXEC msdb.dbo.sp_start_job N'cdc.MyDbName_capture';
然后 foreach ~1 分钟,作业重试 --> 直到 10 --> 作业停止 ¯_(ツ)_/¯
那么你能告诉我为什么以及如何解决它吗??
仅供引用,这是我的工作配置:
-- https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-cdc-add-job-transact-sql
EXECUTE sys.sp_cdc_change_job
@job_type = N'capture',
@maxscans = 1,
@maxtrans = 500,
@continuous = true,
@pollinginterval = 1
;
这也不是触发问题,对吧?尝试关闭触发器时我感到很危险,但没有成功。
-- Turn off recursion trigger
ALTER DATABASE MyDBName
SET RECURSIVE_TRIGGERS OFF;
最佳答案
我在 Windows 服务器下运行的 SQL Server 2017 上遇到了同样的事情。有趣的是,同一个系统多年来一直在 SQL2012 下运行,没有出现任何问题,所以我认为这可能是在此过程中引入的一些错误。
我发现通过一些重试,问题得到了解决,因此作为一种解决方法,我编辑了作业并增加了重试次数,但还没有再次看到它。
关于sql-server - 为什么更改数据捕获 (SQL Server) 作业会在特定持续时间后自动停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379927/