sql-server - 为什么更改数据捕获 (SQL Server) 作业会在特定持续时间后自动停止?

标签 sql-server linux docker change-data-capture

我目前正在 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'

返回: See this SQL result Image

抱歉,我没有足够的声誉来嵌入 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/

相关文章:

php - PDOStatement::nextRowset() 不适用于 dblib 和 MSSQL

python - 安装 Miniconda 时出现 UnsatisfiableError

docker - docker restart和docker-compose restart之间的区别

docker - 弹性心跳响应检查 TCP 错误

linux - 如何重新安装最新的cmake版本?

docker - Mesos,马拉松,Docker,Wildfly

sql - 如何更新 sql server 中的前 100 条记录

sql-server - 如何向 SQL 连接字符串添加自定义属性?

sql-server - 完成 SSIS 作业时触发 SSRS 报告

linux - 使用 'sh' 运行脚本时无法使用内置 bash 命令