15時過ぎに自鯖(この blog が置いてある VPS)を Ubuntu 18.04LTS から 20.04LTS にしたんですが、そうしたら blog が文字化けしました。それどころか管理者ログインもできません。文字化けの見た目は DB に UTF-8 で保存されているテキストが latin-1 で解釈されて表示されているような感じなので、それを元に対処方法を探します。

まず mysql コマンドで繋いで SELECT * FROM wp_posts LIMIT 1; とかやってみると、やっぱり同じように化けています。というわけでどうやら PHP 側の問題ではなさそうだ、ということが分かります。

しばらくググっていると、 DB 文字コードセットの変換 – WordPress Codex 日本語版 という、かなり古い記事が見つかります。この記事によると、すごーく昔のバージョンの WordPress では DB の文字セットを latin-1 で作ってしまうと書いてあって、確かに手元の DB もそうなっています。Ubuntu 更新前は化けていなかったのはどうも「たまたま」のように見えます…というか化けるほうが正しい気が。PHP で MySQL にアクセスするライブラリの挙動が変わったんでしょうか。

ひとまず試しに ALTER TABLE wp_posts MODIFY post_title BLOB; としてみると、確かに記事のタイトルだけ文字化けが直ります。これで良さそうな感じなので手作業でカラムの型を変更していったのですが、よく見ると NOT NULL の情報を継承させるのを忘れています。また手作業でやっていくのも面倒だし、 /var/lib/mysql/ 以下にあるデータベースディレクトリはコピーして取っておいてあるので書き戻したら…DB が壊れました。アクセスしようとすると “Incorrect key file for table 云々” と言われます。えええ…

エラーメッセージでググると mysqlcheck をかけよう、と出てくるのですが、かけても修復はできません。18.04 に戻して(=新規インストール)して復旧させないといけないのか…と思いましたが、手元の VMware で 18.04 をインストールしてその上の MySQL でカラムの型を修正し、そのうえでアップグレードして出来上がった /var/lib/mysql を自鯖にコピーすることにしました(自鯖の MySQL は blog にしか使っていない)。やたら時間がかかりましたが、この手法でなんとか復旧したようです。

というわけで、この blog を作ったころの問題が今頃になって発現したわけです。いやぁ疲れたね。

Trackback

no comment untill now

Add your comment now