[pgsql-jp: 36435] Re: vacuumdb時にWARNINGが発生

Satoshi Nagayasu nagayasus @ nttdata.co.jp
2005年 11月 22日 (火) 12:23:09 JST


永安です。

naruse @ daikodenshi.co.jp wrote:
> おっしゃるとおり、vacuumdb -a -zを実行した結果、WARNINGが発生しなくなりました
> 大変ありがとうございました。
> 以前の状態では結果的にDBのフラグメントは解消できていなかったのでしょうか?

フラグメントは解消されています。

VACUUMでは、大きく分けて二つの処理を行っています。

1.) テーブルファイルの断片化の解消
2.) 各レコードの保持しているトランザクションIDの付け替え

件のWARNINGは 2. に関連して出てます。

結論から言うと、テーブルのフラグメント解消のためだけなら、
ユーザDBをVACUUMすれば事足りますが、2の問題もあるので、
templateデータベースもある程度の頻度でVACUUMしなければなりません。

以下、ざっくりとした解説です(余談ともいう)。

PostgreSQLでは各トランザクションに対してレコードを見せるかどうかを
各レコードの保持するトランザクションIDを使って判断していますが、
トランザクションIDに32ビット整数を周回させながら使っているため、
周回した後も放っておくと前後関係が分からなくなります。

これは、まったく更新のないデータベースであっても必要になります
(トランザクションによるテーブル読み出しに関連するため)。

そのためFREEZEというメンテナンス処理が必要になりますが、
これはVACUUM処理の中で行われます。

というわけで、読み出し専用のDBであっても、ある程度の頻度で
VACUUMが必要、という話になるのでした。

オフィシャルマニュアルで言うところの「21章 定常的なデータベース保守作業」の
「21.1.3 トランザクションIDの周回エラーの防止」のところですね。
ただ、これ読んで完全に分かるかどうかは微妙なところですが。。。

#ここらへん、文章で説明するの難しいので、
#誰かFlashで作ってくれないかなぁ、とか思ってみたり。

ちなみに、pg_database の datfrozenxid というのを見ると、
vacuumする前は30億くらいで、vacuum後に10億くらいになっているのが
分かると思いますが、これがfreezeされた証になります。

> 永安様
> 成瀬です。
> 
> おっしゃるとおり、vacuumdb -a -zを実行した結果、WARNINGが発生しなくなりました
> 大変ありがとうございました。
> 以前の状態では結果的にDBのフラグメントは解消できていなかったのでしょうか?
> 
> 実行前後のselect * from pg_databaseです。
> 
>   datname  | datdba | encoding | datistemplate | datallowconn | datlastsysoid |
> datvacuumxid | datfrozenxid | datpath | datconfig |        datacl
> -----------+--------+----------+---------------+--------------+---------------+--------------+--------------+---------+-----------+----------------------
> 
>  template1 |      1 |        1 | t             | t            |         17140 |
>        333121 |   3221558594 |         |           | {????=C*T*/????}
>  template0 |      1 |        1 | t             | f            |         17140 |
>           464 |          464 |         |           | {????=C*T*/????}
>  dbname1   |      1 |        1 | f             | t            |         17140 |
>    2217850857 |   1144109034 |         |           |
> 
> 
>   datname  | datdba | encoding | datistemplate | datallowconn | datlastsysoid |
> datvacuumxid | datfrozenxid | datpath | datconfig |        datacl
> -----------+--------+----------+---------------+--------------+---------------+--------------+--------------+---------+-----------+----------------------
> 
>  template1 |      1 |        1 | t             | t            |         17140 |
>    2219027995 |   1145286172 |         |           | {????=C*T*/????}
>  template0 |      1 |        1 | t             | f            |         17140 |
>           464 |          464 |         |           | {????=C*T*/????}
>  dbname1   |      1 |        1 | f             | t            |         17140 |
>    2219030736 |   1145288913 |         |           |
> 
> 
> 
> 
> 


-- 
NAGAYASU Satoshi <nagayasus @ nttdata.co.jp>



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