EC-CUBE2系でXSERVERへサーバ移転する際にはまったこと

はまりました。。EC-CUBE2系のサーバ移転を検索すると結構出てきますが、そう簡単にはいきません。FTPとDBリストアで終わるわけがないんです!

移行手順

  1. FTPでデータ移動
  2. DBダンプしてリストア
  3. config.phpを新サーバに書き換え
  4. PHPバージョン確認、調整
  5. /install/にアクセスし設定
  6. DBのsql mode 指定

1,2、3は検索して出てくるサイトのどこ見ても大体大丈夫です。旧サイトから新サイトへ移す感じ。ここまで終われば管理画面にアクセスできる、はずができない!

まず発生したエラー

以下貼ってあるエラーはサーバに出力されたエラーログ。

2019/11/09 00:25:23 [/index.php] Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。
SQL: [SET SESSION storage_engine = InnoDB]
MDB2 Error: connect failed
_doConnect: [Error message: Access denied for user ‘DBゆーざ’@’ホスト’ (using password: YES)]
[Native code: 1045]
[Native message: Access denied for user ‘DBユーザ’@’ホスト’ (using password: YES)]

うーん、と悩みながら/install/を実行してみる。config.phpを編集するのと一緒なんだけど、各ファイルが馴染む気がして。。変更したのはホスト。localhostまたは127.0.0.1を外部からFQDN指定に変えた。※多分これはそのままでもよかった。

そしてxserverの管理画面からPHPのバージョンを5.6に変えたらエラーの内容が変わった。直ってはいない。

次に発生したエラー

2019/11/09 00:33:23 [/index.php] Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。
SQL: [SQL文] MDB2 Error: unknown error _doQuery: [Error message: Could not execute statement] [Last executed query: PREPARE mdb2_statement_mysql_***** FROM SQL文]
[Native code: 1055]
[Native message: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘該当列’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by]

この辺から胃痛が。。
掲載してませんがSQL文をみると内部結合してるのに、特定できない列指定してるんですよね。このSQL文を使ってるプログラムを調査して改修の影響範囲調査してなんてやってる時間はないので、どうにか対応できないか調べる。

なんとなくこの辺があやしい「 sql_mode=only_full_group_by

正解、sql mode を変更する必要あり

対象:\data\class\db\dbfactory\SC_DB_DBFactory_MYSQL.php
360行目あたり

public function initObjQuery(SC_Query &$objQuery)
{
$val = $objQuery->getOne(‘select version()’);
if (strcmp($val,’5.7.5′)) {
$objQuery->exec(‘SET SESSION default_storage_engine = InnoDB’);
} else {
$objQuery->exec(‘SET SESSION storage_enging = InnoDB’);
}

$objQuery->exec("SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'");

疲れ果ててコードの貼り付けも雑になってますがご勘弁を。。
sqlバージョンによって分岐する処理もいれといたが、それよりも黄色塗りのsqlmodeが超重要。これを設定することでゆるい内部結合のSQL書いていても動くようになります。

重要なのはPHP、DBのバージョンが以前のサーバと同じになっているか、ついでにsqlmodeも。

とりあえずここまでで動いたので峠は越えた感じ。何かあれば追記していきます。

参考にしたサイト
https://osyu-web.com/eccube2/publishing-eccube-on-xserver/
http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0018
https://blog.ko31.com/201410/how-to-move-eccube/