カスタマイズ講座

ホーム > カスタマイズ講座 > 【中級】カスタマイズ > EC-CUBE1系から2系へアップグレードしよう(データ移行によるもの)

EC-CUBE1系から2系へアップグレードしよう(データ移行によるもの)

【中級】カスタマイズ4
2008.12.18 (更新日: 2009.06.05)

この記事では、長々と書いてしまう恐れがあるため、すぐに要点だけをつかみたい方は、以下のEC-CUBEコミュニティースレッドをご覧ください。

1系から2系へのDB移行について


アップデートといえば、「差分をパッととってきて、ピッとパッチをあてて、ポッと完了したい」と思われるかと思いますが、1系と2系の内部構造、文字コードの違いにより、現在のところ実質的に難しいです。

そこでこの記事では、手間はかかるけど既に実現している1つの方法、「データの移行」による方法を説明しています。


この記事では、以下のような状況を仮定して説明させて頂きます。すべての皆さんがこの条件に100%は当てはまらないと思いますが、部分部分だけでも参考になると思います。

尚、この作業は僕がこれまで十数回以上試みて成功した例ですが、環境による違いもありますので、くれぐれも(十分にテストするなど)注意して、自己責任の上作業して下さい。


想定している状況
  1. 現在運用中のEC-CUBEはバージョン1系であり、これをEC-CUBE2系にバージョンアップする。
  2. データベースはこれまでMySQL4系を利用してきたが、バージョンアップを機会にパフォーマンスがダントツに良いと噂されるPostgreSQL8.3系を利用する
  3. データだけ移動するので、2系は新しくインストールし、その後にリストアを行う。
  4. 移行にはphpMyAdminとphpPgAdminのGUIツールを利用する。
  5. 現状のMySQLにインストールしているEC-CUBEの情報が、phpMyAdmin、EC-CUBE側の両方で文字化けせず閲覧可能である事が条件。phpMyAdminで見たときに文字化けが発生していると、エクスポートした情報も文字化けしている可能性が高いので、使いものにならないことがある。
  6. データベースが違うので、現在運用中のサーバーで並行して構築が可能だが、基本的に別サーバーにした方が気が楽。


ポイントをチェック!
  1. EC-CUBE1系はEUC-JPだが、EC-CUBE2はUTF-8である。したがって、エクスポートしたデータはUTF-8の状態でEC-CUBE2系にインポートする
  2. 商品の画像ファイルは、別途FTPでダウンロードする。とりあえず/html/upload/save_image丸ごとダウンロードすればよい。mobile_imageもあった方が良いかもしれないが、携帯でアクセスすれば自動生成される画像になるので、必須ではない。1年以上運営していると、5000~1万以上の画像ファイルになっていることがしばしばなので、画像のダウンロードだけは他のどの作業よりも先にやっておくのが吉
  3. データをエクスポートしてインポートするということは、エクスポート後に会員登録や商品登録、購入などが行われると、データにずれが生じてくる。大規模で売上が好調なサイトの場合は、サイトを一時的にストップさせる必要も出てくる。ここが一番のネックになるかも。


今回はデータベースが変更になるので、移行系でいちばん大変な作業になるかもしれません(同じデータベースであればダンプ→リストアなんかでごっそりできるのですが・・・)。

さぁ、次のページから早速移行作業していきましょう!

1. 画像ファイルのダウンロード
/html/upload/save_image/を丸ごとFTPでダウンロードする。場合によっては1万ファイル以上、200~300MB以上に達する場合もあるので、最初に行う。あとは完了するまで放置して次の作業に進む。


2. phpMyAdminで(MySQL)でエクスポート作業

簡単なものですが、簡単な移行シートをご用意しました。
ご自由にご利用ください。


  1. phpMyAdminにログインし、目的のデータベースに接続する。
  2. 目的のテーブルにアクセスし、エクスポートをクリック。
  3. エクスポートで「MS Excel用のCSV」にチェックをいれ、
    NULLの代替文字列「\N」 (NULLにする場合もあるみたい)
    1行目にフィールド名を追加する」にチェック
    Excelのエディション「Windows
    に設定して「ファイルに保存する」にチェックをいれ「実行する」ボタンをクリックする。
    するとダウンロードが始まるので、保存する。
  4. dtb_product_categoriesは1系にはテーブルがないので、
    以下のSQLを発行して、結果をエクスポートしてダウンロードする。
     
    SELECT product_id, category_id, rank FROM dtb_products
  5. エクスポートしたテーブルの「次へ Autoindex」の値をメモしておく。中にはdtb_baseinfo等、無いテーブルもある。
    このAutoindex値は、後でPostgreSQLの「シーケンス値」として反映させる。
  6. エクスポートしたファイルをテキストエディタで開き、文字コードがUTF-8以外だったら、UTF-8で保存しなおす。この際、文字化けが発生しないように注意。
    1行目にフィールド(カラム)名が挿入されているが、フィールド名とフィールド名の間を区切るカンマ(,)に半角スペースが入っているとphpPgAdminでインポートエラーになることがあるので、「フィールド名, フィールド名…」となっていたら「フィールド名,フィールド名…」という風に半角スペースを消しておく




