AKB48の推しメンをセンターにできちゃうかもしれない!? >>

質問お願い致します。
RedHatとPostgreを使用していて
現在8GBデータが入っているDBがあるのですが

『VACUUM FULLをするタイミング(しきい値)を教えてください』

とお客様から質問が来たのですが自分なりに調べてみまして
・データが増えすぎたら
・データの削除や更新が頻繁に行われたら
と答えたのですが納得していただけず、

メンテナンスをする為に
かなり正確な使用する間隔期間を知りたいらしく、

どういった数値を元にして
どれくらいの期間ごとにVACUUM FULLを使用すればいいのか
教えていただけないでしょうか。

何卒よろしくお願い致します。

A 回答 (2件)

通常のメンテナンスでVACUUM FULLをつかうことは無いと思います。

通常はVACUUM ANALYZE で、VACUUM FULL をしなければならないような事態にならないように、一定間隔で行います。VACUUM FULL が必要になるというのは、ある意味緊急事態で、ディスクのスペースが足りなくなってこのままではダウンしてしまうような時に行います。こういうことは普通の状態ではないので、どれくらいの期間でVACUUM FULLをするかという質問はナンセンスだと思います。どのくらいの期間でVACUUM ANALYZE をやっておけば、VACUUM FULLをしなくてすむかという質問なら意味がありますけど。

この回答への補足

こんにちは。お答えいただきありがとうございます。
VACUUM(毎日)
  ↓
VACUUM ANALYZE(VACUUMを使ってもディスクが増えている時)
  ↓
VACUUM FULL(落ちそうな緊急事態)

こういう感じでしょうか。
VACUUM ANALYZEを使用するタイミングというのは
やはりユーザー側で判断していただくしかないのでしょうか。

補足日時:2006/11/13 09:49
    • good
    • 0

PostgreSQLを組み込んだ製品を販売・サポートしてますが、


VACUUMをまめに実行しても、ディスク使用量は増大しますね。
どの程度のタイミングで実行すべきかはケースバイケースだと思います。
ユーザに「ファイルシステムの空き容量を見て、適宜実行してください」と言ってます。ユーザ自身で実行基準を作ってます。
    • good
    • 0
この回答へのお礼

お答えありがとうございます。
やはり適宜としか言い様がないですよね>_<

あと新たにこちらのページを見つけたのですが
http://www.thinkit.co.jp/cert/marugoto/2/1/13/2. …
毎日"vacummdb -a -v"を実行することで
"vacumm full"の時期を判断できるようですがこの方法は有効なのでしょうか。

お礼日時:2006/11/13 09:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPostgreSQLの断片化の状況を確認したい

PostgreSQL8.2シリーズを利用しています。
事情によりVacuumFullが行えないのですが、ここ最近、レスポンスの低下が顕著になってきました。

そこで現在のDB断片化の状況を知りたいと考えているのですが、何か方法はございますでしょうか?
もしご存知でしたら、ぜひアドバイスを頂ければと思います。

Aベストアンサー

pg_class テーブルの relpages と reltuples の比を取ってみると参考になるかと。
例えば、1行当り1000Byte以上使っているテーブルを表示するには下記の様にします。

例) -------------------------------------
select
relname,
reltuples::int8,
relpages::int8,
CASE WHEN reltuples > 0
THEN (relpages::int8 * 8192) / reltuples::int
ELSE (relpages::int8 * 8192)
END as per_row
from pg_class
where
relkind = 'r' AND
relpages::int8 >= 2 AND
CASE
WHEN reltuples = 0 THEN TRUE
ELSE (relpages::int8 * 8192) / reltuples::int > 1000
END
order by per_row desc;
-----------------------------------------

1行分のデータが少ないはずの無いテーブルが含まれていたら、おそらく更新・削除による不要なデータが溜まっているのかと。

なお、ブロックサイズがデフォルト以外の場合は、8192を実際のブロックサイズに変えて下さい。

