UbuntuのPostgreSQLでEUC_JPのデータベースを作る

Ubuntuでポスグレを入れたときにはまったのでメモ。

EUC_JPのデータベースが作れない

ポスグレのインストールはすごく簡単で、

$ sudo apt-get install postgresql

インストール、起動までやってくれます。
で、最初はUTF-8のデータベースばっかり作っていて気づかなかったのですが、いざEUC_JPのデータベースを作ろうとすると下記エラーが出ます。

$ createdb -E EUC_JP -U hoge testdb
createdb: database creation failed: ERROR: encoding EUC_JP does not match server's locale ja_JP.UTF-8
DETAIL: The server's LC_CTYPE setting requires encoding UTF8.

先日のエントリにも書いたとおり、UbuntuはデフォルトではUTF-8しか使えないので、それの影響かと思いlocale-genをしたのですが、変わらず。
どうやらinitdbを--no-localeでやっていないことが原因っぽい。

ということでinitdb

とうことで--no-localeでinitdb。
ちなみにPG_DATAフォルダ以下を空にしないとinitdbできないので、rm -rfとかで消しておくこと。

$ /usr/lib/postgresql/8.3/bin/initdb -D /var/lib/postgresql/8.3/main --encoding=UTF8 --no-locale

その後、ポスグレ起動。

$ sudo /etc/init.d/postgresql-8.3 start
 * Starting PostgreSQL 8.3 database server
 * The PostgreSQL server failed to start. Please check the log output:
2009-04-22 12:35:52 JST FATAL:  could not load server certificate file "server.crt": No such file or directory
                                                                                                  [fail]

ん、なんじゃこのエラーは。
とりあえずファイルを適当に作ってみる。笑

$ touch main/server.crt
/var/lib/postgresql/8.3% sudo /etc/init.d/postgresql-8.3 start
 * Starting PostgreSQL 8.3 database server
 * The PostgreSQL server failed to start. Please check the log output:
2009-04-22 12:36:17 JST FATAL:  could not load server certificate file "server.crt": no start line
                                                                                                   [fail]

あ、やっぱりだめっぽい。
調べてみると、どうもserver.crtというサーバ証明書が必要らしい。前こんなのあったけなあ。
とりあえず作る。

$ sudo openssl genrsa -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.................++++++
.....++++++
e is 65537 (0x10001)

引き続き。Common Nameは外部からアクセスするためのホスト名か IPアドレスにする必要があるようです。

$ sudo openssl req -new -key server.key -x509 -days 1096 -out server.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank

For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:都道府県
Locality Name (eg, city) []:市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:会社名とか
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:自分のIP
Email Address []:

んでもってコピー。

$ cp -p /etc/postgresql/8.3/main/server.crt /var/lib/postgresql/8.3/main
$ cp -p /etc/postgresql/8.3/main/server.key /var/lib/postgresql/8.3/main

再度再起動。

$ sudo /etc/init.d/postgresql-8.3 start
 * Starting PostgreSQL 8.3 database server
 * The PostgreSQL server failed to start. Please check the log output:
2009-04-22 12:49:15 JST FATAL:  unsafe permissions on private key file "server.key"
2009-04-22 12:49:15 JST DETAIL:  File must be owned by the database user or root, must have no write permission for "group", and must have no permissions for "other".
                                                                                                                                                      [fail]

まだダメかよ。権限変更。

$ chmod 400 /var/lib/postgresql/8.3/main/server.crt 
$ chmod 400 /var/lib/postgresql/8.3/main/server.key 

再起動。

$ sudo /etc/init.d/postgresql-8.3 start
 * Starting PostgreSQL 8.3 database server                     

で、何とかなりました。

あとから気づいたこと。

今までFreeBSDとかでinitdbしてこんなこと一回もなかったよなあと思っていたら、どうもpostgresql.confのssl=trueが怪しい気がしてきました。
これがあるからSSL接続が必要になって、サーバ証明書なんかが必要になったような気がする。
ということでこんなめんどいことをしなくてもinitdb後、postgresql.confをssl=falseにして再起動すればいいのかもしれません...