phpMyAdminで「Incorrect format parameter」エラーや「スクリプトがタイムアウトしました」、「Fatal error: Maximum execution time of 30 seconds XXX」エラーが発生した際の対処方法について覚書。
ファイルサイズが大きいSQLスクリプトを実行した際に上記3つのエラーが発生しがちとなりますが、その原因と対処方法について説明します。
「Incorrect format parameter」エラーの原因
このエラーは、phpMyAdminのインポート機能を使用して実行するSQLファイルをアップロードして実行した際に発生します。
エラーが発生する原因は、アップロードするSQLスクリプトファイルがアップロードファイルサイズの上限サイズを超えているためです。
「Incorrect format parameter」エラー発生時の対処方法
PHPの設定ファイル「php.ini」ファイル内の設定値を変更することでアップロードファイルの上限サイズを変更することができます。
「php.ini」はphpのインストールフォルダ直下にあります。
※XAMPPの場合を例とすると「C:\xampp\php」フォルダ
設定値については、アップロードするSQLスクリプトファイルのサイズよりも大きい値を指定してください。
私の場合は、インポートするSQLスクリプトファイルが11MB(zip圧縮時)だったので余裕をもって32MBに設定しています。
設定名 | 設定値 | 初期値 |
post_max_size | 32MB | 8MB |
upload_max_filesize | 32MB | 2MB |
memory_limit | ※1 | 128MB |
※1:post_max_sizeとupload_max_filesizeよりも小さい値だった場合は、2つのサイズに合わせて設定が必要
post_max_sizeとupload_max_filesizeについて
「post_max_size」は、1回にアップロードされるファイルすべてのサイズの総合計に対する上限値の設定です。
「upload_max_filesize」は、その名の通りアップロードできる1つのファイルのサイズの上限値です。
phpMyAdminのインポート機能では、アップロードできるファイルは1つだけなので、両方の設定値が違う場合、結果的にはサイズの小さい方の値が上限値となります。
memory_limitについて
インポート機能では、SQLスクリプトファイルを一度メモリに展開して処理します。
「memory_limit」は、その際に使われるメモリ上限値です。
「memory_limit」の初期値は、128MBと最初から大きい値が指定されているので、実行するSQLスクリプトファイルが128MBを超えなければ変更する必要はありません。
php.iniに変更を加えた場合は、必ずapacheを再起動してください。
再起動しないと変更した値が有効になりません。
「スクリプトがタイムアウトしました」エラーの原因
「php.ini」のアップロードサイズの上限値を変えないといけないようなファイルサイズの大きいSQLスクリプトを実行する場合、たぶんアップロードができてもこのエラーが起きてスクリプトの実行が止まってしまうと思います。
エラーの原因は、SQLスクリプトの処理時間の上限がデフォルトだと300秒になっており、300秒以内で処理が終わらなかったためです。
上記のエラー以外にも「Fatal error: Maximum execution time of 30 seconds exceeded in XXXXX」というエラーが発生する場合もあります。
「スクリプトがタイムアウトしました」エラー発生時の対処方法
上記エラーが発生した際の対処方法としては、以下の2つの設定値を変更することで処理時間の上限値を変更することができます。
- php.iniの max_execution_time の変更
- phpMyAdminにExecTimeLimitの設定を追加する
max_execution_time の変更
「max_execution_time」は、スクリプトの最大実行時間で、この時間でスクリプトの処理が終わらない場合タイムアウトして処理が中断されます。
php.iniに記載されている「max_execution_time」の値を以下のように長めの時間(秒)を指定します。
max_execution_time = 3600
3600(秒)なのでSQLスクリプトの処理時間が1時間を超えない限り処理が停止しなくなります。
3600でもタイムエラーが発生する場合は、もっと長めに設定して再実行してください。
ExecTimeLimitの設定追加
「ExecTimeLimit」は、phpMyAdmin側で設定できるスクリプトの最大実行時間です。
今回実際にこのエラーが発生した際に、phpの「max_execution_time」だけ設定しても同様のエラーとなり、「ExecTimeLimit」の設定も行ったところ正常に実行が終了しました。
phpの「max_execution_time」の設定と合わせて、phpMyAdminの「ExecTimeLimit」設定も必要となるようです。
「ExecTimeLimit」の設定は、phpMyAdminがインストールされているフォルダ直下にある「config.inc.php」ファイルに記載する必要があります。
※XAMPPの場合を例とすると「C:\xampp\phpMyAdmin」フォルダ
「config.inc.php」ファイル内にすでに記載がある場合は、数値のみを変更し、記載がない場合は、以下の設定を追加します。
追記箇所は、最終行の"?>"の手前であればどこでも良く、以下の一行を追記してください。
$cfg['ExecTimeLimit'] = 3600;
<config.inc.php追記例>
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
/*スクリプトタイムアウト対応追記*/
$cfg['ExecTimeLimit'] = 3600;
/*
* End of servers configuration
*/
?>
基本「max_execution_time」と同じ設定にしておいてください。
3600(秒)を超えてもエラーとなる場合は、「max_execution_time」の値とともにこちらの値も変更してください。
php.ini、config.inc.phpの設定を変更しので、apacheの再起動を忘れずに。
「max_execution_time」と「ExecTimeLimit」の設定は、スクリプト実行が正常に終了した後に元に戻しておいたほうが良いです。
なんらかの問題で想定していないスクリプト実行がハングしたりした場合にタイムアウトまで戻ってこないので、初期値の300秒くらいでいいかと。
phpMyAdminの「部分インポート」オプションについて
補足となりますが、phpMyAdminのインポート機能のオプションで「部分インポート」がデフォルトでオンになっているかと思いますが、外しておいたほうが良いです。
タイムアウトなどでスクリプトが中断されたときにその中断された箇所から再実行してくれるというオプションですが、停止された場所(切れ目)が悪いと結局エラーとなってインポートが正常に完了しません。
まとめ
phpMyAdminのインポート機能を使用してSQLスクリプトをアップロードして実行した際に発生する3つのエラーについて原因と対処方法を記載しました。
- 「Incorrect format parameter」
- 「スクリプトがタイムアウトしました」
- 「Fatal error: Maximum execution time of 30 seconds exceeded in XXXXX」
主にphp.iniの設定値の変更、場合によってはphpMyAdminの設定値を変更することで対処が可能となります。
apacheのconfファイルの修正が必要かと思いましたが、特に必要はありませんでした。
設定値を変更した際は、必ずapacheを再起動することを忘れずに。
コメント