pg_class テーブルの relpages と reltuples の比を取ってみると参考になるかと。
例えば、1行当り1000Byte以上使っているテーブルを表示するには下記の様にします。

例) -------------------------------------
select
relname,
reltuples::int8,
relpages::int8,
CASE WHEN reltuples > 0
THEN (relpages::int8 * 8192) / reltuples::int
ELSE (relpages::int8 * 8192)
END as per_row
from pg_class
where
relkind = 'r' AND
relpages::int8 >= 2 AND
CASE
WHEN reltuples = 0 T...続きを読む

Qフルバキュームって・・・

 フルバキュームは、何度かに分けることが出来るのでしょうか?

 テスト用にデータベースを作っているのですが、テストのしすぎで重くなってしまいました。
 ググるとフルバキュームをかけると良いとのことで、かけてみたところ、丸1日たっても終りません。

 で、ふと疑問に思ったのですが、
フルバキュームをする→途中で止めた場合、途中で止めるまでの部分は有る程度有効なのでしょうか?

 windowsのデフラグの場合、途中で止めても途中まではデフラグされているので、再開した場合、最初からやった時より少しは早く出来たと記憶しています。

 バキュームの場合も同じようなイメージなのでしょうか?

 初歩的な質問で恐縮ですが、お詳しいかた、教えていただけると助かります。

Aベストアンサー

VACUUMのイメージは下記のページが詳しいです。
http://www.geocities.jp/sugachan1973/doc/funto60.html

また、VACUUMはテーブル単位に実行できます。

FULL VACUUMを安全に停止する手段があれば、ファイルの再構成を行っていますから、再実行すれば前回の分はVACUUM済になる理屈ですが、FULL VACUUMを安全に停止する方法わかりません。
下手をしてファイルシステムに不整合を起こしてはなにもなりません。

お使いのPostgreSQLのバージョンはなんでしょうか?
個人的には現在8.4系列あたりが一番安定している気がします。
VACUUMもバックグラウンドで行ってくれますので。

QPostgreSQLが起動しない・・・

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not write lock file "/var/lib/postgres/data/postmaster.pid": No space

となっており、上記ディレクトリにpostmaster.pid書き込みできないよ、と言われているっぽかったので、パーミッションを変更したりして
みましたが、postgresql startにしろ、pg_ctl startにしろ、それぞれのコマンドで起動すると、強制的にパーミッションが「700」に変更されてしまうようで、結果は同じでした。

どなたか、解決策をご教示願えませんでしょうか?

よろしくお願いします。m(_ _)m

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not wri...続きを読む

Aベストアンサー

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証はなし。)

su - postgres

上記のコマンドでログインするなり、パスワードを忘れたのならroot権限にてpasswdコマンドから変更するなりした後、もう一度postmasterを起動してみよう!

ちなみに、パーミッション関係のエラーは、「Permission denied」ですよね。

参考URL:http://www.postgresql.jp/document/pg803doc/html/postmaster-start.html

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証は...続きを読む

QPostgreSQLのanalyzeとは

PostgreSQLのanalyzeについてですが。
[TABLE]の統計情報を再取得する為に
 analyze TABLE;
と実行した場合。
該当のテーブルへの影響というのは全く無いものなのでしょうか。
(同じタイミングでアクセスしたselectが遅延してしまう等)

Aベストアンサー

PostgreSQLに限らず、統計情報を取得する場合テーブルやインデックスのアクセスが発生しますから、全く影響がないということはありません。
Oracleなどでは大きなテーブルのanalyzeの点にサンプリングする比率を指定できたりできますけれど。
できるだけDBへの負荷が少ない時間帯を選んで実行するしかないと思います。

QPostgreSQL8.3系のAutovacuum不備?

