导入大型sql文件时,MySQL Server已经消失了

时间:2012-09-14 13:11:24

标签: mysql phpmyadmin

我试图通过phpMyAdmin导入一个大的sql文件......但它一直显示错误

  

'MySql服务器已经消失了'

怎么办?

19 个答案:

答案 0 :(得分:345)

如上所述here

  

MySQL服务器的两个最常见的原因(和修复)已经消失   (错误2006)是:

     

服务器超时并关闭连接。如何解决:

     
      
  1. 检查mysqld的my.cnf配置文件中的wait_timeout变量是否足够大。在Debian上:sudo nano /etc/mysql/my.cnf,设置wait_timeout = 600秒(你可以   当错误2006消失时调整/减小此值),然后sudo /etc/init.d/mysql restart。我没有检查,但默认值为   wait_timeout可能大约是28800秒(8小时)。

  2.   
  3. 服务器丢弃了错误或过大的数据包。如果mysqld获取的数据包太大或不正确,它会认为某些内容已经存在   客户端出错并关闭连接。你可以增加   通过增加值来最大化数据包大小限制   my.cnf文件中的max_allowed_pa​​cket。在Debian上:sudo nano /etc/mysql/my.cnf,设置max_allowed_packet = 64M(你可以   当错误2006消失时调整/减小此值),然后sudo /etc/init.d/mysql restart

  4.   

修改 请注意,MySQL选项文件的命令已经没有注释(例如在php.ini中)。因此,您必须在my.cnfmy.ini中键入任何更改/调整,并将它们放在mysql/data目录或任何其他路径中,位于适当的选项组下,例如{{1} },[client] ...等,例如:
[myslqd]
[mysqld]
wait_timeout = 600
然后重启服务器。要获取其值,请键入控制台:
max_allowed_packet = 64M
select @@wait_timeout;

答案 1 :(得分:87)

对我来说,这个解决方案没有成功,所以我执行了

SET GLOBAL max_allowed_packet=1073741824;

在我的SQL客户端。

如果无法在运行MYSql服务时更改此设置,则应停止服务并更改" my.ini"中的变量。文件。

例如:

max_allowed_packet=20M

答案 2 :(得分:18)

如果您使用默认值运行,那么您将有很多空间来优化您的mysql配置。

我建议的第一步是将max_allowed_pa​​cket增加到128M。

然后下载MySQL Tuning Primer script并运行它。它将为您的配置的几个方面提供建议,以获得更好的性能。

还要考虑在MySQL和PHP中调整超时值。

您要导入的文件有多大(文件大小),是否可以使用mysql命令行客户端而不是PHPMyAdmin导入文件?

答案 3 :(得分:17)

如果您正在使用XAMPP,那么您可以修复MySQL服务器已经消失了以下更改的问题..

打开my.ini文件 my.ini位置是(D:\ xampp \ mysql \ bin \ my.ini)

更改以下变量值

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

答案 4 :(得分:8)

如果您在OS X上使用MAMP,则需要更改MySQL模板中的max_allowed_packet值。

  1. 您可以在以下网址找到它:文件>修改模板> MySQL my.cnf

  2. 然后只搜索max_allowed_packet,更改值和 保存。

答案 5 :(得分:6)

我用这个简短的/etc/mysql/my.cnf文件解决了我的问题:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

答案 6 :(得分:5)

这可能发生的另一个原因是内存不足。检查/ var / log / messages并确保my.cnf没有设置为使mysqld分配的内存超过你的机器。

您的mysqld进程实际上可以被内核杀死,然后在没有意识到的情况下通过“safe_mysqld”进程重新启动。

使用top并在运行时观察内存分配,以查看您的余量。

在更改之前备份my.cnf。

答案 7 :(得分:5)

当我导入16 GB的SQL文件时,我遇到了此错误和其他相关错误。对我来说,编辑my.ini并在[mysqld]部分中设置以下内容(基于几个不同的帖子):

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

如果您在Windows下运行,请转到控制面板,服务,查看MySQL的详细信息,您将看到my.ini的位置。然后在编辑并保存my.ini之后,重新启动mysql服务(或重新启动计算机)。

如果您使用的是HeidiSQL,您也可以使用它来设置部分或全部。

答案 8 :(得分:2)

如果您的数据包含BLOB数据:

请注意,从命令行导入数据似乎会阻塞BLOB数据,导致“MySQL服务器已经消失”#39;错误。

要避免这种情况,请使用--hex-blob标志重新创建mysqldump:

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

将使用十六进制值而不是二进制文本写出数据文件。

PhpMyAdmin也有选项"以十六进制表示法转储二进制列(例如," abc"变为0x616263)"这很好用。

请注意,存在一个长期存在的错误(截至2015年12月),这意味着GEOM列未转换: Back up a table with a GEOMETRY column using mysqldump? 所以使用像PhpMyAdmin这样的程序似乎是唯一的解决方法(上面提到的选项可以正确转换GEOM列)。

答案 9 :(得分:1)

我将“max_allowed_pa​​cket”更新为1024M,但它仍然无效。事实证明我的部署脚本正在运行:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

如果你这样做,请务必在命令行中明确指定一个更大的数字。

答案 10 :(得分:1)

如果失败需要很长时间,请放大wait_timeout变量。

如果它立即失败,请放大max_allowed_packet变量;它仍然无法正常工作,请确保该命令是有效的SQL。我的未使用过的引号将一切搞砸了。

另外,如果可行,请考虑将单个SQL命令的插入数限制为1000.您可以创建一个脚本,通过每n次插入重新引入INSERT ...部分,从单个语句中创建多个语句

