Home > 2011年06月
2011年06月 Archive
WEB開発のべからず集
- 2011-06-25 Sat 19:19:40
- 雑誌
アンチパターンから学ぶことも多いと思うんですよね。
自分が失敗して学ぶこともあれば、他人の失敗から学ぶこともあるというか。
他の特集記事も面白そう。
ということでポチりたいと思います。
PostgreSQLのデータファイルの判別方法
- 2011-06-16 Thu 23:04:10
- PostgreSQL
(デフォルトではインストール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でした。
.
Home > 2011年06月
- タグクラウド
-
- Categories
- Monthly
- Recent Entries
- Recent Comments
- Recent Trackbacks
- Appendix
- Author:Nakunaru
データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
気になる技術を少しずつ勉強していきます。