DBLink 查询即使在完成后也不会终止

Posted

技术标签:

【中文标题】DBLink 查询即使在完成后也不会终止【英文标题】:DBLink query doesn't terminate even after it completes 【发布时间】:2019-10-17 08:29:21 【问题描述】:

我有一个 Dblink 查询 Amazon RDS (Postgres),它使用来自 Amazon Redshift 集群的行执行 INSERT。 查询在 15/20 分钟后终止,如果不是更多的话,但我可以看到所有行都在几分钟后被插入。 我正在通过 JetBrains 的 DataGrip 运行这些查询。

同一连接上的其他一些类似的 dblink,按预期终止。 我看到的唯一区别是表格的大小,在第一种情况下更大。

所有这些查询都只是复制整个表。差不多是这样的:

insert into rds_table(
  select *
  from db_link('foreign_server',
    $REDSHIFT$
      select *
      from redshift_table
    $REDSHIFT$) as table_n(...)
);

“外国服务器”是我与 Redshift 的连接。 我知道查询完成是因为rds_table的行数和redshift_table一样。

DataGrip 显示查询仍在运行:

在我手动停止查询之前不会让我运行其他查询。 如果这样做,插入的行将保留在数据库中,这意味着事务已经提交。

为什么会这样?是 DataGrip 还是 Postgres 的问题? 我该如何解决?

是否有其他更好的替代方法可以将数据从 Redshift 迁移到 RDS?

【问题讨论】:

你能出示声明吗?您如何确定不再发生实际插入?使用不平凡的语句,很可能需要进行大量处理才能确定不再有结果行。 如果您已经可以看到新行,则事务和函数必须已经完成。是什么让您认为dblink 呼叫仍在运行? 这就是我的想法,但我在 DataGrip 上运行它,它显示为仍在运行。我必须手动终止它才能在同一个控制台上运行其他东西。您是否暗示它可能只是一个 DataGrip 错误而我的查询很好? 这是我的问题。您说“它表明它仍在运行”。它究竟是如何显示的?如果无法用语言描述,请在问题中添加屏幕截图。 我在问题中添加了一个屏幕截图和几行 【参考方案1】:

如果一个并发事务已经可以看到插入的数据,这意味着插入事务以及 INSERT 语句必须已经完成。

如果 DataGrip 显示该语句仍在运行,则说明它在欺骗您。

所以这一定是一个 DataGrip 错误。

【讨论】:

以上是关于DBLink 查询即使在完成后也不会终止的主要内容,如果未能解决你的问题,请参考以下文章

我应该明确终止过期的线程吗?

Redshift - 终止启动 Redshift 查询的应用程序并不会终止它

在 AWS Batch 上运行时,Redshift 频谱查询永远不会终止

如何制作 Python 程序,以便即使在终止后,变量、列表和其他对象的值也不会重置?

使用 gprof 分析非终止 C 程序

使用代码终止eclipse(在java中)