ERROR 2006 (HY000) : MySQL 서버가 사라졌습니다


309

큰 SQL 파일 (큰 INSERT쿼리) 을 소스하려고 할 때이 오류가 발생 합니다.

mysql>  source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

테이블에 아무것도 업데이트되지 않습니다. 테이블 / 데이터베이스를 삭제 및 삭제하고 MySQL을 다시 시작하려고했습니다. 이 중 어느 것도 문제를 해결하지 못합니다.

내 최대 패킷 크기는 다음과 같습니다.

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

파일 크기는 다음과 같습니다.

$ ls -s file.sql 
79512 file.sql

다른 방법을 시도하면 ...

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away

2
얼마나 큰 파일입니까? max_allowed_packet 설정을 초과했을 가능성이 있습니까?
Marc B

1
좋아, 그렇지 않아 파일에서 개별 쿼리를 꺼내 모니터에서 직접 실행 해보십시오. 충돌이 발생하거나 연결이 끊어졌습니다.
Marc B

파일에서 무작위로 가져온 쿼리는 정상적으로 작동합니다. 프로그래밍 방식으로 SQL을 생성하고 모든 것을 올바르게 이스케이프했습니다. 따라서 오류가 발생하면 무엇이 발생하는지 잘 모르겠습니다.
bgcode

1
나도 같은 문제가 있습니다 ...
maaz

답변:


561
max_allowed_packet=64M

이 줄을 my.cnf파일에 추가하면 문제가 해결됩니다.

이것은 열의 값이 클 때 문제가되는 경우에 유용 합니다 .

Windows에서이 파일은 "C : \ ProgramData \ MySQL \ MySQL Server 5.6"에 있습니다.

Linux (Ubuntu) : / etc / mysql


3
이 솔루션은 나에게 명시된 문제를 해결했습니다. 클라이언트 측의 구성 / 옵션으로는 아무것도 할 수 없었으며 PHP 나 기타를 통해 프로그래밍 방식의 솔루션을 기꺼이 포기하지 않았습니다.
Richard Sitze

154
또한 루트 (또는 SUPER 권한)로 데이터베이스에 로그인 할 수 set global max_allowed_packet=64*1024*1024;- MySQL의 재시작을 필요로하지 않습니다뿐만 아니라
razzed

3
이것은 나를 위해 그것을 고쳤다. my.cnf는 / etc 폴더에 있습니다.
Sam Vloeberghs

8
이것을 명령 줄에 입력하면 시스템 파일을 일시적으로 편집하지 않아도됩니다 : <code> mysql --max_allowed_packet = 1GM </ code>
Jan Steinman

6
my.cnf 파일의 위치를 ​​찾는 사람은 이 답변을 확인할 수 있습니다 . sudo service mysql restartmy.cnf 파일에 대한 변경 사항을 적용하려면 다음 을 입력하여 mysql을 다시 시작 해야합니다.
consuela

148

최대 허용 패킷을 늘릴 수 있습니다

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet


3
받아 들인 대답은 그렇지 않지만 이것은 나를 위해 일했습니다. 나는이 답변의 높은 가치가 나를위한 해결책의 근본이라고 생각합니다.
John Bubriski

나는 my.cnf 파일에서의 max_allowed_packet = 1024M을 설정
사바 토스

1
그것은 서버를 수행합니다. "mysql --max_allowed_packet = 1073741824"와 같이 클라이언트에서도이를 수행해야합니다.
Jan Steinman

이것은 나를 위해 일했습니다. 한가지 질문은 바이트 단위로 "1073741824"입니다
user2478236

66

글로벌 업데이트 및 my.cnf 설정이 어떤 이유로 작동하지 않았습니다. max_allowed_packet클라이언트에 직접 값을 전달하면 여기에서 작동했습니다.

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql

4
MySQL 웹 사이트에 따르면 표시된 답변과 이것이 모두 사용되어야합니다.
Zenexer

