サイズの大きなSQLファイルをインポートする

phpmyadminで2GB近くの.sqlファイルをインポートする必要があったのでメモ

BigDump.phpを使用する事で解決。

BigDump: Staggered MySQL Dump Importer

開発環境

開発環境はwindows10でxammpを使用して10.4.28-MariaDBを使用

外部キー制約でエラーが発生する

Error at the line 29: ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

と表示されてインポートが進まない。
更によくよくエラーを見てみると

MySQL: Can't create table hoge (errno: 150 "Foreign key constraint is incorrectly formed")

と表示されている。

どうやらテーブルの外部キー制約に問題あるとの事、ただこの場合
開発環境から直接データべースをエクスポートしているので恐らく整合性は取れている?と思い
BigDump.phpの設定を変更する事に。

解決方法

bigdump.phpを開き

$pre_query[]='SET foreign_key_checks = 0';

の箇所がコメントアウトされているのでコメントアウトを削除する。
これにより外部キー制約のチェックがスキップされる。

設定を変更した所、次は別のエラーが発生。

処理できるクエリの最大数を超えてエラーが発生する

再度インポートを実行すると

At this place the current query includes more than 300 dump lines. That can happen if your dump file was created by some tool which doesn't place a semicolon followed by a linebreak at the end of each query, or if your dump contains extended inserts or very long procedure definitions. Please read the BigDump usage notes for more infos. Ask for our support services in order to handle dump files containing extended inserts.

と表示され、一度に処理できるクエリの最大数を超えており、ダンプファイルの中の一つのクエリが非常に長い、または複数のクエリがセミコロンで終わっていないらしい。

解決方法

$linespersession    = 10000;
$max_query_lines = 10000;

上の2つの値をそれぞれ10000に設定して再度インポートすると無事インポートされました。

ただ上記2つの値は大き過ぎるので、恐らくもっとスマートな解決方法があるとは思いますが。。。

時間に追われてたのでとりあえずローカルだし良いやと思い設定しましたが、とりあえず走りました。

まとめ

巨大なsqlファイルをインポートするのであればbigdumpが使いやすかったです。

後はphp.iniの値を触るとかでも対応出来るかも。

ただRequestが止まる可能性が高いので、bigdumpが安定してインポート出来ました。

mysql,開発メモ

Posted by admin