PostgreSQL: 2010年1月アーカイブ

psql -n hogedb とコマンド叩いて psql(PostgreSQL のターミナル型フロントエンド)を立ち上げ、

INSERT
INTO
    t_address
VALUES (
    '1',
    '742-0301',
    '岩国市周東町祖生',
    '2010-01-08 17:40:46'::timestamp
);

という SQL を実行しても、SELECT してみると、

hogedb=# SELECT * FROM t_address 
 uid |   post   |          address           |        cdate
-----+----------+----------------------------+------------------------
 1   | 742-0301 |                            | 2010-01-08 17:40:46
(1 rows)

という具合に住所が表示されない。
エラーは出てないので、登録されているはずだがなあ・・・

DB の Encoding は EUC_JP。

PuTTY の文字コードの設定が UTF-8/Auto-Detect Japanese になっていたので、EUC-JP に変えてみたが駄目。

Perl でちょいプロを作って、DBI/DBD 経由で書き込んでみたが同じ状況。エラーは出ないのだが、psql で該当テーブルを見てみると、日本語が表示されない。

今度は、SELECT する「ちょいプロ」作って確認してみよ・・・とプログラムを書きだしたところで、ハっと思いついて pg_dump hogedb > hogedb.txt と DB 内容のダンプを出力してみた。

そしたら、

--
-- Data for Name: t_address; Type: TABLE DATA; Schema: public; Owner: xxxxxx
--

COPY t_address (uid, post, address, cdate) FROM stdin;
1       742-0301        岩国市周東町祖生      2010-01-08 17:40:46

という具合にしっかり日本語部分も登録されているのが確認できた。

psql が日本語を表示してないだけか!?
う~ん、何でじゃろうね。
psql って、ページャーは more を使ってるんだったっけ?

なにせ、PostgreSQL 8.4.2 と CentOS 5.4 の組み合わせが初めてなのと、ここ数年、そういやあ新規開発案件は MySQL ばかりで、psql を使ってあれこれというケースもあまりなかったよ。
だから知らないのだが、最近の psql はこうなのか?

昔、psql が日本語対応してなかった時も、全然表示しないということはなかったからなあ。文字化けするだけで。

ま、取りあえず psql 使ってする作業は終わったので、これ以上原因は追及しないが、またも無駄な時間を過ごしてしまった。(^^;

阿呆だった。
誰がだ?俺がだ。

俺は駄目なヤツだ。
駄目なヤツは俺だ。

ああ、何ということだ。何ということだ。

こんな、あんな、そんな・・・ああ・・・

俺の4時間を返せぇ~

いや、何かというと、CentOS 上の Perl5.8 で PostgreSQL を DBD::Pg モジュール経由で使う設定をしたのだが、シェル上ではそのプログラムを実行出来るのに、Apache の CGI として実行すると駄目というケースが発生したのだ。

install_driver(Pg) failed: Can't load '/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/DBD/Pg/Pg.so' for module DBD::Pg: libpq.so.5: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/DynaLoader.pm line 230.
 at (eval 3) line 3
Compilation failed in require at (eval 3) line 3.
Perhaps a required shared library or dll isn't installed where expected
 at ./test.cgi line 89

こんなヤツね。

root や postgres ユーザでシェル上で実行すれば正常に動くのに・・・
これの解決に(このことばかりやってたわけではないが)4時間もかかってしまい、こんな時間になっているわけである。とほほ。

「それは、Apache の httpd.conf に SetEnv LD_LIBRARY_PATH /usr/local/pgsql/lib って書けばいいのだよ!」とか言う?
確かに昔はそんなこともしてたけどなあ。
ちゃんと /usr/local/pgsql/lib も ldconfig で認識させているから問題ないのだよ。そんな問題ではないのだ。

ま、とは言いつつ、藁をもすがる気持ちで実は SetEnv もしてみたけどな。(^^;
もちろん意味はない。

結局、原因は単純だった。

/usr/local/pgsql のパーミッションが 0700 になっていただけ・・・(^^;
なので、root や、このディレクトリのオーナーである postgres だけしか(いくらちゃんとライブラリのパスを通していても)DBD::Pg モジュールが利用できなかったのだな・・・とほほ。

いつもなら、PostgreSQL をインストールするとき、あらかじめ root で mkdir /usr/local/pgsql して、インストール後に chown -R postgres /usr/local/pgsql とかするのよ。
そしたら、/usr/local/pgsql のパーミッションは 0755 で作成されるので問題なかったんだよ。

今回は、急ぎテスト環境を作りたかったので、postgres ユーザを作る時に、

useradd -g postgres -u 128 -c 'POSTGRES Admin' -d /usr/local/pgsql -m -s /bin/csh postgres

と、ホームディレクトリとして /usr/local/pgsql を作っちゃったのよ。これが不味かった。パーミッションが 0700 で作られてしまうからな。

・・・そうなんだよな。以前も別のエントリで書いたけど、俺は「BSD の人」なので、未だに Linux 系でホームディレクトリが 0700 で作られちゃうことに馴れてないのであります。(^^;

まったく。困った話だ。

結局、chmod 755 /usr/local/pgsql したら全て解決。

ググってみたら、けっこう同じような状況ではまっている人も多いので、恥をさらしてエントリを公開しておくのだ。

ああ、俺の貴重な睡眠時間が・・・

このアーカイブについて

このページには、2010年1月以降に書かれたブログ記事のうちPostgreSQLカテゴリに属しているものが含まれています。

前のアーカイブはPostgreSQL: 2008年12月です。

次のアーカイブはPostgreSQL: 2011年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら