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