fc2ブログ

Home > 2011年06月

2011年06月 Archive

WEB開発のべからず集

  • Posted by: Nakunaru
  • 2011-06-25 Sat 19:19:40
  • 雑誌
的なテーマが今月号の特集みたいです。
アンチパターンから学ぶことも多いと思うんですよね。
自分が失敗して学ぶこともあれば、他人の失敗から学ぶこともあるというか。



他の特集記事も面白そう。
ということでポチりたいと思います。

PostgreSQLのデータファイルの判別方法

  • Posted by: Nakunaru
  • 2011-06-16 Thu 23:04:10
  • PostgreSQL
PostgreSQLでは、各DBのディレクトリは$PGDATAの配下に作成されます。
(デフォルトではインストールdirのdata配下)

この時、各ディレクトリは名前が数値になっているため、どのDBのディレクトリなのか名前だけでは判別できません。
そこでちょっと調べてみました。


・見つけた判別方法1
http://d.hatena.ne.jp/hogem/20090620/1245431458#


SELECT datid, datname FROM pg_stat_database;

datid | datname
-------+------------
10793 | postgres
16406 | testdb2
16542 | testdb
1 | template1
10792 | template0


※datidがDBのディレクトリ名と一致する


SELECT relid, relname FROM pg_stat_all_tables;

relid | relname
-------+-------------------------
16492 | customer3
2601 | pg_am
10308 | pg_toast_2619
10750 | pg_toast_10748
2610 | pg_index
16410 | emp
2612 | pg_language
16436 | orditems
16427 | ord
2620 | pg_trigger
1214 | pg_shdepend
2608 | pg_depend
16456 | customer
・・・


※relidが各テーブルのデータファイル名と一致。
※pg_stat_databaseの配下から該当ファイルを探せばよい。
※INDEDXも同様にpg_stat_all_indexesで探すことができる。


・判別方法その2
oid2name ユーティリティを使用する。
http://www.postgresql.jp/document/8.4/html/oid2name.html

DBのディレクトリ判別


oid2name -U psadmin -P psadmin

Oid Database Name Tablespace
----------------------------------
16406 testdb2 pg_default
10793 postgres pg_default
10792 template0 pg_default
1 template1 pg_default
16542 testdb pg_default


※oidがディレクトリ名と一致


oid2name -U psadmin -P psadmin -d testdb2

Filenode Table Name
------------------------
16498 クワオメ・゙・ケ・ソ
16414 クワオメ・゙・ケ・ソ
16456 クワオメ・゙・ケ・ソ
16532 クワオメ・゙・ケ・ソ」イ
16448 クワオメ・゙・ケ・ソ」イ
16490 クワオメ・゙・ケ・ソ」イ
16534 クワオメ・゙・ケ・ソ」ウ
16450 クワオメ・゙・ケ・ソ」ウ
16492 クワオメ・゙・ケ・ソ」ウ


※filenodeがファイル名と一致
※ただし、DBのキャラセットとクライアントのキャラセットが一致してないと化ける

Windows版のPostgreSQLでは、キャラクタセットにSJISが指定できずEUCのため化けるようだ。

ということで、Windowsの場合は、以下の方法でもファイル名の判別ができる。


SELECT relfilenode as "Filenode", relname as "Table Name"
FROM pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_catalog.pg_database d ON d.datname = current_database(),
pg_catalog.pg_tablespace t
WHERE relkind IN ('r', 'i', 'S', 't') AND
t.oid = CASE
WHEN reltablespace <> 0 THEN reltablespace
ELSE dattablespace
END AND
(c.relname ~~ ANY (ARRAY['table_name']))
ORDER BY relname






おまけ。
Win環境ではoid2nameが綺麗に動かなかったので、ubuntu環境で試してみた。
ところが、ubuntuのパッケージマネージャでビルドしたPostgreSQLには、oid2nameが含まれていなかったため、以下の手順でソースパッケージからビルドして確認した。

まずはパッケージの入手

wget ftp://ftp2.jp.postgresql.org/pub/postgresql/source/v9.0.4/postgresql-9.0.4.tar.gz



展開

tar xvf ./postgresql-9.0.4.tar.gz



ビルド

$ ls
postgresql-9.0.4/ postgresql-9.0.4.tar.gz*
cd postgresql-9.0.4/contrib/oid2name
ls
Makefile oid2name.c
../../configure
make


これでoid2nameがビルドされてるのでこれを適当に使えばOKでした。


Index of all entries

Home > 2011年06月

タグクラウド
Categories
Monthly
Recent Entries
Recent Comments
Recent Trackbacks
Appendix

Nakunaru

    Author:Nakunaru

    データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
    気になる技術を少しずつ勉強していきます。


Return to page top