[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 メーリングリストの案内