[pgsql-jp: 35997] Re: VACUUM中にCOPYが終わらない

aya shigeto_aya_za @ mail.toyota.co.jp
2005年 9月 13日 (火) 09:49:37 JST


お世話になっております。綾です。

この件、気になっていて自分のところでも発生したら困るなあと
思っていてどういうときになるのか、原因は何か気になって
色々考えていました。
2つ思いつくものがあったので投稿してみます。
間違えていたらご指摘ください。

想定1.ひとつ可能性として思ったのはデータがすごく多いのでそれに対し
 1件づつ更新をかけるようなことをやるとトランザクションIDが
 多くなってしまって、バキューム時にトランザクションIDを
 全部2につけかえるような処理が動いたのかも、、、と
 思いました。

 参考)
http://www.buena-idea.net/~hironobu/postgresql/p-2-06.html
http://www.postgresql.jp/document/pg801doc/html/maintenance.html#VACUUM-FOR-WRAPAROUND

1分おきに7000件のデータを登録すると、
1時間では42万件。
24時間では1008万件。
10億÷1000万件=100回のトランザクション、、、
1件あたり100回ものトランザクションを動かしているということは
考えにくいので、あまり可能性がないかも、、、


想定2.あるデーモンのようなプロセスがトランザクションを開始して
 ずーっと終わらなかったらそのトランザクションIDを持つもの
 以前のデータにはバキュームがかからないそうです。

 例)1日目:
    トランザクションID=100番にて以下のような単純な
    selectを実行します。
       (auto commit offだとします。)
    select * from xxtable
    ずーっとこのままセッションつながったまま放置
    2〜3日放置するとします。


   2日目:
    (私はcopyがトランザクションをどうしているか
    知らないんですが、とりあえず、
    1つのトランザクションで行っているとします。)

    1分おきに7000件登録するcopyのトランザクションを1つ発行。
    このトランザクションIDが200番だったとします。
    次々1分おきにcopyは行われるので201,202,203,204と
    トランザクションIDはどんどん進みます。
    この状態でバキュームをかけても、
    トランザクションID=100のトランザクションが完結して
    いないと、トランザクションID=100移行に登録された
    データについてはバキュームがかからないそうです。

   3日目:
    3日経過しても最初の1日目のプログラムは終わらなかったとします。
    すると、同じ理由でこの日に登録されたもの全てと
    昨日に登録されたもの全てに対して、バキュームが
    かからないと思います。

   4日目:
    最初の日のselect文を走らせたプログラムが終わったとします。
    すると、2日目、3日目登録したものに対して、
    一気にバキュームがかかり、2日目、3日目よりも
    時間がかかると考えられます。

    10日ほどするとバキュームが終わらなくなるとのことでしたので、 
    ひょっとすると10日ほど動きっぱなしのプログラムが
    いたのかもしれません。


以上


Kiyoshi Mizuno wrote:
> 水野です。
> 
> すみません。さっき書きかけのを送ってしまいました。こっちが本物です。
> 
> 7.4.6にあった歴代リリースノートを見るとCOPYコマンドに関して
> 7.4.1以降ざっと見ても3回は修正が入っています。
> 支障が無ければ単純に7.4.6へ更新しては?
> 
> リリース7.4.2
> Fix multibyte problem that could lead to "out of memory" error during COPY IN
> 
> リリース7.4.3
> Fix error in COPY IN termination when using the old network protocol (ljb)
> 
> リリース7.4.4
> Make psql handle \r\n newlines properly in COPY IN
> 
> 




pgsql-jp メーリングリストの案内