All in One WP Migrationで移行したのになぜか挙動がおかしい
All in One WP Migrationは非常に便利で使い勝手の良いプラグインです。
localで作成したのをそのまま簡単にサーバー上に移せるので重宝していいます。
そこで今まで問題なかったのに新たな問題が出てきました。
「ちゃんとコピーされているはずなのにサイトの挙動がおかしい。。。」
原因の特定の解決までできましたが、時間がかかったので同じような人の役に立てばと思います。
状態
コピーしたHTMLの部分はちゃんと表示されているのに、機能面の一部分がなぜか動いてくれていない状態でした。
キャッシュかなと思うもどうやら違う様子。
原因
データベースのテーブルが一つ反映されていないことが判明しました。
WordPressに二つオリジナルのテーブルを作成していたのですが、そのうちの一つが反映されていませんでした。
手動でインポート用のSQLを発行し、読み込ませるとエラーが発生し、テーブルが作成されませんでした。
どうやらここが原因のようです。
発行したSQLエラー原因は二つありました。
- 「utf8mb4_unicode_520_ci」が使用できないというエラー
- 「invalid default value」エラー
「utf8mb4_unicode_520_ci」が使用できないというエラー
これは移行元と移行先のデータベースのバージョンの違いにより起こるもののようです。
バージョンの高いほうの照合順序がバージョンの低い方で使えないということですね。
それぞれのデータベースは以下のようになっていました。
- 移行元・・・MySQL 8.0
- 移行先・・・MariaDB 5.5
参考サイトによると結構バージョン飛んでしまっているみたいです。
「invalid default value」エラー
こちらは直訳で「デフォルトの値が無効です」というエラーです。
エラーが出ていたカラムは日付のカラムでした。
CREATE時のSQLは以下です。
date datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
INSERT時、UPDATE時に自動で現在時刻を設定してくれる非常に便利なデフォルト値です。
ですが、このデフォルト値が移行先のデータベースでは「DATETIME」型のカラムでは無効の様子。
解決
「utf8mb4_unicode_520_ci」が使用できないというエラー
こちらは簡単です。
文字コードを変えてあげるだけです。
「utf8mb4_general_ci」に変更したら、該当箇所でエラーが発生することはなくなりました。
「invalid default value」エラー
こちらもエラーの回避自体は簡単です。
デフォルト値でエラーが出るのだから、デフォルト値をなくしてしまえばOK。
ただし、今回の場合、時間が自動で挿入できなくなってしまったので、コード側を変更するかトリガーを作成するかしないといけません。
出来上がっているところいじるのは嫌だったので、今回はトリガーを作成することにしました。
作成したのは以下のような感じです。
DELIMITER $$CREATE TRIGGER `auto_date_insert` BEFORE INSERT ON table_nameFOR EACH ROW BEGINSET NEW.date = CURRENT_TIMESTAMP;END$$DELIMITER ;
今回UPDATE時が不要だったのでINSERTのみ作成しました。
INSERT時の「date」カラムに「CURRENT_TIMESTAMP」をあてる非常に簡単なトリガーです。
同じようにdateでエラーが出た場合にはこのようなトリガーを作成して対応してみてください。
まとめ
問題が出ると想定していないところでエラーが出ると非常に焦りますね。
データベースなどあまり触らない方でこんなエラーが出てらきっと困惑することでしょう。
そんな方の参考になればと思います。
ベテランの方は原因から解決まで5分もかからなさそう。。。