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

基本的に、「deadlock」という単語が bcp 出力メッセージに表示される場合、再試行します。

2 つの質問

  1. このアプローチは合理的に見えますか?
  2. デッドロック以外に心配する必要がある bcp エラーは何ですか?

特に一時的な bcp エラーの検出に関心があり、再試行できます。

複合ステートメントを使用して、圧縮前に bcp データの周りにヘッダーとフッターを挿入できるようにしていますが、例を簡略化するために省略しています。

4

4 に答える 4

2

したがって、必要なのは、信頼性の高いフェイルファストbcpだけです。一部のSybaseバージョンのBcpには、最大エラー数を制御するコマンド引数があります。1)エラーカウント= 1に設定すると、より確実に失敗します。2)問題は、&を使用してバックグラウンドで起動されたbcpプロセスの終了コードをトラップすることに要約されます。これにどのシェル構文を使用すべきか正確にはわかりませんが、これには一般的なシェル手法があるかもしれません。

于 2010-02-09T03:45:34.483 に答える
2

bcp アウトに名前付きパイプを使用し、Sybase ASE からファイルにデータを圧縮してから、LOAD TABLE ステートメントを使用して Sybase IQ にロードすることを考えました。残念ながら、大きなパフォーマンスが失われました。名前付きパイプからの LOAD TABLE は、HP-UX 上のファイルからの LOAD TABLE よりも 10 倍遅かった :-( 私は単純な圧縮アルゴリズムを OC ユーティリティ (bcp、isql) に直接実装することに投票します。

于 2010-02-05T14:18:15.517 に答える
2

これは簡単です。

このアプローチは合理的に見えますか?

あまり。まず、シェル スクリプトはあまり良くありません。すべての作業を必要とするわけではありませんが、それは問題ではないので、そのままにしておきます。

第二bcpに、アクティブなデータベースであっても (データベースで非常に奇妙なことを行ったり、複数の並列ストリームを実行したりしない限り)、デッドロックは発生しません。bcp共有ロックがクリアされるまで待機するため、それを確認する必要はありません。

3 番目に、bcp完全なエラー メッセージを提供します。-e bcp_err_file呼び出しパラメーターを使用します。次にgrep ... bcp_err_file、エラーまたはパターン ("^[Ee]rr""^Msg"が典型的です)。エラーを個別にトラップします。例外; と他のメッセージ。

第 4 に、シェル スクリプト内でこのように永遠に再試行することはありません。潜在的な無限ループ、リソースの浪費。一度実行して、「成功」xor「失敗」とエラーのリストを生成します。ループは、エクスポートするテーブルのリストに対してのみ行う必要があります。

  • これは、適切な UNIX ユーティリティ/コマンドとして記述されています。エラー ファイルを指定しない場合、もちろん、すべてのエラー メッセージが に送ら$stdoutれ、進行状況メッセージと混同されます。そのストリームでエラーをトラップできますが、それは無意味です。別のエラー ファイルを指定します。

  • にキャプチャ$stdoutするのが普通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 に答える
1

それは本当にあなたが望むことをするつもりですか?bcpコマンドラインツールについての私の理解は、トランザクションがないということです。M行をロードしているが、何らかの理由(制約など)で行Nの挿入が失敗した場合、最初のN-1行が挿入されています。したがって、ファイル全体を再起動することはお勧めできません。

-m Xオプションを使用すると、最大X個のエラーが発生した場合でもbcpを続行できるようになり、挿入に失敗した行を特定して再試行できます。

MichaelPepplerのSybase::BCP Perlモジュールを調べることもできますが、調査の結果、ASE15で問題が発生している可能性があります。

于 2009-10-20T01:53:23.790 に答える