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

큰 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



답변

max_allowed_packet=64M

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

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

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

Linux (Ubuntu) : / etc / mysql


답변

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

SET GLOBAL max_allowed_packet=1073741824;

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


답변

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

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


답변

일반적으로 오류 :

오류 : 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;
}


답변

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

$> mysqladmin variables -u user -p 

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

mysql> SET GLOBAL max_allowed_packet=1072731894

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


답변

오류를 해결하고 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


답변

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

라인을 추가

max_allowed_packet=500M

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