2
이 설정을 변경 한 후 구성 파일을 다시로드하거나 서버를 다시 시작하는 것을 잊지 마십시오
Csaba Toth

2
--max_allowed_packet클라이언트에만 영향을 미치는 것을 사용하십시오 . 파일 을 편집 max_allowed_packet하고 /etc/my.cnfmysql 서버를 다시 시작하여 mysql 서버 (mysqld)를 수정 하십시오.
Fleuv

인간 친화적 인 "50M"또는 "1G"값은 cli 및 my.cnf에서 작동합니다. dev.mysql.com/doc/refman/8.0/en/using-system-variables.html
txyoji

36

일반적으로 오류 :

오류 : 2006 ( CR_SERVER_GONE_ERROR)-MySQL 서버가 사라졌습니다

클라이언트가 서버에 질문을 보낼 수 없음을 의미 합니다 .


mysql 수입

특정 경우에서를 통해 데이터베이스 파일을 가져 오는 동안 mysqlSQL 파일의 일부 쿼리가 너무 커서 가져올 수 없으므로 서버에서 실행할 수 없으므로 첫 번째 오류가 발생하면 클라이언트가 실패합니다.

따라서 다음과 같은 가능성이 있습니다.

  • 나머지 쿼리를 진행하고 실행하려면 강제 옵션 ( -f)을 추가하십시오 mysql.

    데이터베이스에 캐시와 관련된 큰 쿼리가있는 경우 유용합니다.

  • 증가 max_allowed_packetwait_timeout 서버 설정 (예에서 ~/.my.cnf).

  • --skip-extended-insert큰 쿼리를 분류하는 옵션을 사용하여 데이터베이스를 덤프하십시오 . 그런 다음 다시 가져 오십시오.

  • --max-allowed-packet옵션을 적용 해보십시오 mysql.


일반적인 이유

일반적으로이 오류는 다음과 같은 여러 가지를 의미 할 수 있습니다.

  • 서버에 대한 쿼리가 잘못되었거나 너무 큼

    솔루션 : 변수를 늘리십시오max_allowed_packet .

    • 변수가 [mysqld]아닌 섹션 아래에 있는지 확인하십시오 [mysql].

    • 테스트에 많은 숫자를 사용하는 것을 두려워하지 마십시오 (예 1G:).

    • MySQL / MariaDB 서버를 다시 시작하는 것을 잊지 마십시오.

    • 다음을 통해 값이 올바르게 설정되었는지 다시 확인하십시오.

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
  • 클라이언트 쪽의 TCP / IP 연결에서 시간이 초과되었습니다.

    솔루션 : 변수를 늘리십시오wait_timeout .

  • 서버 연결이 닫힌 후 쿼리를 실행하려고했습니다.

    해결 방법 : 응용 프로그램의 논리 오류를 수정해야합니다.

  • 호스트 이름 조회에 실패했거나 (예 : DNS 서버 문제) 서버가 --skip-networking옵션 으로 시작되었습니다 .

    방화벽이 MySQL 포트를 차단할 수도 있습니다 (예 : 기본적으로 3306).

  • 실행중인 스레드가 종료되었으므로 다시 시도하십시오.

  • 쿼리를 실행하는 동안 서버가 죽는 버그가 발생했습니다.

  • 다른 호스트에서 실행중인 클라이언트는 연결하는 데 필요한 권한이 없습니다.

  • 그리고 더 많은, 그래서 더 많은 배우 : B.5.2.9 MySQL 서버는 사라했다 .


디버깅

전문가 수준의 디버그 아이디어는 다음과 같습니다.

  • 로그를 확인하십시오. 예 :

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
  • mysql, telnet또는 핑 기능 (예 : mysql_pingPHP)을 통해 연결을 테스트하십시오 .

  • 다음 tcpdump과 같이 MySQL 통신을 스니핑하십시오 (소켓 연결에는 작동하지 않음).

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
  • Linux에서는을 사용하십시오 strace. BSD / 맥 사용에 dtrace/ dtruss

    sudo dtruss -a -fn mysqld 2>&1

    참조 : DTracing MySQL 시작하기

