- PR -

PostgreSQLデータベースサイズについて

1
投稿者投稿内容
Rippey
会議室デビュー日: 2004/01/28
投稿数: 3
投稿日時: 2006-10-20 13:40
お世話になります。
現在、PostgreSQLをLinux環境下にて運用しております。
日中の業務にて、データベースの更新や削除を行っているため、毎日深夜、vacuumdbをしております。オプションは、--fullと--verboseをつけています。
データベースのデータは、/usr/local/pgsql/data/内に格納してあります。
現在本番環境の、データベースのディレクトリサイズが6GByteになっているのですが、
そのデータベースを退避したデータ(プレインテキスト形式)をテストサーバにリストアすると、1GByte強になります。退避したデータは、tar.gz形式にて60MByte程です。
日々、データベースのサイズが大きくなっており、パーティション容量がいっぱいになってきております。

素人考えですが、テスト環境では、1GByte程の容量である為、本番環境では、何か日々のゴミのようなものが残ってしまっているような気がします。
どなたかどのような原因にてデータベースサイズが大きくなってしまっているか、
お分かりになる方がいらっしゃいましたら、ご教授して頂けないでしょうか。
ヒントになるような事でもかまいません。よろしくお願いいたします。

本番サーバ&テストサーバ
OS:Redhat Enterprise Linux ES Ver3
RDBMS:PostgreSQL7.3.3
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-23 07:33
インデックスの再作成をおこなってみて下さい。
primary key がある場合はindexが作成されます

コマンド
REINDEX TABLE name

注意:REINDEX はテーブルの排他的ロックを獲得します

参考
PostgreSQL 7.3.4 
管理者用ガイド 8.3 定常的なインデックスの再作成
VACUUM を実行してもサイズが減らない場合の記載があります

管理者用ガイド 11.1. ディスク使用量の決定
postgresqlのシステムテーブルから現在の状況を知るsqlの記載があります

上記マニュアルをもとに簡単なSQLを書いてみて実行しました
relnameがテーブル名
SELECT c2.relname, c2.relpages
FROM pg_class c, pg_class c2, pg_index i
WHERE c.relname = 't_test'
AND c.oid = i.indrelid
AND c2.oid = i.indexrelid
ORDER BY c2.relname;

relname | relpages
-------------+----------
t_test_pkey | 1
(1 row)

WEB+DBプレス2006 Vol.34 (今月書店にありました)P202から
PostgreSQL安定運用のコツ で性能劣化とメンテナンスの記事も参考になります
Rippey
会議室デビュー日: 2004/01/28
投稿数: 3
投稿日時: 2006-10-23 14:27
99ri様
レスありがとうございました。

REINDEXを行っておりませんでした。
その結果、データ領域が肥大したと思われます。
なので、REINDEXのところを調べた結果、
古いバージョンのPostgreSQLでは、INDEXのところは、
VACUUMしてくれないと書いてあり、REINDEXを定期的に行わなければ、
サイズがどんどん増えていく旨が書かれていました。

99ri様のおっしゃる通り、REINDEXを定期的に行っていきたいと思います。

いろいろとありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)