答案 11 :(得分:1)

我得到了一个类似的错误..解决这个问题只需打开my.ini文件。在第36行更改最大允许数据包大小的值即ie。 max_allowed_pa​​cket = 20M

答案 12 :(得分:1)

我也遇到同样的问题

var tempStoreFood = [];
var sameFoodID = [];
var differentFoodID = [];
var finalStoreFood = [];

console.log("Temporary stored food", tempStoreFood);
console.log("Same Food Group", sameFoodID);
console.log("Different Food Group", differentFoodID);
console.log("Concatenate");

for (i = 0; i < self.foods.length; i++) {
  var foodBrand = self.foods[i];
  var foodBrandID = self.foods[i].brand_id;
  tempStoreFood.push(foodBrand);
  for (j = 0; j < tempStoreFood.length; j++) {
    var foodID = tempStoreFood[j].brand_id;
    var singleFood = tempStoreFood[j];
    if (foodID == foodBrandID) {
      sameFoodID.push(singleFood);
      break;
    }
    if (foodID !== foodBrandID) {
      differentFoodID.push(singleFood);
      break;
    }
  }

在phpmyadmin的\ xampp \ mysql \ bin \ my.ini文件中,我们只能得到

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

仅用于mysqldump -u root -p dbname。我通过将上面的代码替换为

解决了我的问题
[mysqldump]
max_allowed_packet=110M

答案 13 :(得分:0)

今天我在复制数据库时遇到了类似的错误(MySQL服务器已经消失......),但是当我尝试重新启动mysql.server时,我遇到了错误

ERROR! The server quit without updating PID ...

这是我解决它的方式: 我打开了Applications / Utilities /并运行了Activity Monitor

 quit mysqld

然后能够用

解决错误问题
mysql.server restart

答案 14 :(得分:0)

我正在做一些涉及mysql连接的大型计算,以保持长时间和大量数据。我正面对这个“Mysql go away issue”。所以我尝试优化查询,但这没有帮助我然后我增加了mysql变量限制,默认设置为较低的值。

<强> WAIT_TIMEOUT max_allowed_pa​​cket的

对于适合您的限制,它应该是任意数字* 1024(字节)。您可以使用“ mysql -u username - p ”命令登录终端,并可以检查和更改这些变量限制。

答案 15 :(得分:0)

对于GoDaddy共享主机

在GoDaddy共享主机帐户上,调整PHP.ini等文件很棘手。然而,还有另一种方式,它对我来说非常有效。 (我刚刚成功上传了一个3.8Mb .sql文本文件,包含3100行和145列。使用phpMyAdmin中的IMPORT命令,我得到了可怕的 MySQL服务器已经消失错误,没有进一步的信息。)

我发现马特布彻有正确的答案。和Matt一样,我尝试过各种各样的技巧,从一口大小的块中导出MySQL数据库,再到编写将大量导入到较小版本的脚本。但这是有效的:

(1)CPANEL ---&gt;文件(组)---&gt; BACKUP

(2a)&#34;部分备份&#34;标题...
(2b)在&#34;下载MySQL数据库备份&#34;
(2c)选择您的数据库并下载备份(此步骤是可选的,但明智的)

(3a)直接在2b的右侧,标题为#34;恢复MySQL数据库备份&#34;
(3b)从本地驱动器中选择.SQL导入文件 (3c)真正的幸福将是你的(不久......)我花了大约5秒钟

  

我能够使用此方法导入单个表。我的数据库中没有其他任何东西受到影响 - 但这就是上面的步骤(2)旨在防范。

注意:
一个。如果您不确定如何创建.SQL导入文件,请使用phpMyAdmin导出表并修改该文件结构。

来源: Matt Butcher 2010 Article

答案 16 :(得分:0)

确保mysqld进程不会因为像systemd这样的服务管理器而重启。

我在带有centos 7的流浪汉中遇到了这个问题。配置调整没有帮助。原来它是systemd,它每次占用太多内存时都会杀死mysqld服务。

答案 17 :(得分:0)

如果增加max_allowed_packet无济于事。

通过Sequel Pro将.sql文件导入到我的数据库时,我遇到了与您相同的错误。

max_allowed_packet升级为512M之后,错误仍然存​​在,因此我在命令行中使用以下命令运行导入:

mysql --verbose -u root -p DatabaseName < MySQL.sql

它给出了以下错误:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

我发现了两个有用的StackOverflow问题:

就我而言,我的.sql文件有点损坏或类似问题。我们得到的MySQL转储包含两个压缩文件,这些压缩文件需要连接在一起然后解压缩。我认为解压缩最初会被中断,从而使文件带有一些奇怪的字符和编码。获得一个新的MySQL转储并将其解压缩对我来说正常工作。

只是想在此处添加此内容,以防其他人发现增加max_allowed_packet变量无济于事。

答案 18 :(得分:0)

关于数据包大小或超时的所有解决方案都对我没有任何影响。我需要禁用ssl

        public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IHttpClientFactory _httpClientFactory;
        private IMemoryCache _cache;

        public HomeController(ILogger<HomeController> logger, IHttpClientFactory httpClientFactory, IMemoryCache memoryCache)
        {
            _logger = logger;
            _httpClientFactory = httpClientFactory;
            _cache = memoryCache;
        }

        public IActionResult Index()
        {
            ViewBag.Cache = _cache;

             return View();
        }



        public IActionResult Privacy()
        {

            return View();
        }



        [AllowAnonymous]
        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    } 

https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html