PostgreSQL8.3系のAutovacuum不備?
現在、8.3.3を使用しておりますが、最近応答がかなり重くなりまして
手動にてvaccumを実施し対処しました。
インストール時のデフォルトで運用しているのですが
<値>
autovacuum | on
autovacuum_analyze_scale_factor | 0.1 autovacuum_analyze_threshold | 50 autovacuum_freeze_max_age | 200000000
autovacuum_max_workers | 3
autovacuum_naptime | 1min autovacuum_vacuum_cost_delay | 20ms autovacuum_vacuum_cost_limit | -1 autovacuum_vacuum_scale_factor | 0.2 autovacuum_vacuum_threshold | 50

かなり動作が重くなっても、自動実行されない模様です(閾値が合わない)。

そもそもチューニングすべき物なのでしょうか?
お詳しい方、ご教授頂けないでしょうか?宜しくお願い致します。

PostgreSQL8.3系のAutovacuum不備?
現在、8.3.3を使用しておりますが、最近応答がかなり重くなりまして
手動にてvaccumを実施し対処しました。
インストール時のデフォルトで運用しているのですが
<値>
autovacuum | on
autovacuum_analyze_scale_factor | 0.1 autovacuum_analyze_threshold | 50 autovacuum_freeze_max_age | ...続きを読む

Aベストアンサー

VACUUM が適切に実行されずに性能が低下していることを前提として回答します。

更新頻度の高い巨大なテーブルが存在する場合には、自動バキュームの設定をテーブルごとに調整したほうがいいと思います。

デフォルトの設定のままでは、UPDATE や DELETE で不要になった行が 50 行 (autovacuum_vacuum_threshold) + 全行数の 2 割 (autovacuum_vacuum_scale_factor) を超えた場合に VACUUM が実行されます。

例えば、テーブルの行数が 100,000 行の場合には不要な行が 20,050 行を超えると VACUUM が実行されますが、100,000,000 の場合には 20,050,000 行を超えるまで実行されません。同じ 2 割であっても 2 万行と 2 千万行では性能への影響が違います。

PostgreSQL 8.3 であれば、pg_autovacuum テーブルにエントリを追加すればテーブルごとに自動バキュームの設定を行うことができます (参考 URL を見てください)。

あと、その他に気になることとしては、デフォルトでは自動バキュームで同時に起動できる VACUUM は 3 つ (autovacuum_max_workers) までなので、更新頻度の高いテーブルが大量に存在する場合には、自動バキュームが特定のテーブルへの VACUUM につきっきりになってしまい、VACUUM の実行されないテーブルが発生して性能が低下してしまう場合があります。

参考URL:http://www.postgresql.jp/document/8.3/html/catalog-pg-autovacuum.html

VACUUM が適切に実行されずに性能が低下していることを前提として回答します。

更新頻度の高い巨大なテーブルが存在する場合には、自動バキュームの設定をテーブルごとに調整したほうがいいと思います。

デフォルトの設定のままでは、UPDATE や DELETE で不要になった行が 50 行 (autovacuum_vacuum_threshold) + 全行数の 2 割 (autovacuum_vacuum_scale_factor) を超えた場合に VACUUM が実行されます。

例えば、テーブルの行数が 100,000 行の場合には不要な行が 20,050 行を超えると VACUUM が実行...続きを読む

Qcastの使用法について(初心者です)

始めまして。初心者ですので基本的な質問になるかもしれませんがよろしくお願いします!

なぜかPostgreSQLを仕事に使うことになり、四苦八苦しています。

テーブルを作成しているときに、
create table syouhin (shinamono text, nedan int);
とするとします。
で、insert でデータを入れていきますが、
例:
shinamono | nedan
------------------
みかん |100
マンゴー |200

例えば、nedan のcast が今、int にしましたが、これをchar やfloatに変えたいときはどうすればよろしいのでしょうか?

どなたか御存じの方、お手数ですがお教え下さい!!!

Aベストアンサー

CAST関数の文法は、CAST(○ AS △) となります。
○:変換する値
△:変換する型

