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 频谱查询永远不会终止