EC-CUBEの会員データを移行する

コンテンツ自体は2.3.4から最新の2.13.5にアップデートしたわけだが,問題は顧客データの移行だ。少ないといえども10年間運営していると数千人のお客様が登録されている。暗号化されているパスワード,購買履歴,購買ポイントなども間違い無く新システムに引き継がなければならない。

これが一筋縄ではいかないのだ。他のネットショップアプリやCMSは知らないけれど,EC-CUBEには一発で顧客データを移行する方法が無い。2.3から2.11,2.11から2.12へはデータ移行モジュールが無償公開されているのだが,2.12から2.13への移行ツールは無い。数万円の有料プラグインはあるけれど,システム屋としては自力でやってみよう。

1st Step 2.3.4から2.11.5へ

とりあえず2.3.4から2.11へ移行する。

公開されている移行ツールは2.4から2.11へとなっているが,なぜか2.3でも動く。

EC-CUBE.netから「2.4データエクスポートモジュール 2.4→2.11」をダウンロードする。現在動いているEC-CUBE2.3.4にこのモジュールをインストールし,データをエクスポートする。

shift_data20180103xxxxxx.tar.gz(xxxxxには時刻が入る)をPCにダウンロードする。

サーバーにEC-CUBE2.11をインストールする。ダウンロードページからeccube-2.11.5.tar.gzをダウンロードする。

PostgreSQLにec211というデータベースを作り,EC-CUBE2.11.4をインストールする。ネットショップとして公開しないので画面,商品はそのまま。

データインポートモジュール2.11系をインストールし,shift_data20180103xxxxxx.tar.gzを取り込む。なぜか全件取り込めず。2016年以降登録された顧客データが取り込まれていないのだ。shift_data20180103xxxxxx.tar.gzの中身を展開するとCSV形式でdtb_customerも入っており,全件あるのだが。

そこで現在公開中の2.11.5ではなく,一つ前の2.11.4を入れる。公式ダウンロードページからはリンクされていないが,ファイル名を直接指定すればいい。

http://downloads.ec-cube.net/src/eccube-2.11.4.tar.gz

これをサーバにインストールし,データインポートモジュール2.11系で旧データをインポートする。エラーが出たけど今度は全件取り込むことができた。

2.11.4に2.11データエクスポートツールをインストールし,同様に移行データを作ってダウンロードする。

2nd Step 2.11.4から2.12.6へ

EC-CUBE2.12.6をサーバにインストールし,データ移行プラグイン(インポート)0.12をインストール。
ところが,このプラグインを管理画面で有効にしようとするとエラーになる。

調べたところ,プラグイン開発時点ではPHP5.3が使われていたのが,現在はPHP5.4になっているためと判明。いくつか文法が違ってきているようだ。

eccube-2.12.6/data/downloads/plugin/Datimport/LC_Page_Plugin_Data_Import_Config.php

を開き,88行目,150行目,168行目にある&$の「&」を削除する。

if (!is_dir($this->save_dir)) {
// $objUpFile = $this->lfInitUploadFile(&$objUpFile);
$objUpFile = $this->lfInitUploadFile($objUpFile);

再度管理画面でデータインポートモジュールを有効にすると,今度はちゃんと動く。2.11のエクスポートデータを読み込み,全件インポートできていることを確認する。

3rd Step 2.12.6から2.13.5へ

さて,この先が問題だ。2.3から2.12まではデータ移行ツールがあるけれど,2.12から2.13への移行ツールは存在していない。少なくとも無償で公開されているものはない。データベースからダンプし,手作業で整形してインポートするしかない。

2.12.6と2.13.5ではdtb_customerのテーブル構造に次のような違いがあり,そのままでは読み込めないのだ。

2.12.6
kana01,kana02,zip01,zip02,pref

2.13.5
kana01,kana02.company_name,zip01,zip02,zipcode,country_id,pref

つまり,company_name,zipcode,country_idというカラムが追加されている。海外向け対応だろうか。

2.12.6からのデータエクスポートツールは無いので,PostgreSQLを直接操作する。

pg_dump –table=dtb_customer ec212 > /tmp/ec212_customer.dump

このデータをPCにダウンロードし,エディタで開く。顧客データはタブ区切りになっているのに,定義行はカンマ区切りなので,カンマをタブに変換し,前後の余計な行を削除し,文字コードをShift-JISにして保存する。

Excelでこのデータを開き,company_name,zipcode,country_idの各列を挿入。NULLを表す「\N」で埋める。タブ区切りで保存し,文字コードをUTF-8に変換する。

phpPgAdminでEC-CUBE2.13.5のdtb_customerにこのデータをインポートする。全件取り込まれていることを確認する。

さらに購入履歴なども移さないといけない。必要なのは

dtb_order
dtb_order_detail
dtb_order_temp
dtb_other_deliv
dtb_mail_history

の5本。このうちdtb_order_tempにはorder_company_name,order_zipcode,order_country_idが,dtb_other_delivにはcompany_name,zipcode,country_idが追加されているので,dtb_customerと同様にExcelでカラムを足す。

このままでは登録している会員が自分の設定したパスワードでログインできない。顧客データファイルに保存されているパスワードはハッシュ関数で暗号化されているのだ。この鍵となるのがdata/config/config.phpのAUTH_MAGICの値。2.3.4のconfig.phpをエディタで開き,AUTH_MAGICの値を2.13.5にコピーする。
自分がログインでき,購買履歴もちゃんと表示されていることを確認し,顧客データ移行作戦は終了・・・

ところが,こうすると管理画面にログインできなくなってしまう。

解決方法は”EC-CUBE2.13.5を再インストールすること”しかない。心配だが,手順さえ間違えなければ顧客データもコンテンツもそのままで,管理画面にログインできるようになる。肝心なのは再インストール時にデータベースの初期化を絶対にやってはいけないということだ。これをやると,苦労して移行した顧客データが消えてしまう。

というわけで3日掛けてPowerNaviオンラインショップのバージョンアップが無事完了した。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください