0

我们将命名管道与 Sybase bcp 一起使用,以便我们可以即时压缩输出。

Sybase bcp 实用程序不会在其退出代码中返回太多信息。Sybase 文档指导用户检查进程编写的错误消息。

这是我们使用的错误处理习惯用法的释义,脚本的非 bcp 部分中的一些错误检查已被删除以缩短示例。

while :
do
    {
        rm -f $fifo
        mkfifo $fifo
        cat $fifo &
        CatPid=$!

        bcp $db.$owner.$table out $fifo -c $db_creds >$log 2>&1
        grep -qi deadlock $log || break

        # Must have been a deadlock, clean up.
        kill $CatPid
    } > $output
done

基本上,如果“死锁”一词出现在 bcp 输出消息中,我们会再试一次。

两个问题

  1. 这种方法看起来合理吗?
  2. 除了死锁之外,我们还需要担心哪些其他 bcp 错误?

我对检测瞬时 bcp 错误特别感兴趣,我们可以再试一次。

我们使用复合语句,以便我们可以在压缩之前在 bcp 数据周围插入页眉和页脚,但为了简化示例,我省略了它。

4

4 回答 4

2

这是一个很容易的。

这种方法看起来合理吗?

并不真地。首先,shell 脚本不是很好,它不需要所有的工作,但我不会管它,因为这不是问题。

其次,bcp不会死锁,即使在活动数据库上(除非你在数据库中做一些非常奇怪的事情,或者运行多个并行bcp流),它会等待共享锁清除,因此无需检查。

第三,bcp提供完整和完整的错误信息。使用-e bcp_err_file调用参数。然后grep ... bcp_err_file是错误或模式("^[Ee]rr"并且"^Msg"是典型的)。我单独捕获错误;例外;和其他消息。

第四,我永远不会像在 shell 脚本中那样重试。潜在的死循环,浪费资源。让它执行一次,并产生“成功”异或“失败”和错误列表。任何循环都应该只用于要导出的表列表。

  • 它被编写为适当的 unix 实用程序/命令。如果您没有指定错误文件,当然,所有错误消息都会转到$stdout并且它们与进度消息混合在一起。您可以捕获该流中的错误,但这是无腿的;指定一个单独的错误文件。

  • $stdout捕获到 a是正常的bcp_log_file,但这与bcp_err_file

  • 检查 Unix 上的退出状态是另一回事。如果bcp运行成功(无论是否产生错误消息),它都以“成功”退出;仅当 unix 程序失败时,您才会获得非零退出状态。

  • 它会容忍任何数量的错误,除非你限制它-m max_errors

除了死锁之外,我们还需要担心哪些其他 bcp 错误?

任何和所有错误,都无法预测(它是具有固定资源的在线服务器),捕获所有错误,然后检查bcp_err_file. grep您可以通过上述方式自动执行检查。

我对检测瞬时 bcp 错误特别感兴趣,我们可以再试一次。

完全没有问题。详述如上。瞬态错误很少见。

您还应该担心硬错误和资源错误,不要重试(因为它会再次失败)。

我们大多数人担心会导致丢失行的错误,这意味着行bcp_data_file不完整或无法使用。

于 2011-01-14T01:33:54.287 回答
2

因此,您所需要的只是可靠的故障快速 bcp。某些 Sybase 版本的 Bcp 具有控制最大错误计数的命令参数。1)如果您设置错误计数= 1,那么它将更可靠地失败。2) 问题归结为捕获 bcp 进程的退出代码,在后台使用 & 启动。我不知道究竟应该使用什么 shell 语法,但可能有一些常见的 shell 技术。

于 2010-02-09T03:45:34.483 回答
2

我有想法使用命名管道进行 bcp 输出并将数据从 Sybase ASE 压缩到文件,然后使用 LOAD TABLE 语句加载到 Sybase IQ 中。不幸的是,有一个很大的性能损失。来自命名管道的 LOAD TABLE 比来自 HP-UX 上的文件的 LOAD TABLE 慢 10 倍 :-( 我投票赞成将简单压缩算法直接实施到 OC utils (bcp,isql) 中。

于 2010-02-05T14:18:15.517 回答
1

这真的会做你想要的吗?我对 bcp 命令行工具的理解是没有事务 - 即。如果您正在加载 M 行,但由于任何原因(约束等)插入行 N 失败,则已插入前 N-1 行。所以重新启动整个文件并不是一个好主意。

您可以使用 -m X 选项允许 bcp 在遇到最多 X 个错误时继续执行,然后尝试确定哪些行插入失败并重试它们。

您还可以查看 Michael Peppler 的 Sybase::BCP Perl 模块,但我们的调查表明它可能与 ASE 15 有问题。

于 2009-10-20T01:53:23.790 回答