PostgreSQL 8.1 以降のメンテツールのもと

メンテツールそのものじゃないです。とりあえず上げてみるテスト。こんなのがあると sh スクリプトとかと組み合わせやすいかなーと思う。

DB一覧

最も単純にはこう。

psql -U postgres -t -A -F " " -l | awk '{print $1}'

ただしこれだと template0, template1, postgres が含まれてしまう。

psql -U postgres -t -A -F " " \
-c "select datname from pg_database where not datistemplate;"

にすれば postgres は入っちゃうけど「使える」データベースの一覧が採れる。

テーブル一覧

とりあえずテーブル名だけ

psql -U postgres -c "\d" $DBNAME
psql -U postgres -t -A -F " " -c "\d" $DBNAME | awk '{print $2}'

権限情報付きはこう。

psql -U postgres -c "\dp" $DBNAME
psql -U postgres -t -A -F " " -c "\dp" $DBNAME | awk '{print $2, $4}'

権限付きはいっぺんに取得できない。上と組み合わせてこんな感じ。勘違いして必死こいて awk で sql を組み立てたバージョンも晒しておきます。ほ、ほら、sql を書き換えればいろんな情報が採れるよ!とかほざいておく。

psql -U postgres -c "select relname,relacl from pg_class where relname \
in (`psql -U postgres -t -A -F ' ' -c '\d' $DBNAME | awk '{print $2}' |\
awk -F '\n' -v RS='' -v ORS='' 'BEGIN {print \"\047\"}\
{gsub(/\n/,\"\047,\047\"); print}\
END {print \"\047\"}'`)" $DBNAME

なんでこんなまどろっこしいことやってるかっていうと pg_class の結果からシステムが用意したテーブルかどうかを判断する基準が分からなかったから。

スクリプトの長さはともかく、SQL を生読みするよりは多少権限付与の状態が見やすい……んじゃないかなぁ。

{ }

の中を , で split するとかは好きずきってことで。

select relname,relacl from pg_class where relname in

の部分を

select relname,relfilenode,relpages,relacl from pg_class where relname in

ってやっとくとディスクスペースの確認もしやすくなる1。インデックスとか入ってないけどそこら辺は適当で、ひとつ。

role一覧

※ たぶん 8.1 以降専用なのはここだけだと思う。

まずはまんま。

psql -U postgres -c "\du"

ユーザー名とグループのみに絞ってテキストデータだけにするとこんな感じ。

psql -U postgres -t -A -F '|' -c '\du' | awk -F \| '{print $1, $6}'
  1. この page の単位ってよく知らないけど、node が分かれば ls -lh? とかで容量の確認はできる。ま、フツーそんな細かいレベルの情報は必要にならないというか、そんなの気にしちゃダメっぽい。もっとざっくり効率がいいか悪いかとかディスクに収まるかどうかだけ見ろと言いたいらしいぞ。知らんけど。 

More