IT

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

lottoking 2020. 3. 19. 08:28
반응형

오류 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또는 ping 기능 (예 : 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 서비스를 다시 시작하십시오.


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

set global max_allowed_packet=64*1024*1024;

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

[mysqld]
max_allowed_packet=64M

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

show variables like 'max_allowed_packet';

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

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


해결책은 옵션 파일의 태그 아래에서 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

인용구


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

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

$ mysql db_name <source.sql

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

Mac에 있고 나와 같은 brew를 통해 mysql을 설치하면 다음이 효과가 있습니다.

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf

출처 : homebrew mysql 설치의 경우 my.cnf는 어디에 있습니까?

  1. 추가 max_allowed_packet=1073741824/usr/local/etc/my.cnf

  2. mysql.server restart


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)있지만 테이블 정보는 표시되지 않습니다.


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


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

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

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


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


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

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

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

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

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


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

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와 함께 사용하면 필요한 테이블을 제거하고 다시 만듭니다.

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


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

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

참고 URL : https://stackoverflow.com/questions/10474922/error-2006-hy000-mysql-server-has-gone-away

반응형