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

Posted

技术标签:

【中文标题】无法导入从 phpMyAdmin 导出的 sql 文件【英文标题】:Can't import a sql file exported from phpMyAdmin 【发布时间】:2012-03-26 23:04:46 【问题描述】:

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

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

我也尝试过像这样导入文件: mysql -u root -p -f -h localhost

提前致谢!

编辑:

谢谢大家的建议,我相信你是在正确的轨道上。然而,与此同时,我最终也弄乱了我的备份文件,所以我不得不编写一些 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 中,它将列出在文件中找到的数据库,只需单击您想要的任何一个,它就会在文本区域中显示查询。

祝你好运。

【问题讨论】:

你试过-D databasename参数吗? 创建导出时,如果要删除现有结构,请确保选择删除表,这将在您导入时从数据库中清除现有结构/数据。如果您不想丢失现有结构,您可能需要在每个表上运行截断表以防止重复条目。 您可以回答您自己的问题并接受您的回答,如果这是您采取的适合您的路线。 【参考方案1】:

根据 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>';

【讨论】:

以上是关于无法导入从 phpMyAdmin 导出的 sql 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 phpMyAdmin 使用导出/导入 SQL 文件时出错

我有一个较旧的 .sql 文件(从 5.0.45 导出)我正在尝试通过 phpMyAdmin 导入更新版本的 MySQL。接收错误

从 phpMyAdmin 导出 .sql 数据库

使用 PHP/PHPMyAdmin 导出

PHPMyAdmin - Wordpress XML 导出无法导入

如何用phpmyadmin导入大容量.sql文件