큰 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
수입
특정 경우에서를 통해 데이터베이스 파일을 가져 오는 동안 mysql
SQL 파일의 일부 쿼리가 너무 커서 가져올 수 없으므로 서버에서 실행할 수 없으므로 첫 번째 오류가 발생하면 클라이언트가 실패합니다.
따라서 다음과 같은 가능성이 있습니다.
-
나머지 쿼리를 진행하고 실행하려면 강제 옵션 (
-f
)을 추가하십시오mysql
.데이터베이스에 캐시와 관련된 큰 쿼리가있는 경우 유용합니다.
-
증가
max_allowed_packet
및wait_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_ping
PHP)을 통해 연결을 테스트하십시오 . -
다음
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 파일을 성공적으로 마이그레이션했습니다.
-
다른 사람들이 추천 한대로 다음 내용으로 /etc/my.cnf를 작성했습니다.
[mysql] connect_timeout = 43200 max_allowed_packet = 2048M net_buffer_length = 512M debug-info = TRUE
-
--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 서비스를 다시 시작하십시오.