サイト移転作業で躓いたことの2件目です。まぁ、本来であればこちらが1件目なんですが…
先にも書いた通り移転先のサーバーではPleskを使っています。で、Pleskからデータベースを作成するわけなのですが、今回問題が発覚したのは移転元のPostgreSQLでは何故か文字コードがEUC_JPだったんですね。移転先は普通に作るとUTF-8になります。さて困った。このままでは移行できない!ということでいろいろ調べましたら、「Pleskでデータベースを作成した後に、コマンドラインからDROP DATABASEしてCREATE DATABASEしろ」という情報が見つかりました。ちなみに、Pleskで作ったユーザーではデータベースの削除・作成権限がないのでPleskのユーザーで実行する必要があります。
dropdb -h localhost -U ユーザー名 -W データベース名
で、パスワードを聞かれるので入力するのですが
Ident authentication failed for user "ユーザー名"
になって認証が通りません。はて?ユーザー名もパスワードも合っているのに何故?実は、デフォルトの設定が曲者でした。/var/lib/pgsql/data/pg_hba.conf を覗いてみます。
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 ident # IPv6 local connections: host all all ::1/128 ident
となっているんですね。peerもidentもほぼ同じ意味(細かく言えば違います)でUNIXユーザーで認証しまっせ!っていう意味だそうです。いやいや、作ったユーザーはPostgreSQLにしかないから!というわけで書き換えます。
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust
trustはUNIXユーザーとPostgreSQLのユーザーが異なっていても認証します!という意味だそうです。ちなみに、local行だけ書き換えればよいという記事も多いのですが、こちらの環境ではhost行も書き換えないとダメでした。書き換えた後にPostgreSQLを再起動してOKになりました。
早速、データベースの再作成をしてみます。
dropdb -h localhost -U ユーザー名 -W データベース名 createdb -T template0 -h localhost -U ユーザー名 -W -E EUC_JP --locale=C データベース名
で再作成は完了です。めでたくEUC_JPなデータベースの出来上がりです。ちなみに、–locale=Cを付けないと
encoding "EUC_JP" does not match locale "en_US.UTF-8"
とエラーになります。また、-T template0を付けないと
new encoding (EUC_JP) is incompatible with the encoding of the template database (UTF8)
とエラーになります。ここら辺も、どちらのオプションも付けてない情報があるので注意が必要です。
ではでは、お役に立てますように。
コメント