2012-03-09 23 views
0

これは状況です。私はphpMyAdminに入ってデータベースをバックアップした後、データベースを選択せず​​にエクスポートをクリックします。私は新鮮なMySQLのインストールにエクスポートしたSQLファイルをインポートしようとすると、(それはかなり長いですとして使用するペーストビン)今、私はphpMyAdminからエクスポートされたsqlファイルをインポートできません

http://pastebin.com/vDHdG2T6のようなエラーを取得しています私はそれがINFORMATION_SCHEMAテーブルをスキップするだろうと私は代わりに、mysqldumpを使用している必要があります知っています。 これを解決する方法や、100万行のファイルを編集することなくそのファイルをインポートする方法はありますか?

私も似たファイルをインポートしようとしました: のmysql -uルート-p -f -h localhostの<ドキュメント/ localhost.sql をこれは、データベースをインポートしましたが、それらの多くは、テーブルとそのように行方不明、破損しました...私は-fを使ってエラーに関係なく続けるようにしました。

ありがとうございます!

EDIT:

は、私はあなたが正しい軌道に乗っていたと確信している、あなたの提案のためのみんなに感謝します。しかし、その間に私はバックアップファイルを混乱させたので、私は必要な行を抽出するために少しPHPコードを書く必要がありました。

$data = file_get_contents('import.sql'); 


if (! isset($_GET['db'])) { 
    //list databases 
    echo '<ul>'; 
    preg_match_all("/Database: `(.*?)`/", $data, $dbs); 

    foreach ($dbs[1] as $database){ 
     echo "<li><a href=\"index.php?db=$database\">$database</a></li>"; 
    } 
    echo '</ul>'; 
} else { 
    $database = $_GET['db']; 
    //only get the queries for that db 
    $data = explode(PHP_EOL, $data); 
    $buffer = array(); 
    $buffer_started = false; 

    foreach ($data as $key => $row){ 

     if (preg_match("/Database: `.*?`/", $row) && $buffer_started) { 
      array_pop($buffer); 
      break; 
     } 

     if (preg_match("/Database: `$database`/", $row)) { 
      $buffer_started = true; 
      continue; 
     } 

     if ($buffer_started) { 
      array_push($buffer, $row); 
     } 


     unset($data[$key]); 
    } 

    echo '<textarea cols="128" rows="20">'.implode("\n", $buffer).'</textarea>'; 
} 

保存し、このようにindex.phpと、それはファイルで見つかったデータベースをリストするだけでクリックしますと同じディレクトリにimport.sqlにあなたのSQLを置く: は、ここでは、誰かが同じ問題を抱えている場合であり、あなたが望むところであれば、それはテキストエリアにクエリを表示します。

幸運。

+0

? – arnep

+1

エクスポートを作成するときに、既存の構造を削除する場合は、インポート時に既存の構造/データをDBからクリアするドロップテーブルが選択されていることを確認します。既存の構造を失いたくない場合は、重複するエントリを防ぐために、各テーブルでテーブルを切り捨てる必要があります。 – RumpRanger

+0

これはあなたのために働いたルートであれば、あなた自身の質問に答えて答えを受け入れることができます。 –

答えて

0

beanlandによって示唆されるように、私は上記の編集から、わずかに変更されたコードで、自分の質問に答える:あなたは `-D databasename`パラメータを試してみました

error_reporting(E_ALL); 
$data = file_get_contents('import.sql'); 


if (! isset($_GET['db'])) { 
    //list databases 
    echo '<ul>'; 
    preg_match_all("/Database: `(.*?)`/", $data, $dbs); 

    foreach ($dbs[1] as $database){ 
     echo "<li><a href=\"index.php?db=$database\">$database</a></li>"; 
    } 
    echo '</ul>'; 
} else { 
    $database = $_GET['db']; 
    //only get the queries for that db 
    $data = explode(PHP_EOL, $data); 
    $buffer = array(); 
    $buffer_started = false; 

    foreach ($data as $key => $row){ 

     if (preg_match("/Database: `.*?`/", $row) && $buffer_started) { 
      array_pop($buffer); 
      break; 
     } 

     if (preg_match("/Database: `$database`/", $row)) { 
      $buffer_started = true; 
      continue; 
     } 

     if ($buffer_started) { 
      array_push($buffer, $row); 
     } 


     unset($data[$key]); 
    } 

    $data = implode("\n", $buffer); 

    //convert all InnoDB to MyISAM 

    $data = str_replace('InnoDB', 'MyISAM', $data); 

    echo '<a href="index.php">Back</a><h1>'.$database.'</h1><textarea cols="128" rows="20">'.$data.'</textarea>'; 
} 
関連する問題