この記事では、長々と書いてしまう恐れがあるため、すぐに要点だけをつかみたい方は、以下のEC-CUBEコミュニティースレッドをご覧ください。
1系から2系へのDB移行について
アップデートといえば、「差分をパッととってきて、ピッとパッチをあてて、ポッと完了したい」と思われるかと思いますが、1系と2系の内部構造、文字コードの違いにより、現在のところ実質的に難しいです。
そこでこの記事では、手間はかかるけど既に実現している1つの方法、「データの移行」による方法を説明しています。
この記事では、以下のような状況を仮定して説明させて頂きます。すべての皆さんがこの条件に100%は当てはまらないと思いますが、部分部分だけでも参考になると思います。
尚、この作業は僕がこれまで十数回以上試みて成功した例ですが、環境による違いもありますので、くれぐれも(十分にテストするなど)注意して、自己責任の上作業して下さい。
想定している状況
- 現在運用中のEC-CUBEはバージョン1系であり、これをEC-CUBE2系にバージョンアップする。
- データベースはこれまでMySQL4系を利用してきたが、バージョンアップを機会にパフォーマンスがダントツに良いと噂されるPostgreSQL8.3系を利用する
- データだけ移動するので、2系は新しくインストールし、その後にリストアを行う。
- 移行にはphpMyAdminとphpPgAdminのGUIツールを利用する。
- 現状のMySQLにインストールしているEC-CUBEの情報が、phpMyAdmin、EC-CUBE側の両方で文字化けせず閲覧可能である事が条件。phpMyAdminで見たときに文字化けが発生していると、エクスポートした情報も文字化けしている可能性が高いので、使いものにならないことがある。
- データベースが違うので、現在運用中のサーバーで並行して構築が可能だが、基本的に別サーバーにした方が気が楽。
ポイントをチェック!
- EC-CUBE1系はEUC-JPだが、EC-CUBE2はUTF-8である。したがって、エクスポートしたデータはUTF-8の状態でEC-CUBE2系にインポートする。
- 商品の画像ファイルは、別途FTPでダウンロードする。とりあえず/html/upload/save_image丸ごとダウンロードすればよい。mobile_imageもあった方が良いかもしれないが、携帯でアクセスすれば自動生成される画像になるので、必須ではない。1年以上運営していると、5000~1万以上の画像ファイルになっていることがしばしばなので、画像のダウンロードだけは他のどの作業よりも先にやっておくのが吉。
- データをエクスポートしてインポートするということは、エクスポート後に会員登録や商品登録、購入などが行われると、データにずれが生じてくる。大規模で売上が好調なサイトの場合は、サイトを一時的にストップさせる必要も出てくる。ここが一番のネックになるかも。
今回はデータベースが変更になるので、移行系でいちばん大変な作業になるかもしれません(同じデータベースであればダンプ→リストアなんかでごっそりできるのですが・・・)。
さぁ、次のページから早速移行作業していきましょう!
1. 画像ファイルのダウンロード
/html/upload/save_image/を丸ごとFTPでダウンロードする。場合によっては1万ファイル以上、200~300MB以上に達する場合もあるので、最初に行う。あとは完了するまで放置して次の作業に進む。
2. phpMyAdminで(MySQL)でエクスポート作業
簡単なものですが、簡単な移行シートをご用意しました。
ご自由にご利用ください。
- phpMyAdminにログインし、目的のデータベースに接続する。
- 目的のテーブルにアクセスし、エクスポートをクリック。
- エクスポートで「MS Excel用のCSV」にチェックをいれ、
NULLの代替文字列「\N」 (NULLにする場合もあるみたい)
「1行目にフィールド名を追加する」にチェック
Excelのエディション「Windows」
に設定して「ファイルに保存する」にチェックをいれ「実行する」ボタンをクリックする。
するとダウンロードが始まるので、保存する。 - dtb_product_categoriesは1系にはテーブルがないので、
以下のSQLを発行して、結果をエクスポートしてダウンロードする。
SELECT product_id, category_id, rank FROM dtb_products - エクスポートしたテーブルの「次へ Autoindex」の値をメモしておく。中にはdtb_baseinfo等、無いテーブルもある。
このAutoindex値は、後でPostgreSQLの「シーケンス値」として反映させる。
- エクスポートしたファイルをテキストエディタで開き、文字コードがUTF-8以外だったら、UTF-8で保存しなおす。この際、文字化けが発生しないように注意。
1行目にフィールド(カラム)名が挿入されているが、フィールド名とフィールド名の間を区切るカンマ(,)に半角スペースが入っているとphpPgAdminでインポートエラーになることがあるので、「フィールド名, フィールド名…」となっていたら「フィールド名,フィールド名…」という風に半角スペースを消しておく
3. phpPgAdminで(PostgreSQL)でインポート作業
- phpPgAdminにログインし、目的のデータベースに接続する。
- 目的のテーブルにアクセスし、中身を空っぽにする。
- 目的のテーブルにデータをインポートする。
その際、フォーマットはCSV、NULL文字は「\N」にする。 - 「インポートが完了しました」というようなメッセージが表示されれば完了。
この作業をテーブルの数だけ繰り返す。
エラーが発生したらエラーの内容をよく見て修正し、再度アップロードする。 - 最後に、メニュー上部にある「シーケンス」をクリックしてシーケンス設定画面へ移動する。ここで「次へ Autoindex」の値をシーケンス値に反映させる。
4. 画像ファイルのアップロード
1.でダウンロードした画像を、次は新しいサーバーへアップロードする。save_imageの中にアップロードするが、その際パーミッションの関係でFTP経由ではアップできない可能性があるので、ディレクトリパーミッションを一時的に緩くし、FTP経由でアップロードする。アップロードが終わったらSSH等で画像の所有者をWEBサーバー(apache等)にしておくとよい。
補足事項
- dtb_mailtemplateはコピー&ペーストで移行した方がよいかもしれません(1.3系や1.4系で仕様が異なるため、2系でも微妙に異なる可能性がある)。
- dtb_category_count、dtb_category_total_count は、カテゴリにどれだけ商品が登録されているかの集計をしているが、今回の移行では移行対象としていない。このままでは商品一覧などが表示されないことがあるので、すべてのデータ移行後に、管理画面の商品管理から、任意の1商品を再登録(変更しなくてもよい)し直すだけで、再生成される。
- ※カード決済モジュールを入れている場合は、dtb_paymentは移行せずに、手動調整した方が良い場合があります(モジュールを追加して設定すると、勝手に支払方法が増えるため)
- 今回の移行では必要最低限と思われるテーブルだけを移行対象としたため、いくつかのテーブルは除外されています。
書いていることは多いですが、やっていることは
「エクスポート」→「インポート」→「シーケンス値設定」だけです。1系でデータベースをゴリゴリカスタマイズしている場合は、もちろん2系側のPostgreSQLにカラムを追加したりしておかねばなりませんのでご注意ください。