先日、すでに本番環境で公開しているWordPressのサイトをローカル環境のWordPress(Local by Flywheel)へ移行しました。
そのうちのデータが大きいWordPressサイトの移行時に、データベースをインポートしようとすると途中でエラーが出てしまい、SQLファイルのインポートができない事態に陥りました。
色々試して、別な方法でファイルを無事にアップロードする事ができたので、備忘録として。
Local by Flywheel「ADMINER」でデータベースのインポートに失敗する現象
Local by Flywheel(ローカル環境)に、他からエクスポートしたデータベースをインポートするには「参照」から「〇〇〇.sql」を選択し「Excute」をクリックするだけです。
データが大きいと少し時間がかかりますが、以下のような画面になったら完了です。
ところが、あるデータベースをアップロードしようとすると、以下のようなエラーが出てインポートに失敗してしまうのです。
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 99119016 bytes) in /etc/scripts/local-adminer.php on line 92
原因はPHPがサーバーのメモリー使用上限を超えてしまった事らしいですが、そのインポートしたいSQLファイルは94MBです。
でもAdminerのファイルアップロード画面を見ると、1000MB以下のファイルであればアップ出来るように表示されています。
アップしたいファイルは約95MBなので、1000MBの10/1程度です。
それなのにメモリーが足りない?何故?
そこで色々調べると何通りかの解決策があり、そのうち2通つの方法でうまくいきました。
・解決策1:「php.ini」を編集してメモリ量を増やす
・解決策2:「File upload」では無く「From server」からアップ
次でそれぞれのやり方を紹介します。
「ADMINER」でFatal error: Allowed memory size of~が出てインポートに失敗する時の対処法
解決策1:「php.ini」を編集してメモリ量を増やす
Fatal error: Allowed memory size of~というエラーは、PHPスクリプトが、スクリプトの処理実行時にサーバーに割り当てられているメモリ量を超過させてしまった時に発生するようです。
そこで、まずはサーバーに割り当てられるメモリ量を増やすため、「php.ini」の中で設定されている項目「memory_limit」を編集します。
C:\Users\ユーザー名\Local Sites\ローカルサイト名\conf\php\7.2.0
php.iniを開き、以下の項目を探します。
するとデフォルトでは以下の数字になっていました。
post_max_size = 1000M
upload_max_filesize = 1000M
このファイルサイズを大きい数値に設定すると、Adminerでアップロードできるファイルサイズが大きくなるはずです。
Adminerで表示されている1000MBは、そのうちの「upload_max_filesize」の数値だと思われます。
また、この3つのサイズは、
memory_limit ≧ post_max_size ≧ upload_max_filesize
にする必要があります。
そこで、memory_limitのサイズを以下のように変更し保存しました。
phpを保存する時のコードは「UTF-8N」(ボム無し)、改行コードは「LF」にします。
再度インポートしてみると、今度はエラーが表示される事なく、無事にアップロードできました!
解決策2:「File upload」では無く「From server」からアップ
通常、Adminerでデータベースをインポートする時は「File upload」で「参照」をクリックし、SQLファイルを選択してインポートします。
しかし今回のようにメモリーが足りないとエラーが出た場合、SQLファイルを圧縮したデータ(.gz)を「From server」からアップロードする事も出来ます。
まず、サーバーからエクスポートする時に、圧縮データ(.gz)でエクスポートします。
phpAdminにログインし、エクスポートしたいデータベースを選択し、エクスポートをクリック。
「詳細」オプションを選択すると、詳細なオプションが表示されます。
圧縮データ(.gz)でエクスポートするには、出力:の「圧縮」ボックスで「gzip形式」を選択します。
「生成オプション」で、DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER コマンドを追加する」オプションを選択。
他はデフォルトのままでOKです。
「実行」をクリックするとダウンロードするファイル名が表示されるのでファイルを保存します。
するとこのような「データベース名.sql.gz」というファイルが保存されました。
下が圧縮しないSQLファイルで94.6MBですが.gzに圧縮すると14.8MBになりました。
この「データベース名.sql.gz」を、「adminer.sql.gz」とリネームして「public」フォルダに移動します。
C:\Users\ユーザー名\Local Sites\ローカルサイト名\app\public
Local by Flywheelを立ち上げて「DATABASE」→「ADMINER」をクリック。
インポートがうまく行かなかったデータベースを選択し、importをクリック。
「From server」の「Run file」をクリックすると、読み込みが始まります。
すると今度はエラーが表示される事なく、無事にアップロードできました!
まとめ
「ADMINER」でFatal error: Allowed memory size of~が出てインポートに失敗する時の対処法はいくつかありますが、この二通りの方法が簡単でした。
・解決策1:「php.ini」を編集してメモリ量を増やす
・解決策2:「File upload」では無く「From server」からアップ
個人的には、phpを編集するより、圧縮ファイルをアップデートする解決策2の方がより簡単で安全だと思いました。