26.5 MySQL 디버깅 및 포팅 에서 MySQL 서버 또는 클라이언트를 디버깅하는 방법에 대해 자세히 알아보십시오 .

참조를 위해, 클라이언트 명령에 대한 오류를 발생 sql-common/client.c시키는 파일 의 소스 코드를 확인하십시오 CR_SERVER_GONE_ERROR.

MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
          arg, arg_length))
{
  set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
  goto end;
}

--quick은 나를 위해 작동하지 않았지만 --skip-extended-insert는 작동했습니다!
chiliNUT

20

경우에 따라 변수를 확인하기 위해 사용할 수 있습니다.

$> mysqladmin variables -u user -p 

이것은 현재 변수,이 경우 max_allowed_packet을 표시하며 다른 답변에서 말했듯이 일시적으로 설정할 수 있습니다

mysql> SET GLOBAL max_allowed_packet=1072731894

필자의 경우 cnf 파일은 고려되지 않았으며 이유를 모르겠으므로 SET GLOBAL 코드가 실제로 도움이되었습니다.


한 번에 모든 구성 설정을 볼 수있어 좋습니다. 감사!
DrB

20

오류를 해결하고 ERROR 2006 (HY000) at line 97: MySQL server has gone away다음 두 단계를 순서대로 수행하여> 5GB sql 파일을 성공적으로 마이그레이션했습니다.

  1. 다른 사람들이 추천 한대로 다음 내용으로 /etc/my.cnf를 작성했습니다.

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
  2. --force --wait --reconnect명령에 플래그 를 추가합니다 (예 :) mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect.

중요 참고 : /etc/my.cnf 파일을 변경하거나 플래그를 추가하지 않으면 가져 오기 후에 일부 테이블이 누락되었으므로 두 단계를 모두 수행해야했습니다.

사용 된 시스템 : OSX El Capitan 10.11.5; osx10.8 (i386) 용 MySQL Ver 14.14 Distrib 5.5.51


2
모든 지침을 따른 후에도 오류가 발생합니다.
Santosh Hegde

공유 호스트에서이 문제를 실행하는 사용자의 경우 구성 파일을 변경할 수 없으므로이 솔루션은 매우 효과적입니다.
Felipe Costa

@SantoshHegde 너무 늦을 수도 있지만를 변경 한 후 my.cnfmysql 서비스를 다시 시작해야합니다.
Jason Liu

11

같은 문제가 있었지만 [mysqld] 아래의 my.ini / my.cnf 파일에서 max_allowed_packet을 변경하면 문제가 해결되었습니다.

라인을 추가

max_allowed_packet=500M

완료되면 이제 MySQL 서비스를 다시 시작하십시오.


@babonk 그렇습니다. 그러나이 답변은 어떤 섹션에서 가야하는지 알려주기 때문에 더 유용합니다
Jason Wheeler

11

데이터베이스에 루트 (또는 SUPER 권한)로 로그인하여 다음을 수행 할 수도 있습니다.

set global max_allowed_packet=64*1024*1024;

MySQL을 다시 시작할 필요도 없습니다. my.cnf다른 솔루션에 설명 된대로 파일을 수정해야 합니다.

[mysqld]
max_allowed_packet=64M

그리고 MySQL을 다시 시작한 후 변경 사항을 확인하십시오.

show variables like 'max_allowed_packet';

명령 줄도 사용할 수 있지만 시스템 업데이트 및 패치 후에는 시작 / 중지 스크립트를 업데이트해야 할 수도 있습니다.

요청에 따라 여기에 내 답변을 추가하고 있습니다. 그것이 작동하는 것을보고 다행입니다!


9

