Nucleusのサイトを見ていたら、新しいバージョン3.64が出ていたのでアップグレードしました。
今回のアップグレードではデータベースの文字コード周りに修正が加わったらしく、アップグレード時に文字化けが起こることがあるそうです。
このブログでもアップグレードしたら文字化けが起こってしまいました。
その対策も含めて、アップグレードの方法を記録しておきたいと思います。
まず基本的な手順は次のページを参考にしました。
このやり方では、2番目にバックアップを取るように支持されていますが、念の為始めにバックアップを取っておいた方が良いでしょう。
バックアップの取り方は、「管理ホーム」→「DB保存/復元」から行います。
圧縮はしてもしなくても構いませんが、DBの容量が大きいと圧縮する方は失敗する可能性があります。
それからNucleusのファイルの方も丸ごとどこかにバックアップしておきましょう。
では、手順通り進めていきます。
やり方
以下をひと通り読んで、不明な点はフォーラムに相談して下さい。
1. 3.41のまま、upgradesスクリプトだけを実行し、データベース構造を3.64にアップグレード
アップグレード・パッケージを利用して下さい。
その際ファイルはまだ上書きしないで下さい。
バックアップファイルを作成できなくなります。
ダウンロードしたファイルを解凍すると、READMEとふたつのフォルダが作られるので、この内 upgrades の方をブログを設置しているサーバの nucleus/ 以下にコピーします。
そしてブラウザで、http://(ブログのURL)/nucleus/upgrades/index.php にアクセスすると、アップデートするためのページが表示されますので、指示に従ってアップデートします。
2. データベースをNucleus CMSの機能を使ってバックアップ
圧縮しても(zipファイル)、圧縮しなくても(テキストファイル)構いません。
先ほどバックアップしましたが、アップデート処理によってDBの構成が少し変わっているので、もう一度バックアップを取ります。
3. バックアップしたファイルを解凍し、テキストファイルに文字化けがないか確認
圧縮した場合は解凍して下さい。テキストファイルの中身が文字化けしていないかどうか確認します。文字化けしていた場合はフォーラムに相談して下さい
あるいは、テキストファイルのサイズが2MBを超えていてもフォーラムに相談して下さい
このブログの場合、UTF-8で運営しているので、テキストファイルの文字コードはUTF-8になります。
僕の場合、テキストファイルのサイズが330MBもありました(汗)。なので、確認作業にはEmEditorという大きなファイルでもらくに扱えるシェアウェアを使用しています。
こんなに大きいのは異常なんですかね。確認ができたらとりあえず今はこのまま置いておきます。
4. アップグレード・パッケージに含まれるファイルで上書き
サーバのファイルをアップグレード・パッケージに含まれるファイルで上書きします。テストして正常に動作していれば、アップグレードは終了です
もし正常に動作していなければ、以下に進んで下さい
アップグレード・パッケージというのは、手順1.で解凍して得られたフォルダの内 overwrites の方です。
その中身をNucleusをインストールしてあるサーバに上書きコピーします。
これだけで正常に表示されたらそれで終わりなのですが、僕の環境では文字化けしてしまいましたので、続きをやります。
なお、upgrades/ はもう使わないのでディレクトリごと削除してください。
5. サーバに新規フォルダを作成し、旧ファイルはこっちに移す
FTPソフトなどを使ってください。
手順の前にファイルの方も丸ごとバックアップ取ってありますが、ここでは改めてバックアップを取っておきます。
ここでは元のファイルは削除してしまうので、ディレクトリ名を変更するだけでいいでしょう。
そしたら元のディレクトリ名で改めてディレクトリを作り直し、次の手順で新規インストール用パッケージをその中に展開します。
6. 3.64をMYSQL_PREFIX付きで新規にインストール。正常に動作するか確認
今度は新規インストール版を使います。
以前と同じ階層にファイルが配置されるようにして下さい。
ポイントなのは、「データベースプリフィックスを使用する」ことです
これは、新規にテーブルを作成することで、文字化けしない設定を確保するために行いますもし正常に動作しなかったら、フォーラムに相談して下さい
新規インストール用パッケージをダウンロードして解凍した中身をサーバにコピーします。
そしたらブラウザから、http://(ブログのURL)/install/index.php にアクセスすると、Nucleusのインストールができます。もう覚えてないかもしれませんが、一番始めにインストールしたやり方と同じですね。
ここで登録する内容は、データベースプリフィックス以外は、前に登録した内容と同じがいいです。config.php やバックアップしたDBのファイルを見れば以前なんて登録したか分かるでしょう。
データベースプリフィックスとは、Nucleusで利用するテーブルのテーブル名の頭に付ける文字列のことです。
MySQLにアクセスして SHOW TABLES; などのコマンドで現在あるテーブル一覧を確認すると、nucleus_から始まるテーブルがいくつもあることが確認できると思います。
さて、インストール作業ですが、MySQL 5.5以降の環境ではテーブル作成時にエラーが出てしまうようです。
これは、CREATE TABLE構文の仕様変更があったからで、TYPE=MyISAM という書き方が ENGINE=MyISAM に変更になっています。
こちらを参考に、install.zip をダウンロードして、解凍してできる install.sql をサーバの install/ 内に上書きコピーしましょう。
7. メディアファイルやプラグイン、スキンを3.41から3.64に移す
5.で移したファイルのうち、これら3つを移します。
僕の場合、アクセス解析のために index.php もいじっていたので、新しいファイルと古いファイルを比較しながら、必要な内容をコピーしました。
robots.txt とか .htaccess とか他にもいじってる人は確認しておきましょう。
他にもプラグインで使用しているファイルがあればコピーしておきます。
8. テキストエディタを使い、バックアップファイルをMYSQL_PREFIXに合わせて修正
テキストエディタには、SQLのデータがそのまま入っています。これの修正を行います。用心のため、別なファイル名に保存して下さい。
(略)
例えば5.でデータベースプリフィックス「new_」を使用している場合、これまで「nucleus_actionlog」としていたものを「new_nucleus_actionlog」することで、新しいテーブルにバックアップデータが入るようになります。そのため、テキストエディタで「nucleus_」を「new_nucleus_」に置換することで、データを新しい環境用に書き換えることができます。
なお。テーブルの一覧は、SQLテーブル・リファレンスにあります。
テキストエディタと書いてありますが、手順2.で保存したテキストファイルのことですね。
この中身は開けば分かる通り、SQLコマンドがいくつも書かれています。その大まかな構造は、以下のようになっています。
テーブル1作成 (CREATE TABLE `table_name`……;)
テーブル1の内容を挿入 (INSERT INTO `table_name`……;)
テーブル2削除
テーブル2作成
……
この例で言うと、`table_name` というのがテーブル名です。
デフォルトのままだと `nucleus_blog` とかになってるので、手順6.で設定したプリフィックスを反映させて、例えば `new_nucleus_blog` などに修正していきます。
「``」はクオーテーション('')の代わりです。MySQLではデータベース名やテーブル名、カラム名などを指定するときにこれで囲みます。省略もできます。「;」で区切られた部分までが1つの命令です。命令の途中に改行を含めることもできます。
もの凄い数あると思うので、エディタの置換機能などを使いましょう。
手順にはプリフィックスの変更しか書かれていませんが、先ほど手順6.で install.sql を変更した人は、TYPE=MyISAM を ENGINE=MyISAM に書き換えなければなりません。
結構面倒くさいです。
さて、僕の環境でテキストファイルが300MBもあった理由ですが、NP_LOGというプラグインが NUCLEUS_HTTPLOG というテーブルに大量にログを保存していたのが原因だったみたいです。
ログはApacheの方で取ってあるので、NUCLEUS_HTTPLOG に INSERT している文をすべて削除したら、容量を7MBまでサイズダウンできました(笑)。
9. バックアップファイルをNucleus CMS経由でリストアし、データベースを更新
8.で作った修正データをNucleus CMSの機能でリストアして下さい。
修正が完了したら、「管理ホーム」→「DB保存/復元」からリストアしますが、もしテキストファイルが大きすぎてこれができない場合には、サーバ上でmysqlコマンドを使ってリストアします。
サーバ上の好きな場所(例えばホームディレクトリ)にテキストファイルをコピーして、以下のようにコマンドを入力します。
databaseはNucleusで使っているデータベースの名前です。
テキストファイルのファイルサイズにもよりますが、7MBでもリストアにはかなりの時間がかかります。
で、リストアしたのですが、やっぱり化けてしまいました。
そこでMySQLの文字コードの設定を見直したのですが、どうやら一部が Latin1 になっていたようです。
まずはMySQLの設定を見直します。/etc/my.cnf を開き、以下の2つの行を加えます。
character-set-server=utf8
[mysql]
default-character-set=utf8
そして、mysqldをリスタート。
この辺はOSによって違うので読み替えて下さい。僕はFedora15でやっています。
再起動したら、MySQLに入って設定された文字コードを調べます。
$ mysql database -p
mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
まだLatin1が残ってますね。
次にデータベースの文字コードを変更します。
もう一度確認すると、UTF-8になってました。
mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
この状態でリストアしたら文字化けしませんでした。
念の為、同じデータベースを使ってるアプリが他にあったらそっちも確認しておいた方がいいでしょう。
10. .htaccessなどの設定調整
.htaccessなどでhttpサーバの設定を変更している場合は、それを反映して下さい。
手順7.でやっちゃいましたね。念の為もう一度確認を。
あと、install/ はもう使わないのでディレクトリごと削除しましょう。残しておくとセキュリティホールになります。
テストしてみる
以上が無事に終了したら、いつもどおり投稿や編集などをしてみて下さい。
以上でアップグレードが完了しました。
最後に管理ホームを開いて、NP_Pingというプラグインがアップデートしたのでインストールし直すのと、NP_Cacheというプラグインでエラーが出ていたのでそれをインストールし直すのと、あと300MBもログを作ってたNP_Logのアンインストールですね。
この辺は環境によって違うと思います。
それから、バックアップファイルですが、これはとっておいた方がいいでしょう。何があるか分かりませんから。
データベースには新旧ふたつずつテーブルがある状態ですが、これも残しておいた方がいいんじゃないかな。
消したい場合は、以下のコマンドで削除します。
mysql> DROP TABLE `table_name`;
databaseとtable_nameの部分は書き換えて下さいね。意味は前述したので省略します。