XREAの2015年1月21日のメンテナンスでMySQLデータベースが「ほぼ」空っぽになったので復旧した
2015年1月21日に私が利用しているレンタルサーバ「XREA」で大規模メンテナンスがあったらしく、メンテナンス実施以降、私のブログ記事を作成するためのソフトウァア「Movable Type」が動作しなくなっていた。
具体的には、Movable Typeの記事作成の管理画面、記事から張られている「タグ」をクリックした際に「タグ」に関連付けられた記事一覧を表示する画面など、MySQLデータベースと連携する動的な画面が正常に動作せず、以下のようなエラー画面になっていた。
エラーが発生しました。
Connection error: Access denied for user '私のXREAのMySQLデータベースのユーザ名'@'localhost' (using password: YES)
※「私のXREAのMySQLデータベースのユーザ名」の部分は、実際にXREAのデータベースに接続するためのユーザ名が表示されていたので、セキュリティ的にも問題がある状態だった。
2015年1月21日に実施されたXREAのメンテナンスは、以下のような内容。
《参考》XREAサーバー Apache/PHPのバージョンアップメンテナンスについて
http://www.xrea.com/info/upgrade2014.html
※以下、一部抜粋。
2014年12月16日(火) 午前6:00~9:00 → s1 ~ s10.xera.com
2015年1月21日(水) 午前0:00~9:00 → s11 - s100.xera.comメンテナンス内容
•ウェブサーバーのバージョンアップ(Apache2.2系へ変更)
•標準のPHPのバージョンアップ(PHP5.2系 → PHP5.3系へ変更)
PEARライブラリもPHP5.3ベースに変更
•CGI版PHP5.2、5.3、5.4、5.5、5.6の最新版へのアップデート
•FastCGI版PHP5.3、5.4、5.5、5.6の提供
•セーフモードの解除
•お客様サイト内のユーザー所有者「apache」のファイルをユーザー様へ変更
色々と書いてあるが、私が今回影響を受けたのは以下のMySQLの件。
同時に下記内容でデータベースのバージョンアップを行います。
古いデータベースからはデータは完全には引き継げないため、お客様にてご修正いただく必要が出てくる予定です。
•MySQL → 5.6 へのバージョンアップ
•PostgreSQL → 9.3 へのバージョンアップ重要な仕様変更・お客様にしていただきたい操作について
データベースが最新版になる
MySQL4以前などの古いデータベースからデータは完全には引き継げませんので、データベース内のデータが一旦空になります。
特に文字コードはUTF8が標準となりますので、そのまま引き継ぐと不具合の出る可能性があります。
バックアップ、ダンプデータをFTP領域の「/_DB_BACKUP_XREA_UPGRADE」に設置いたします。MySQLについては、弊社にて、MySQL4.0.18以下からのバージョンアップで発生する、下記・既知の要修正項目を修正させていただいております。
1)下記の置換え。
TYPE=MyISAM → ENGINE=MyISAM
TYPE=InnoDB → ENGINE=InnoDB2)先頭文字列「-----」で始まる行の除外。
それ以外の要修正項目については、お客様にて修正いただく必要が出てまいります。
さらに、以下も読む必要があった。
■メンテナンス案内:http://mainte.value-domain.com/eventview.cgi?host=XreaAll&no=55
※以下、一部抜粋。
○メンテナンス日時 / 対象サーバー
・2014/12/16 (火) 06:00 ~ 09:00 / s1 - s10.xrea.com
・2015/01/21 (水) 00:00 ~ 09:00 / s11 - s100.xrea.com (13日から延期)
*その他のXREAにつきましても順次実施します。○作業内容
・MySQLのバージョンアップ(5.6系へ変更)
・PostgreSQLのバージョンアップ(9.3系へ変更)・標準のPHPのバージョンアップ
(モジュール版PHP5.2系からFastCGI版PHP5.3系へ変更)
・PEAR ライブラリ PHP5.3ベースに変更
・CGI版PHP5.2、5.3、5.4、5.5、5.6の最新版へのアップデート
・FastCGI版PHP5.3、5.4、5.5、5.6の提供・ウェブサーバーのバージョンアップ(Apache2.2系へ変更)
・お客様サイト内のユーザー所有者「apache」のファイルをユーザー様へ変更
・セーフモードの解除・標準のRubyのバージョンアップ(Ruby1.8系からRuby2.2系へ変更)
・標準のPythonのバージョンアップ(Python2.4系からPython2.7系へ変更)・管理画面の「PHP設定」メニューの追加
○主な仕様変更
・MySQL、PostgreSQLデータベースが大幅にバージョンアップする
→使えるSQLコマンドの違い、内部文字コードの違い、テーブル構造の違いなどが原因で、一部の例外を除き、データを新バージョンに引き継げない見込みです。
⇒弊社にて作業前にデータベースのダンプファイルを取得し、お客様のサーバーアカウント内に保存しますので、お客様にて修正、リストアをお願いいたします。
※ ダンプ保存先:./DB_BACKUP_XREA_UPGRADE/mysql_DB名.dump、./DB_BACKUP_XREA_UPGRADE/pgsql_db名.dump
※ mysql_DB名.dumpは、MySQL4.0.18以下からのアップデートにともない下記変更を加えています。
TYPE=MyISAM→ENGINE=MyISAM、TYPE=InnoDB→ENGINE=InnoDB
メンテナンスは昨年からXREAからは告知されていたので、それに対して全く準備をしなかった私が悪いし、いつまでも古いものをセキュリティなども考慮しながら安い値段でXREAが提供し続けるのはつらいだろうから、バージョンアップは仕方がないだろう。
MySQLのバージョンアップについても、既知の問題については、XREA側で既に対応してくれているようなので、親切心すら感じる。
長年XREAを使っている妙な愛着もあるし、このようなトラブルがあることを承知の上でXREAを使い続けているので、特にXREAに対して悪い印象も持たず、対応策を考える。
XREAの説明を見て、私がするべき作業は、主に以下の3点であると推測する。
1.XREAがメンテナンス前に作成したダンプファイルを使用し、データベースをリストア(再作成)する。
2.Movable Typeのデータベースの文字コードをEUC-JPにしていたので、UTF-8に変更する。
3.動作しないプログラムがあれば、.htaccessやプログラムを調整する。
3については、現時点では影響度合いが分からないので、ひとまず、MySQLデータベースに関する1と2を対応することにした。
XREAのサイトの説明に「データベース内のデータが一旦空になります」とあるので、どうやらXREAのメンテナンスにより、MySQLデータベースのデータが空っぽになったようだ。
状況確認のために、XREAのサーバにSSH接続し、確認してみると、説明と違う状況であることが分かる。
私のXREAのユーザ名@s65:~> mysql -u私のXREAのMySQLデータベースのユーザ名 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 245517
Server version: 5.6.22-log Source distribution
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| test |
+--------------------+
3 rows in set (0.14 sec)
※私のXREAのMySQLデータベース名は、このブログ記事の説明では、「mydb」とする。
まず、mydbが、削除されずに残っていることに驚いた。
中身が空っぽなのかな、と思って、テーブル一覧を表示してみる。
mysql> use mydb
Database changed
mysql> show tables;
+--------------------+
| Tables_in_mydb |
+--------------------+
| mt_as_ua_cache |
| mt_asset |
+--------------------+
2 rows in set (0.01 sec)
テーブルが2つ残っていた。
どちらもMovable Typeで使用されているテーブルのようだ。
テーブルの中身を見てみる。
mysql> select * from mt_as_ua_cache;
Empty set (1.24 sec)
このテーブルは、中身が何もないことが分かった。
mysql> select count(*) from mt_asset;
+----------+
| count(*) |
+----------+
| 420 |
+----------+
1 row in set (0.00 sec)
このテーブルは、420行分のデータが残っているようだ。
XREAのサーバから、MySQLのバックアップファイル(ダンプファイル)をWindows PCにFTPでダウンロードして、中身を見てみることにした。
※ダンプファイルは、XREAの説明の通り、「/DB_BACKUP_XREA_UPGRADE」直下に、mysql_DB名.dumpで保存されていた。
ダンプファイルをサクラエディタで見て、mt_as_ua_cache、mt_assetのCREATE TABLE文やmt_assetテーブルにデータを格納するためのINSERT文も入っていることを確認した。
XREAの説明では、「データベース内のデータが一旦空になります」ということであるから、何故、これら2テーブルに関連するデータが削除されずにXREAのデータベースに残っていたのかは謎であるが、ダンプファイルにデータは含まれているように見えたため、これら削除されずに残っていた2テーブルについては削除してよいと判断した。
データベースの削除
ブラウザでXREAの管理画面にログインし、管理画面の左のメニューより、「データベース」をクリック。
「MySQLの追加・編集(最大:5 個)」のコーナーに、Movable Typeで使用していたデータベース名「mydb」があることを確認。
データベース名「mydb」をXREAの管理画面内にある[削除]ボタンをクリックして、削除。
「文字コード」のプルダウンには、「EUC-JP」の選択肢が残っているが、「文字コード」のヘルプを見ていると、以下の記載があった。
文字コードを指定します。MySQL5以上の場合、UNICODE、SHIFT_JISで作成できます。
MySQL5以上になっているのは明らかであるため、プルダウンでEUC-JPが選択できそうに見えていても、EUC-JPでは作成できないのだろうし、仮に作成できたとしても、今後長期的にXREAを利用するのであれば、XREAの説明を無視するわけにはいかないから、ここは素直に、UTF-8でデータベースを再作成することとする。
データベースの作成
データベース名は先ほど削除したデータベース名と同じ「mydb」を入力し、[作成]ボタンをクリック。
これでデータベース「mydb」が作成される。
データベースのリストア(復元)
データベース作成時点では、データベースにはデータが何も入っていない空っぽの状態なので、XREAがメンテナンス前に残したデータベースのダンプファイル(バックアップファイル)から、データベースの中身をリストア(復元)する。
データベースのリストア(復元) - XREA管理画面で実施する方法 ※注意、失敗する場合がある。
XREAの管理画面には、以下のメッセージがあるので、これに従い、ファイル名をmysql.dumpでアップロードする。
※ 「復元」・・・トップディレクトリの、mysql.dump(MySQL)、pgsql.dump(PostgreSQL)からデータベースに復元/リストアします。
《備考》
・XREAの「トップディレクトリ」とは、FTP接続をした際に自分のXREAユーザで移動できる最上位ディレクトリとなる。FTPの接続先のパスとしては「/」となる。
・データベースのダンプファイル「mysql.dump」の文字コードは、EUC-JPからUTF-8に変更しておく。(変更方法については後述する。)
XREAの管理画面で、[復元]ボタンをクリック。(これで、リストア作業は完了するはずなのだが・・・。)
状況確認のために、XREAのサーバにSSH接続し、mysqlコマンドで確認してみる。
mysql> use mydb
Database changed
mysql> show tables;
+-------------------+
| Tables_in_mydb |
+-------------------+
| mt_as_ua_cache |
| mt_asset |
| mt_asset_meta |
| mt_association |
| mt_author |
| mt_author_meta |
| mt_author_summary |
| mt_blog |
| mt_blog_meta |
| mt_category |
| mt_category_meta |
| mt_comment |
| mt_comment_meta |
| mt_config |
| mt_entry |
+-------------------+
15 rows in set (0.00 sec)
リストア(復元)されたテーブルの数がやけに少ない。
mt_tagなどの明らかに必要なテーブルがリストア(復元)されていない。
ひょっとして、データベースのダンプファイル内にも必要なテーブルについての記述(CREATE TABLEやINSERt文)がなかったのだろうかと思ってダンプファイルを見てみると、mt_tagなどの記述はあることを確認。
ということは、データベースのリストア(復元)が、リストア途中でエラーとなって失敗しているのだろう。
復元されているmt_entryテーブルは、Movable Typeで作成した具体的な記事が保存されるテーブルであるため、そちらをSELECT文で見てみると、特に文字化けもせず、無事に記事データが入っているようだった。
しかし、いくつかの記事が保存されていないようなので、やはりリストアに失敗しているようだ。
ちなみに、この状況でも、ブラウザでMovable Typeのログイン画面を表示することができるようになったが、ユーザ名とパスワードを入力しても、以下のエラーになる。
ブログまたはウェブサイトへのアクセスが許されていません。エラーでこのページが表示された場合は、システム管理者に問い合わせてください。
このエラーは、ユーザ名とパスワードを管理するテーブルがリストア(復元)されていないことが、原因だろう。
ダンプファイルに含まれるテーブルとデータを欠損なく全てリストアしないと、Movable Typeが正常な状況に戻らないので、リストア方法を見直すことにする。
再度、XREAの管理画面で、データベースの削除、作成を行う。
データベースのリストア(復元) - Linuxのコマンドラインで実施する方法
リストア(復元)作業がXREAの管理画面ではうまくいかなかったので、XREAのLinuxサーバにTera TermでSSH接続を行い、コマンドラインで行うことにした。
XREAの管理画面からのリストア作業ではリストア時にエラーが発生してもエラーメッセージを確認する手段がないが、コマンドラインでのリストア作業であれば、エラーが発生した際にエラーメッセージがコマンドライン画面に出力されるため、エラーの原因の確認と解決方法を検討できる。
SSHで接続後、cdコマンドで、mysql.dumpを保存しているディレクトリに移動する。
mysqlコマンドで、データベースをリストア(復元)する。
私のXREAのユーザ名@s65:~> mysql -u私のXREAのMySQLデータベースのユーザ名 -p mydb < mysql.dump
Enter password:
データベースのパスワードを入力すると、リストア作業が開始される。
しばらく待っていると、以下のエラーが発生した。
ERROR 1366 (HY000) at line 6220: Incorrect string value: '\x8F\xAB\xB1e Z...' for column 'entry_text' at row 1
どうやら、データベースのダンプファイル「mysql.dump」に含まれる文字列でエラーが発生しているようだ。
データベースのダンプファイルの文字コードをEUC-JPからUTF-8に変更した方法に、問題があったものと推測。
データベースのダンプファイルを私のノートPC(Windows 7)にダウンロードし、PC内のテキストエディタ「サクラエディタ」の文字コードを変換する機能でEUC-JPからUTF-8に変換したことがまずかったのかもしれない。
さて、どうやって文字コードを変換しようかと思ったが、Linuxの「nkf」コマンドを使用する方法ぐらいしか思いつかない。
XREAがメンテナンス前に残してくれた「EUC-JP」の文字コードのままになっているダンプファイルをXREAの「トップディレクトリ」にコピーし、以下のコマンドを実行。
nkf -w mysql_私のXREAのMySQLデータベース名.dump > mysql.dump
nkfコマンドでUTF-8に文字コードを変換したダンプファイルをWindows PCにダウンロードして、サクラエディタでUTF-8に変換したダンプファイルとを「WinMerge」という差分比較ソフトで、差分箇所を見比べる。
なるほど、EUC-JPのダンプファイルに含まれていた機種依存文字らしきものをUTF-8用にどのように変換するか、という点が、nkfコマンドとサクラエディタでのUTF-8への変換処理において、違いがあるようだった。
nkfコマンドで変換したファイルをざっと眺めて、文字化けらしきものがないことを確認し、たぶんOKだろう、ぐらいの大雑把な判断しかできないが、もうこれでリストアすることにした。
私のXREAのユーザ名@s65:~> mysql -u私のXREAのMySQLデータベースのユーザ名 -p mydb < mysql.dump
Enter password:
私のXREAのユーザ名@s65:~>
データベースのパスワードを入力すると、リストア作業が開始される。
しばらく待っていると、エラーが何も出ず、リストア作業が終了した。
状況確認のために、mysqlコマンドで確認してみる。
mysql> use mydb
Database changed
mysql> show tables;
+----------------------+
| Tables_in_mydb |
+----------------------+
| mt_as_ua_cache |
| mt_asset |
| mt_asset_meta |
| mt_association |
| mt_author |
| mt_author_meta |
| mt_author_summary |
| mt_blog |
| mt_blog_meta |
| mt_category |
| mt_category_meta |
| mt_comment |
| mt_comment_meta |
| mt_config |
| mt_entry |
| mt_entry_meta |
| mt_entry_rev |
| mt_entry_summary |
| mt_failedlogin |
| mt_field |
| mt_fileinfo |
| mt_filter |
| mt_ipbanlist |
| mt_log |
| mt_notification |
| mt_objectasset |
| mt_objectscore |
| mt_objecttag |
| mt_permission |
| mt_placement |
| mt_plugindata |
| mt_profileevent |
| mt_profileevent_meta |
| mt_role |
| mt_session |
| mt_tag |
| mt_tbping |
| mt_tbping_meta |
| mt_template |
| mt_template_meta |
| mt_template_rev |
| mt_templatemap |
| mt_touch |
| mt_trackback |
| mt_ts_error |
| mt_ts_exitstatus |
| mt_ts_funcmap |
| mt_ts_job |
+----------------------+
48 rows in set (0.00 sec)
リストアに失敗した時には15テーブルしかリストア(復元)されなかったが、今度は、48テーブルリストア(復元)した。
48テーブルで不足がないかどうかは実はよく分からないが、コマンドラインでのリストア(復元)時にエラーが出なかったので、問題ないと判断することにした。
Movable Typeのコンフィグファイルの修正
データベースの文字コードを変更したことに伴い、Movable Typeのプログラムファイル(コンフィグファイル)も変更する必要があるのではないかと思って調べてみると、mt-config.cgiの修正が必要そうだったので、修正をした。
mt-config.cgi
<修正前>
PublishCharset euc-jp
↓
<修正後>
PublishCharset UTF-8
《参考》>PublishCharset | 環境変数リファレンス
http://www.movabletype.jp/documentation/appendices/config-directives/publishcharset.html
以上の作業により、Movable Typeへのログイン、記事作成、「タグ」に関連付けられた記事の検索など、動作しなかったMovable Typeの各機能が動作するようになった。
直ってよかった!
《関連リンク》
Movable Typeのエラー「不正な要求です。文字コードUTF-8に含まれない文字データを送信しています。」の原因と解決方法