Help us understand the problem. What is going on with this article?

サイズの大きなmysqlのdumpファイルをレンタルサーバへインポートする。

More than 5 years have passed since last update.

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文を利用しないようにします。

phpMyAdminの場合

mysqldump.jpg

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へアクセスします。

http://example.jp/dump/bigdump.php

対象の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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした