MySQL多查询间歇性失败

6
function cpanel_populate_database($dbname) 
{ 
     // populate database
     $sql = file_get_contents(dirname(__FILE__) . '/PHP-Point-Of-Sale/database/database.sql');
     $mysqli->multi_query($sql);

     $mysqli->close();
 }

这个 SQL 文件是从 phpMyAdmin 直接导出的,通常情况下大约有 95% 的时间可以无问题地运行,所有的表都会被创建并插入数据。 (我正在从头开始创建一个数据库)
剩下的 5% 中,只有第一个表或者有时前四个表会被创建,但是其他表都没有被创建(总共有 30 张表)。
我已经决定不使用 multi_query,因为它似乎存在 bug,并查看是否通过在每个分号后使用 mysql_query 来逐行执行语句。有人遇到过类似这样的问题吗?
4个回答

12

快速而有效

system('mysql -h #username# -u #username# -p #database# < #dump_file#');

2

我在使用 multi_query 处理创建或修改表格的查询时,遇到了类似的问题。特别是,经常会出现 InnoDB 1005 错误,这与外键有关,好像 MySQL 在执行完一个语句之前就转移到下一个语句了,因此外键缺乏适当的引用关系。

在一个系统中,我将有问题的语句拆分为单独的文件。在另一个系统中,我确实将每个命令单独运行,并按分号进行拆分:

function load_sql_file($basename, $db) {
    // Todo: Trim comments from the end of a line
    log_upgrade("Attempting to run the `$basename` upgrade.");

    $filename = dirname(__FILE__)."/sql/$basename.sql";
    if (!file_exists($filename)) {
        log_upgrade("Upgrade file `$filename` does not exist.");
        return false;
    }

    $file_content = file($filename);
    $query = '';
    foreach ($file_content as $sql_line) {
        $tsl = trim($sql_line);
        if ($sql_line and (substr($tsl, 0, 2) != '--') and (substr($tsl, 0, 1) != '#')) {
            $query .= $sql_line;
            if (substr($tsl, -1) == ';') {
                set_time_limit(300);
                $sql = trim($query, "\0.. ;");
                $result = $db->execute($sql);
                if (!$result) {
                    log_upgrade("Failure in `$basename` upgrade:\n$sql");
                    if ($error = $db->lastError()) {
                        log_upgrade("$error");
                    }

                    return false;
                }

                $query = '';
            }
        }
    }

    $remainder = trim($query);
    if ($remainder) {
        log_upgrade("Trailing text in `$basename` upgrade:\n$remainder");
        if (DEBUG) trigger_error('Trailing text in upgrade script: '.$remainder, E_USER_WARNING);
        return false;
    }

    log_upgrade("`$basename` upgrade successful.");
    return true;
}

0

我从未使用过多查询。当我需要类似的功能时,我转向mysqli。此外,如果您不需要查询结果,则将脚本传递给mysql_query也可以工作。如果导出顺序与外键和其他要求表冲突,也会出现这些错误。


0

我认为将SQL文件拆分为单个查询的方法是一个好主意。即使只是为了比较(看它是否解决了问题)。

此外,我不确定你的文件有多大 - 但我曾经遇到过几种情况,其中文件非常大,将其拆分成批次就可以完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接