MySQL服务器已经消失了错误,我不认为这是一个超时


"MySQL server has gone away" error, I don't think it is a timeout

我试图通过PHP导入SQL转储。我有以下代码。

    @mysql_connect("localhost", "root", "root") or die("Cannot connect to DB!");
    @mysql_select_db("great_database") or die("Cannot select DB!");
    $query = file_get_contents('defaultDatabasePartOne.sql', FILE_USE_INCLUDE_PATH);
    debug($query);
    $result = mysql_query($query);      
    debug($result);
    $error = mysql_error();
    debug($error);

我知道它是正确加载我的文件,因为它调试$query,这是文件。我从文件中删除了注释,但它仍然有换行符,这不会是一个问题,会吗?

我知道这个错误可能与超时有关,但我运行SET GLOBAL wait_timeout =99999999999,它没有改变任何东西,所以我认为这可能不是它?我在SQL没有经验,我怎么能解决这个问题?

下面是@chris的例子:

CREATE TABLE `access_tokens` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `token` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `user_id` int(11) NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `token` (`token`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

发现这个:

下面是我用来做这个操作的函数:我想把它贴出来,只是为了将来有需要的人。
  • $url是sql文件
  • 的路径$nowhost is dbhost $nowdatabase is db
  • $nowuser是数据库用户
  • $nowpass is db pass
代码:

function parse_mysql_dump($url,$nowhost,$nowdatabase,$nowuser,$nowpass){
    $link = mysql_connect($nowhost, $nowuser, $nowpass);
        if (!$link) {
           die('Not connected : ' . mysql_error());
        }
        // make foo the current db
        $db_selected = mysql_select_db($nowdatabase, $link);
        if (!$db_selected) {
           die ('Can''t use foo : ' . mysql_error());
        }
   $file_content = file($url);
   foreach($file_content as $sql_line){
     if(trim($sql_line) != "" && strpos($sql_line, "--") === false){
     //echo $sql_line . '<br>';
       mysql_query($sql_line);
     }
   }
  }

这个垃圾场有多大?您可能超过了max_allowed_packet限制(一个查询可以发送到客户机->服务器的最大大小)。

同样,请记住mysqldump生成的.sql文件包含多个查询。PHP mysql驱动程序不允许通过单个query()调用执行多个查询语句。如果不将转储文件解析为单独的查询,则永远无法以这种方式加载转储文件。