Select CAST(nedan AS char(10)) ~
とすればできると思いますよ

Q接続中のユーザを表示する方法

こんにちは。Postgresで接続中ユーザの表示をするには(コマンド)どうすればよいか教えてください。

Aベストアンサー

(ソースのリダイレクトです)
postgreSQL v8.0.2で
select * from pg_stat_activity;
とすれば出て来ました。

一応、探すのに苦労しましたが
23.2. 統計情報収集器
にその他統計情報の閲覧テーブルが記載されています(参考までに)
http://www.postgresql.jp/document/pg800doc/html/monitoring-stats.html

参考URL:http://ml.postgresql.jp/pipermail/pgsql-jp/2003-August/014272.html

Q保守にVACUUMは必要か?

PostgreSQL8.1.4を利用しています。

1日約2万件のINSERTを行うデータベース
の保守を行う予定です。
PostgreSQLの保守にvacuumは欠かせないというのが
通説だとは思うのですが
データベースへの操作はINSERTとSELECTだけなため
VACUUMは要らないのでは?と思っています。
(少なくとも頻繁には必要ないのでは?)
但し、新しい子テーブルを毎日追加し、古いものをdropするということはやっています。

ご教授の程よろしくお願いいたします。

Aベストアンサー

ズバリ必要です。
VACUUMを実行するする理由は大きく2つです。
・DELETE文やUPDATE文発行により断片化した領域の開放により
 アクセス速度の低下を抑制する。
・不要となったトランザクションIDの開放により、トランザクション
 IDのオーバーフローの抑制する。
今回、1つ目の項目を見て、不要と判断していると思いますが、
実は2つ目も非常に重要です。放置して、オーバーフローが発生すると
データは存在するけど、参照できないと言う事実上、致命的な破壊
現象を招く結果となります。
よって頻繁でないにしても、定期的にチェックは必要です。
私は、このIDを一日一回チェックするようにして、15億を超えていたら
VACUUM実行するようにスケジューリングしています。
幸い、Ver.7.4以上の場合、VACUUM中のDBアクセスも可能となりました
ので負荷は大きいですが、システムが停止する事はないと思います。

Qautovacuumがメモリ負荷に!

postgresqlバージョン9.0を利用しています。しばらく安定していたのですが、運用から1ヶ月ぐらいしたここ最近、メモリの使用率(バッファ含め)が80%を超えるようになりました。
プロセスを確認すると、autoバキュームが負担になっているようです。
ほぼ autovacuum launcher processというプロセスが物理メモリの80%を占有しています。

このままでは、autovacuumにより逆にパフォーマンスが悪くなりそうです。
そこで、autovacuumが負担にならないようにvacuum_cost_limitの適切な値を設定しようと思索していますが、適切な設定に迷っています。
また vacuum_cost_limitはコメントアウトのままです。

どなたか適切な設定値の算出や設定や方法をご教授いただけませんでしょうか。


現在の状態はこちらです。

OS:RedhatLinuxEnterprise5.5 64bit
メモリ:8GB

postgres.confの設定

autovacuum = on
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1
autovacuum_vacuum_cost_delay = 20ms
autovacuum_vacuum_cost_limit = -1


#vacuum_cost_limit = 200 # 1-10000 credits

どうぞよろしくお願いいたします。

postgresqlバージョン9.0を利用しています。しばらく安定していたのですが、運用から1ヶ月ぐらいしたここ最近、メモリの使用率(バッファ含め)が80%を超えるようになりました。
プロセスを確認すると、autoバキュームが負担になっているようです。
ほぼ autovacuum launcher processというプロセスが物理メモリの80%を占有しています。

このままでは、autovacuumにより逆にパフォーマンスが悪くなりそうです。
そこで、autovacuumが負担にならないようにvacuum_cost_limitの適切な値を設定しようと思索しています...続きを読む

Aベストアンサー

