#phpMyAdminでインポートするとき、phpのMemoryAllocateの制限に引っかかる
サイズの大きなmysqlのdumpファイルを、レンタルサーバーデフォルトのphpMyAdminでインポートしようとすると、phpのMemoryAllocateに引っかかったりしますよね。
シェルが触れるサーバーならコマンドラインからやればいいのですが、
そうじゃないと、テーブルごとに分割してインポートとかやってみますが。。。。どのテーブルまでインポートできたのかわからなくなってしまいます(私が実際に遭遇しました。。。。確実性が全くない)。もうお手上げです。
#BigDumpを利用する
そこで、大きなdumpデータを複数行に分割して自動的にインポートできる、PHPのプログラム
BigDump
http://www.ozerov.de/bigdump/
を利用します。
#手順
##mysqldumpデータの準備
BigDumpでは行ごとに自動分割してインポートし、1回のインポート時に必要なメモリ容量を抑えることで、メモリの利用制限がかかっている環境でも大きなファイルのインポートが可能になります。
ですので、dumpデータを取得する際には、1行のInsert文で複数レコードをinsertするいわゆる拡張insert文を利用しないようにします。
Data creation optionsで画像のように
- すべての INSERT 文にカラム名を含める
- 上のどちらでもない
のどちらかを選んでください。(すべての INSERT 文を複数行挿入で行うを選ばない)
あとは必要に応じてオプションをいれてdumpファイルをエクスポートして下さい。
###コマンドラインの場合
--skip-extended-insert
オプションを利用して、1行で1レコードのinsertするダンプファイルを作成します。
mysqldump --skip-extended-insert > dump.sql
##BigDumpのインストール
インストールといっても、webサーバーでアクセスできるところに、設定を書き込んだファイルを配置するだけです。
###ダウンロード
http://www.ozerov.de/bigdump/
からダウンロード
###設定を変更
41行名から始まるDBの設定を適切に変更します。
// Database configuration
$db_server = 'localhost'; //適切なホスト名を
$db_name = 'db_1'; //DB名を
$db_username = 'dbuser'; //ユーザー名
$db_password = 'password'; //パスワード
また、56行目あたりの、OPTIONAL SETTINGで1度にインポートを実行する行数,インポートの間隔を設定します。
メモリの利用制限にかからないように適切に設定してください。
// OPTIONAL SETTINGS
$filename = ''; // Specify the dump filename to suppress the file selection dialog
$ajax = true; // AJAX mode: import will be done without refreshing the website
$linespersession = 3000; // Lines to be executed per one import session
$delaypersession = 0; // You can specify a sleep time in milliseconds after each session
// Works only if JavaScript is activated. Use to reduce server overrun
###webサーバーからアクセスできる場所へ配置
あとでdumpファイルも同一ディレクトリへアップロードするので、適当なディレクトリを作成して配置します。
例えば、
DocumentRoot/dump/
へ
bigdump.php
をアップロードします。
##mysqldumpファイルの配置
先ほどとったmysqldumpファイルを配置します。
前述のbigdump.phpと同じ場所
DocumentRoot/dump/
へ配置することにします。
##BigDumpの実行
###BigDumpへアクセス
配置したBigDumpへアクセスします。
###対象のdumpファイルを選択し、実行
BigDumpへアクセスすると同ディレクトリにあるdumpファイルが選択肢に表示されます。
対象のdumpファイルを選択し、「start import」をクリックします。
##終了
後はBigDumpが自動でインポートしてくれます。インポート状況も表示されるので、インポートが100%になったら終了です。
###後処理
ちゃんとインポートされていることが確認できたら、bigdump.phpとdumpファイルを削除してください。
#参考サイト
大きいサイズのSQLをインポートしてくれる「BigDump」 | 日々の覚書…日常のことも少しだけ
http://www.tailtension.com/usefultool/1498/
mysqldumpで一行ずつのINSERT文を吐き出したい - 屑プログラマの憂鬱
http://artisan.hatenablog.com/entry/20110922/1316670746