【问题标题】:mysql multi_query intermittently failsmysql multi_query 间歇性失败
【发布时间】:2023-04-02 05:13:01
【问题描述】:
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% 只创建第一个表或有时前 4 个表,但没有创建其他表(有 30 个表)。

我决定不使用 multi_query,因为它看起来有问题,并通过在分号后的每一行上仅使用 mysql_query 来查看错误是否发生。有没有人遇到过这样的问题?

【问题讨论】:

    标签: php mysql multi-query


    【解决方案1】:

    快速有效

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

      【讨论】:

        【解决方案3】:

        我从未使用过多重查询。当我需要类似的东西时,我搬到了mysqli。此外,如果您不需要查询的任何结果,则将脚本传递给 mysql_query 也可以。如果导出的顺序不正确,与需要外键和其他表的表发生冲突,您也会收到这些错误。

        【讨论】:

          【解决方案4】:

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

          另外,我不确定您的文件有多大 - 但我遇到过一些文件非常大的情况,将其拆分成批次就可以了。

          【讨论】:

            猜你喜欢
            • 2019-04-18
            • 2011-10-21
            • 1970-01-01
            • 1970-01-01
            • 2017-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-22
            相关资源
            最近更新 更多