2012-03-09 110 views
0

好的,這是情況。我通過進入phpMyAdmin備份了我的數據庫,然後在沒有選擇任何數據庫的情況下單擊導出。現在,當我嘗試導入導出的SQL文件到一個新的MySQL安裝,我越來越喜歡 http://pastebin.com/vDHdG2T6錯誤(使用引擎收錄,因爲它是很長)無法導入從phpMyAdmin導出的sql文件

我知道我應該使用mysqldump的,而不是因爲它會跳過INFORMATION_SCHEMA表。 你有沒有建議如何解決這個問題或導入該文件,而不必編輯百萬行文件?

我也嘗試導入的文件,如: 的mysql -u根-p -f -h本地主機<文件/ localhost.sql 這並導入數據庫,但他們中許多人損壞,丟失表和這樣的...我使用了-f,所以無論錯誤如何,它都會繼續運行。

在此先感謝!

編輯:

謝謝你們的建議,我敢肯定,你在正確的軌道上。然而,在此期間,我最終搞亂了我的備份文件,所以我不得不寫一點點的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,把你的SQL到import.sql在同一目錄下,它會列出在文件中找到的數據庫,只需點擊無論你想要什麼,它都會在textarea中顯示查詢。

祝你好運。

+0

您是否嘗試過'-D databasename'參數? – arnep 2012-03-09 13:51:59

+1

創建導出時,如果要刪除現有結構,請確保選中刪除表,這將在導入時從數據庫中清除現有結構/數據。如果您不想丟失現有結構,則可能需要在每個表上運行截斷表以防止出現重複條目​​。 – RumpRanger 2012-03-09 15:01:03

+0

如果這是您爲之工作的路線,您可以回答自己的問題並接受您的答案。 – 2012-03-22 15:09:11

回答

0

正如beanland的建議,我會回答我的問題,從上面的編輯稍微修改代碼:

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>'; 
}