【问题标题】:Running DB2 SQL from shell command line does not finishing execution从 shell 命令行运行 DB2 SQL 未完成执行
【发布时间】:2014-05-14 19:51:44
【问题描述】:

我在一个设置为远程连接到另一个 db2 unix 服务器的 unix 服务器上。 我能够使用以下脚本连接到 DB2:

db2 "connect to <server name> user <user name> using <pass>";

然后我运行以下命令将 SQL 的结果保存到文件中

db2 "select * from <tablename>" > /myfile.txt

脚本开始执行,但永远不会结束。我也尝试在选择之前使用-x,但同样的结果永远不会结束执行。表很小只有一条记录。当我强制结束执行时,表头会保存在文件中,如下所示错误:

SQL0952N  Processing was cancelled due to an interrupt.  SQLSTATE=57014

请帮助我被困在一个谜中。

【问题讨论】:

  • 听起来有点像锁定了那个表。可能是未提交的交易?
  • 也许这只是一个非常大的表,并且大量数据使系统不堪重负。尝试在查询中添加fetch first 10 rows only 子句,看看它是否会更快返回。

标签: sql bash shell db2 remote-access


【解决方案1】:

您可以监视连接和输出文件以了解发生了什么。

开始监控前,获取当前应用句柄

db2 "values SYSPROC.MON_GET_APPLICATION_ID()"
  • 打开第二个终端,然后对您的数据库执行 db2top。检查当前会话 (L) 并查看您的连接(之前的应用程序 ID)。如果您看到 Lock Wait 状态,那只是因为另一个连接在该表上加了锁,并且无法同时读取它。

    db2top -d myDB

尝试使用另一个隔离级别执行相同的查询

db2 "select * from <tablename> WITH UR"

如果这是问题所在,您应该分析数据库上还有哪些其他进程正在运行(修改数据)。

  • 打开另一个终端,然后做一个

    tail -f /myfile.txt

如果您看到文件正在更改,那只是因为输出太大。请稍等。

【讨论】:

  • 如果表具有由某些查询获取的排他锁,这会起作用吗?我认为答案是否定的,如果错了,请纠正我。
  • 如果您的查询处于“锁定等待”状态并且“锁定超时”是不定式 (-1),则您的查询将一直保留到持有锁定的应用程序释放它为止。
  • 在查询中使用 WITH UR 时,不考虑行上的锁,但结果可能不准确(幻读等)
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 2011-06-15
  • 2013-06-15
  • 1970-01-01
  • 2014-04-21
  • 2014-01-22
相关资源
最近更新 更多