メンテナンス・トラブルシュート - ウェブサーバ - 文字コードを UTF-8 へ

 クラウディア
1. 準備
2. postgreSQL 文字コード変換
3. コンテンツファイル文字コード変換
4. 後始末

1. 能書き

 このサイト以外にもいくつかのサイトを持っておりまして。時々に気分が変わるものですから、文字コードが EUC-JP、Shift-JIS、UTF-8 と混在しております。  好む好まざるにかかわらず、世の中の流れは 2015年6月現在は、UTF-8 の方向へ向かっているようです。取り返しのつかないことにならないうちに、UTF-8 化しておこうと思い立ちました。  なにはともあれ「システムバックアップ」。  システムのバックアップが終わったら、ウェブサーバを停止します。

> /usr/local/etc/apache stop

2. postgreSQL 文字コード変換

 幸いなことに mySQL の方は UTF-8 に設定していたのでここでは mySQL の方は割愛しますが、postgreSQL のデータベースが EUC-JP なもんだから、まずはバックアップ

> pg_dumpall --column-inserts --username=pgsql > pg_dumpall.sql
 postgreSQL サーバの停止。

> /usr/local/etc/rc.d/postgresql stop
 pg_dumpall.sql というファイルができていますので、これを編集します。  これができるのは、あくまでも全体のバックアップファイルがエディタで編集できるサイズの小さなデータベースの場合です。  もっと大きなデータベースであれば、スキーマ単位であったり、テーブル単位で編集します。  エディタは文字コード変換機能のついているエディタが必要です。変換機能のついているエディタであれば、pg_dumpall.sql の文字コードを一括変換します。  それと pg_dumpall.sql の中で、

SET client_encoding = 'EUC-JP'; [Shift-JIS] であれば 'SJIS' と記述されているはずです
 と記述している個所を

SET client_encoding = 'UTF8';
 と書き換えていきます。  以前のデータベースを rename します。

> mv /usr/local/pgsql/data /usr/local/pgsql/20XXMMDD_data
 pgsql ユーザでデータベースを初期化します。

> su pgsql
$ initdb -D /usr/local/pgsql/data --encoding=UTF8
The files belonging to this database system will be owned by user "pgsql".
This user must also own the server process.

The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".

creating directory /usr/local/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /usr/local/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    postgres -D /usr/local/pgsql/data
or
    pg_ctl -D /usr/local/pgsql/data -l logfile start
 必要であれば、/usr/local/pgsql/data/pg_hba.conf や /usr/local/pgsql/data/postgresql.conf を編集します。  postgreSQL サーバを起動します。

> /usr/local/etc/rc.d/postgresql start
 バックアップしていたデータをリストアします。

> psql --username=pgsql --file pg_dumpall.sql postgres
 編集に問題がなければ、これでデータが正常にはいるはずです。  わたしは実際の作業で何度かしくじりまして、postgreSQL サーバの停止や起動、initdb、pg_dumpall.sql の編集を数回繰り返しました。

3. コンテンツファイル文字コード変換

 ここは、実はオフラインで前もって変更できますので、準備より前にやっておいて、確認だけにするのが賢明なやり方です。  コンテンツファイルの編集に Eclipse を使用しているのであれば、「文字コードの一括変換」を参考にして、一括返還を行います。  php を仕様ている場合、mb_convert_encoding あたりを検索して、他の文字コードへの変換を行っていないか確認し、間違っているのであれば、修正します。  コンテンツファイルの編集が終わったら、apache サーバを起動します。

> /usr/local/etc/apache start
 あとは、実際に文字コードがうまく表示されているかを確認して、作業を完了します。

4. 後始末

 postgreSQL のデータベース変換を行っているときにパンチミスで「--encoding=UTF8」というディレクトリを作っちゃいました。  これが、見えないし

> ls --encoding=UTF8
ls: illegal option -- -
usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format] [file ...]
 消せないし

> rm -R --encoding=UTF8
rm: illegal option -- -
usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
 困ったことになっちゃいました。  少し調べて、解決しましたが、i-node 番号で find して、exec rm で消せばいいそうな…。

> ls -i
4122307 --encoding=UTF8     3768320 ..                  3794840 .
> find . -inum 4122307 -exec rm -Rf {} \;
> ls
.                   ..
 ああ、消えた。良かった良かった。
ハイスピードプラン