PostgreSQLでディスク容量の測定

PostgreSQLってデータディレクトリーの名前が数字になっているのでどのディレクトリーとデータベースが対応しているか直感的にわからないため各データベースが使用しているディスク容量を調べるにはツールが必要になります。

それで、本やネットで調べるとoid2nameを使えばOidとデータベース名の対応を表示してくれるみたい。どうやら数字のディレクトリーはOidのようです。公式ページや本ではREADME.oid2nameを見れと一言だけしか書いてないので使い方はREADME.oid2nameを参照することにしました。

…が、そもそもソースコンパイルではoid2nameが入っていない。しかもoid2name導入についての記述がどこにも見当たらない。一応Makefileはあるので考えられる方法で導入してみることに。

まずoid2nameのソースがおいてある場所は
/usr/local/src/postgresql-8.1.0/contrib/oid2name/
でした。ここに、
README.oid2name
Makefile
oid2name.c
の3つのファイルがあります。

postgres> cd /usr/local/src/postgresql-8.1.0/contrib/oid2name
postgres> /usr/local/bin/make install

ここでmakeが絶対パスで指定していますが、これはGNU makeの方です。本体と同じくoid2nameも通常のmakeでは利用できませんでした。ただ本体の方は通常makeを指定してもさらにGNU makeを探しに行ってくれるので/usr/bin/makeで打ってしまっても大丈夫だったりします。

これでoid2nameが/usr/local/pgsql/bin/oid2nameにインストールされました。
早速使ってみます。

postgres> oid2name -P ********
All databases:
Oid Database Name Tablespace
———————————-
10793 postgres pg_default
10792 template0 pg_default
1 template1 pg_default
16452 test pg_default

Pオプションはパスワードです。ローカルでの認証をtrustにしている場合は不要だと思いますが、それはあまり好ましくないのでパスワード設定しておきましょう。
ただしこのコマンドは対話的にパスワードを入力できず上記のようにコマンドライン上か~/.pgpassに設定する必要があるので困り者です。

さらにテーブルごとに調査したい場合は
postgres> ll -S $PGDATA/base/16452 | head -10
total 3684
-rw——- 1 postgres postgres 352256 May 21 2006 1255
-rw——- 1 postgres postgres 344064 May 21 2006 2691
-rw——- 1 postgres postgres 237568 Jun 11 2006 2608
-rw——- 1 postgres postgres 204800 Jun 11 2006 1249
-rw——- 1 postgres postgres 204800 Jun 11 2006 2658
-rw——- 1 postgres postgres 172032 Jun 11 2006 2674
-rw——- 1 postgres postgres 155648 Jun 11 2006 2673
-rw——- 1 postgres postgres 122880 May 21 2006 2609
-rw——- 1 postgres postgres 114688 May 21 2006 10305

のようにテーブルのoidを確認して次のようにコマンドを打ちます。
postgres> oid2name -d test -f 1255 -f 2691 -f 2608 -f 1249 -f 2658 -f 2674 -f 2673 -f 2609
-f 10305 -P ********
From database “test”:
Filenode Table Name
——————————————-
1249 pg_attribute
2658 pg_attribute_relid_attnam_index
2608 pg_depend
2673 pg_depend_depender_index
2674 pg_depend_reference_index
2609 pg_description
1255 pg_proc
2691 pg_proc_proname_args_nsp_index
10305 pg_toast_2618
実際テーブルレベルになってくるとデータベース側が定義したものが多すぎて単純に振り分けるのが困難ですね。上記はサンプル通りファイルサイズの多い順でやってみましたが、独自で定義したテーブルは出てきていません。

ちょっと脱線しましたが、データベースごとの測定は簡単にできます。先程testデータベースのoidは16452と分かりましたのでduコマンドで測定します。

postgres> du -sh $PGDATA/base/16452
3.6M /usr/local/pgsql/data/base/16452

各データベースということであればdepth 1でもいいと思います。
postgres> du -d 1 -h $PGDATA/base/
3.6M /usr/local/pgsql/data/base/1
3.6M /usr/local/pgsql/data/base/10792
3.6M /usr/local/pgsql/data/base/10793
3.6M /usr/local/pgsql/data/base/16452
14.4M /usr/local/pgsql/data/base/

初音ミクでロイツマ

あのVOCALOID2って日本語以外でもこんなにウマく歌えるのかぁ。多分かなり微調整入っていると思う。まだ発売されたばかりのソフトだったと思うけど扱いやすいのか作者がウマすぎるのか…。

ニコニコ動画(RC)‐VOCALOID2 初音ミクに「Ievan Polkka」を歌わせてみた(完成版)
http://www.nicovideo.jp/watch/sm982882

マシン語の理解力

私も現場では似たような事を言っているほうですが意外にも反響あるんですね。

shi3zの日記 – マシン語を知らない子ども達
http://d.hatena.ne.jp/shi3z/20070911

私自身マシン語といえば中学生からPC無しでNHKラジオの情報処理試験講座を勉強したり(当時はプログラミング言語の選択をマシン語にしてました)。高校生のときに286マシンしか持って無いのに80386の勉強を独学でやって挫折したり、大学ではZ80アセンブルの講義があってそれまでの経験が生きたりということもあって、今ではメインでプログラムを組むことが無くて寂しいのですが過負荷障害系のカンだけ冴えているのはその経験があるからなのかも知れないですね。最初に就職したときもプログラマー志望なのに半導体の論理回路設計なんてとこにいたので、最初から高級言語だけで開発してきたプログラマーとはテスト・デバッグ方法などの話題でギャップを感じます。

別にマシン語自身はこだわる必要も教育を受ける必要もないと思いますがPCの構造を知るには近道だと思います。最近は優秀なクラスライブラリも出ているのでそれに依存しなければいけないことに抵抗が無ければそれでもいいと思っています。最近はネットワークを利用するプログラミングが多くなっているのでスモールエンディアンのIntel系でもネットワークに乗せるときはビッグエンディアンに変換しないといけないとか知っておけばお得な事も有りますね。全く知らない、知ろうとしないというのは技術者としてどうかと思いますが中途半端な知識で特攻するのもリスクが大きいので、知らないフリしつつ機会があれば勉強してみるのが賢いんじゃないかな。それで仕事として請け負ってよいレベルに達すれば仕事も広くなるし悪くは無いと思います。