設定の問題ではなく、PostgreSQL本体にメモリリークのバグが原因と思われます。徐々にメモリ消費が増えていってしまいます。

9.0.2で修正されているので、アップデートしてみてください。
- Fix long-term memory leak in autovacuum launcher (Alvaro Herrera)

バージョンアップしないで対処となると、PostgreSQLサービスを定期的に停止/再起動するくらいしか手がありません。

参考URL:http://www.postgresql.org/docs/9.0/static/release-9-0-2.html

QUNIX コマンドにおける # や円マークの意味

お世話になっております。
Unix の表現上の#と¥(円)、セミコロンマークの意味と使い方を教えて下さい。

例 # find . -not -name xxxx -exec cp -v -p --parents {} /mnt/hda1/test/ \;

1.上記の時 # は root によるコマンドプロンプトなので打ち込む必要はないでよいでしょうか

2.上記で¥(円)マークと;(セミコロン)マークの意味は何でしょうか。
  ;(セミコロン)マークは行の終わりとあったのですが、入力する必要がありますか。

3.以下で¥(円)マークは表現上2行になるから記述してあるだけで、
  1行で入力できるなら¥マークを入力しなくてもよいのでしょうか
  それともコマンドラインで2行になるコマンドなので入力してエンターを押し、
  コンソールに2行だと認識させるべきものなのでしょうか
   # nice -5 /usr/bin/pkg - 65536 > \
   /mnt/hda1/hoge

パイプやリダイレクトの意味と使い方は知っているのですが、
複合コマンドは今一つ分かりません。
教えて下さい。よろしくお願いします。

お世話になっております。
Unix の表現上の#と¥(円)、セミコロンマークの意味と使い方を教えて下さい。

例 # find . -not -name xxxx -exec cp -v -p --parents {} /mnt/hda1/test/ \;

1.上記の時 # は root によるコマンドプロンプトなので打ち込む必要はないでよいでしょうか

2.上記で¥(円)マークと;(セミコロン)マークの意味は何でしょうか。
  ;(セミコロン)マークは行の終わりとあったのですが、入力する必要がありますか。

3.以下で¥(円)マークは表現上2行になるから記述してあるだけで...続きを読む

Aベストアンサー

1. このケースでは、おそらくはそうです。
が、本当にシェルスクリプトでのコメントの場合もあります。

2. \には「続く文字との組合せで特別な意味を持たせる」「本来特殊な意味を持つ文字の前に置いて、その意味を無効にする」というのが主な役割りです。
通常、 ;は、複数コマンドを連続実行する際の、各コマンドの区切りとして機能します。
そこで、それを無効にしてセミコロンという文字として使いたい時は
・バックスラッシュ(円マーク)でエスケープする \;
・引用符で文字列にする ';' ";"
等の方法を使います。

ここから先はfindコマンドの話になります。
findコマンドでは -exec 「コマンド」 として見つかったファイルやディレクトリに対して「コマンド」を実行できます。
このときに、どこまでが「コマンド」かを示すために セミコロンを使います。
ところが、 ; そのままではfindコマンド全体の終了と解釈されてしまうので、\; などを使います。

3. このケースでは、1行に書いて問題ありません
\の直後に改行がある場合は、「\改行」をスペースに置き換えたようなものだと考えてください

1. このケースでは、おそらくはそうです。
が、本当にシェルスクリプトでのコメントの場合もあります。

2. \には「続く文字との組合せで特別な意味を持たせる」「本来特殊な意味を持つ文字の前に置いて、その意味を無効にする」というのが主な役割りです。
通常、 ;は、複数コマンドを連続実行する際の、各コマンドの区切りとして機能します。
そこで、それを無効にしてセミコロンという文字として使いたい時は
・バックスラッシュ(円マーク)でエスケープする \;
・引用符で文字列にする ';' ";"
等の方法を使い...続きを読む


人気Q&Aランキング