해결책은 옵션 파일의 태그 아래에서 wait_timeoutconnect_timeout매개 변수 의 값을 늘리는 것 [mysqld]입니다.

400MB mysql 백업을 복구해야했고 이것은 나를 위해 일했습니다 (아래에서 사용한 값은 약간 과장되었지만 요점을 알 수 있습니다).

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000

인용구


1
큰. 이것은 내가 해결할 수있는 또 다른 오류를 얻는 데 도움이됩니다 :)
jrosell

6

여기서 몇 가지 일이 발생할 수 있습니다.

  • 당신 INSERT은 오래 실행되고 있으며 클라이언트 연결이 끊어졌습니다. 다시 연결하면 데이터베이스를 선택하지 않으므로 오류가 발생합니다. 여기서 한 가지 옵션은 명령 줄에서 배치 파일을 실행하고 인수에서 데이터베이스를 선택하는 것입니다.

$ mysql db_name <source.sql

  • 다른 하나는 php다른 언어 를 통해 명령을 실행하는 것 입니다. 각 장기 실행 명령문 후에는 연결을 닫았다가 다시 열어서 각 쿼리 시작시 연결되도록합니다.

또 다른 것은 가치에 대한 언급이 난 후 거의 즉시 오류를 얻을 수 있다는 것입니다 source명령
bgcode

source 명령 직후에 오류가 발생하면 MySQL이 쿼리에 대해 좋아하지 않는 것 같습니다. 일반 로그를 확인 했습니까?
Chris Henry

일반 로그를 확인하는 방법을 알아 내야합니다. MAMP의 Im이며 기본적으로 기록하는지 확실하지 않습니다.
bgcode

PHP 쿼리와 슬라이싱으로 해결하기로 선택했습니다.
bgcode


2

Mysql Cluster를 사용할 때이 오류가 발생했습니다.이 질문이 클러스터 사용에서 발생했는지 여부를 알 수 없습니다. 오류가 정확히 동일하므로 여기에 솔루션을 제공하십시오. 데이터 노드가 갑자기 충돌하여이 오류가 발생합니다. 그러나 노드가 충돌해도 cmd를 사용하여 올바른 결과를 얻을 수 있습니다.

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

그리고 mysqld도 제대로 작동하기 때문에 처음에는 무엇이 잘못되었는지 이해할 수 없습니다. 약 5 분 후 ndb_mgm 결과에 데이터 노드가 작동하지 않음이 표시됩니다. 그런 다음 문제를 깨닫습니다. 따라서 모든 데이터 노드를 다시 시작하면 mysql 서버가 돌아오고 모든 것이 정상입니다.

그러나 일부 쿼리에 대해 mysql 서버를 잃은 후에 한 가지 이상한 점이 있습니다. cmd like를 사용 show tables하면 여전히 같은 리턴 정보를 얻을 수 33 rows in set (5.57 sec)있지만 테이블 정보는 표시되지 않습니다.


1

아마존 RDS (내 경우)의 경우 max_allowed_packet매개 변수 값을 바이트 단위의 숫자 값으로 변경할 수 있습니다 (예 : 삽입물에 50MB의 블롭 값이있는 경우 max_allowed_packet64M = 67108864), 새 또는 기존 parameter-group. 그런 다음 해당 파라미터 그룹을 MySQL 인스턴스에 적용하십시오 (인스턴스 재부팅이 필요할 수 있음).


Amazon RDS로 작업하는 경우 작동합니다. SebaGra가 지시 한 것처럼 RDS에서 전역 값을 설정할 수 없습니다. DB의 사용자 지정 매개 변수 그룹으로 이동하여 수정 max_allowed_packet parameter하면 해당 크기를 찾아 적절한 크기로 설정하십시오. ) 작동합니다.
G_Style