3. phpPgAdminで(PostgreSQL)でインポート作業
  1. phpPgAdminにログインし、目的のデータベースに接続する。
  2. 目的のテーブルにアクセスし、中身を空っぽにする。
  3. 目的のテーブルにデータをインポートする。
    その際、フォーマットはCSV、NULL文字は「\N」にする。
  4. 「インポートが完了しました」というようなメッセージが表示されれば完了。
    この作業をテーブルの数だけ繰り返す。
    エラーが発生したらエラーの内容をよく見て修正し、再度アップロードする。
  5. 最後に、メニュー上部にある「シーケンス」をクリックしてシーケンス設定画面へ移動する。ここで「次へ 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にカラムを追加したりしておかねばなりませんのでご注意ください。

このページを見ている人は、以下のページも参照しているようです・・・!

>> EC-CUBEの学校のページ参照は、レコメンドエンジン「楽レコ」でレコメンデーションしています!

レビュー

レビューによるご意見・ご質問は会員登録された方のみとなっております。
  • ★★★★★ MySQLからPostgreSQLへ 2009/01/22
    レビュアー:Yumi

    解り易い記事をありがとうございます。
    応用編といいますか、、、
    MySQLの余りの重さに辟易して、
    DBサーバを外に準備しまして、DBは無事に引っ越せました。
    そして更にMySQLからPostgreSQLへ移行しようと考えているのですが、
    (EC-CUBE本体は2系のそのままで)
    この記事にあるチェックシートにあるテーブルだけを
    インポート>エクスポート>シーケンス設定してゆけばよいと解釈したのですが、それでいいのですよね?!

  • 2系の場合も基本的に同じかと思います 2009/01/24
    レビュアー:homan

    2系のMySQLからPostgreSQLに移行したことがないため断言はできませんが、基本的に同じかと思います。

    但し、2系からはいくつかデータベーステーブルが増えておりますので、2系→2系にする場合は、チェックシートにあるもの以外も全て移動された方が安全だとおもいます(事前にテストできるような環境があれば、そちらでテストされてからの方が良いでしょう。)

    次へのAuto index値をメモされて、シーケンス値を変更する部分は1系→2系の場合も2系→2系の場合も同じです。

  • ★★★★★ 全部ですか(汗) 2009/01/26
    レビュアー:Yumi

    ありがとうございます。
    データが入っているテーブル全てという事ですね(汗)そりゃそうですよね。。。
    が、ガンバリマス。
    無事成功しましたらご報告いたします。

  • いくつかは移行しなくてもOKなテーブルもあります。 2009/01/27
    レビュアー:homan

    例えば売上集計に使われる「dtb_bat」で始まるテーブル(4つ)やカテゴリ内の商品数をカウントする「dtb_category_count」と「dtb_category_total_count」。郵便番号データベースである「mtb_zip」などです。

    これらは管理画面からもう一度集計をとることができますし、郵便番号も初回と同じように実行するだけです。

    カテゴリ内の商品登録数の集計は、とにかく商品登録完了画面までいけば再集計されます。新しい商品を登録するか、(変更しなくてもいいので)任意の商品を編集→確認→登録までいけば集計されます。

    とはいえ結構地味で大変な作業なので、あまり無理をされないように作業されてくださいね。

  • 経過報告遅くなりました(汗 2009/02/18
    レビュアー:Yumi

    お世話になっております。
    いろいろアドバイスありがとうございました。
    PostgreSQL攻略大作戦はとても地味でしたが何とかなりました~

    後半部分で(二つのDBを比較して)値がどう見ても同じジャマイカというものは無精しました。
    ちなみに郵便番号テーブルはもう一度登録すると無駄に時間がかかるのでわざとインポートしちゃいました。

    これでお客様から依頼されても有料で請けられます(笑)
    お世話になりました!そしてこれからも宜しくお願いします♪

この記事に対するトラックバック

この記事のトラックバック先URL

ECの「勝ち組」だけが知っている 売り上げUPの秘密はこちら