无法导入从phpMyAdmin导出的sql文件

时间:2012-03-09 13:45:15

标签: mysql phpmyadmin

好的,情况就是这样。我已经通过进入phpMyAdmin来备份我的数据库,然后在没有选择任何数据库的情况下单击导出。现在,当我尝试将导出的sql文件导入到新的MySQL安装中时,我遇到了类似的错误 http://pastebin.com/vDHdG2T6(使用了pastebin,因为它很长)

我知道我应该使用mysqldump,因为它会跳过information_schema表。 您是否有任何建议如何解决此问题或导入该文件而无需编辑百万行文件?

我也尝试过导入文件,如: mysql -u root -p -f -h localhost<文件/ 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中显示查询。

祝你好运。

1 个答案:

答案 0 :(得分: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>';
}