동일한 데이터 세트를로드하거나 완전히 임의의 데이터를로드 할 때 일관된 오류가 발생 했습니까? 나는 같은 문제가 있지만 완전히 무작위이기 때문에 5 번 실패한 다음 5 일을 할 것입니다. 또한 로컬 컴퓨터로 이동하고 Visual Studio에서 실행하는 것이 도움이되는 것처럼 보이지만 가끔은 한 번씩 오류가 발생합니다.
BilliD

0

다시 연결하고 연결 ID 2를 얻는 경우 서버가 거의 충돌 한 것입니다.

서버 관리자에게 문의하여 문제를 진단하십시오. 악성이 아닌 SQL이 서버와 충돌하지 않아야하며, mysqldump의 출력이 확실하지 않아야합니다.

서버 관리자가 아키텍처의 주소 공간 제한보다 크거나 가상 메모리 용량보다 큰 버퍼 크기를 할당하는 등의 큰 작동 오류가 발생한 경우 일 수 있습니다. MySQL 오류 로그에는 아마도 관련 정보가있을 것입니다. 그들은 어쨌든 유능하다면 이것을 모니터링 할 것입니다.


0

이것은 드문 문제이지만 누군가가 DB를 다른 서버로 마이그레이션하는 방법으로 전체 / var / lib / mysql 디렉토리를 복사 한 경우에 이것을 보았습니다. 작동하지 않는 이유는 데이터베이스가 실행 중이고 로그 파일을 사용했기 때문입니다. / var / log / mysql에 로그가있는 경우 가끔 작동하지 않습니다. 해결책은 / var / log / mysql 파일도 복사하는 것입니다.


0

DB 가져 오기 실패에 대한 솔루션을 찾고있는 Drupal 8 사용자의 경우 :

SQL 덤프 파일의 끝에 "webprofiler"테이블에 데이터를 삽입하는 명령이있을 수 있습니다. 그것은 일부 디버그 로그 파일을 추측하고 사이트가 작동하는 데 실제로 중요하지 않으므로이 모든 것을 제거 할 수 있습니다. LOCK TABLES 및 UNLOCK TABLES (및 그 사이의 모든 것)를 포함한 모든 삽입을 삭제했습니다. SQL 파일의 맨 아래에 있습니다. 문제는 여기에 설명되어 있습니다.

https://www.drupal.org/project/devel/issues/2723437

그러나 해당 테이블을 자르는 것 외에는 해결책이 없습니다.

BTW 위의 답변에서 모든 솔루션을 시도했지만 다른 도움이되지 않았습니다.


0

위의 모든 솔루션을 시도했지만 모두 실패했습니다.

나는 -h 127.0.0.1default 대신에를 사용했다 var/run/mysqld/mysqld.sock.


0

이 오류 메시지는 덤프에 사용 된 것과 다른 COLLATION으로 SCHEMA를 작성할 때도 발생합니다. 따라서 덤프에

CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

SCHEMA 데이터 정렬에도이를 반영해야합니다.

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

나는 스키마에서 utf8mb4_general_ci를 사용하여 스크립트를 새로운 V8 설치에서 왔기 때문에 이전 5.7에 DB를로드하고 거의 나를 미치게했다.

그래서, 이것은 아마도 당신이 실망스러운 시간을 절약하는 데 도움이 될 것입니다 ... :-)

(MacOS 10.3, mysql 5.7)


-1

이 답변 중 어느 것도 문제를 해결하지 못하면 테이블을 제거하고 다음과 같이 자동으로 다시 생성하여 문제를 해결했습니다.

when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT

그런 다음이 백업을 db와 함께 사용하면 필요한 테이블을 제거하고 다시 만듭니다.

그런 다음 데이터 만 백업하고 동일한 작업을 수행하면 작동합니다.


-3

다음과 같이 mysql 클라이언트를 사용하는 방법은 다음과 같습니다.

mysql -h <hostname> -u username -p <databasename> < file.sql

SQL 파일이 너무 큰 경우에는 작동하지 않습니다 ... 그게 문제입니다.
lesolorzanov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.