큰 SQL 파일을 가져올 때 MySQL 서버가 사라졌습니다


259

phpMyAdmin을 통해 큰 SQL 파일을 가져 오려고했지만 오류가 계속 표시되었습니다.

'MySql 서버가 사라졌습니다'

무엇을해야합니까?


3
max_allowed_packet 및 wait_timeout의 값은 무엇입니까?
daemonofchaos

1
당신은 두 배로 시도 할 수 있습니다 max_allowed_packet. 약간 조잡하지만 작동하면 제정신의 가치를 찾을 수 있습니다.
Nanne

1
웃음 Cole Johnson에게 감사합니다. 그것은 굉장했다! 롤! :)
mbrinson

우연히 자주 봅니다. 그러나 같은 오류를 다시 재현 할 수 없습니다. 따라서 역동적이라는 것을 깨달았습니다. 때때로, 클라이언트가 너무 많은 SQL을 서버로 보내면 (예 : 루프에서) 이런 일이 발생할 수 있습니다. 이 오류의 실제 원인을 찾는 것이 중요합니다. 힌트 패턴을 찾기 위해 SQL 패턴의 반복 패턴에 대해서도 쿼리 로그를 확인하십시오.
Bimal Poudel

때로는 디스크 공간이 부족할
때이 문제

답변:


376

여기에 명시된 바와 같이 :

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. 서버가 잘못되었거나 너무 큰 패킷을 삭제했습니다. mysqld가 너무 크거나 부정확 한 패킷을 얻는 경우, 클라이언트에 문제가 있다고 가정하고 연결을 닫습니다. my.cnf 파일에서 max_allowed_packet의 값을 늘려 최대 패킷 크기 제한을 늘릴 수 있습니다. 데비안에서 : sudo nano /etc/mysql/my.cnf, 세트 max_allowed_packet = 64M(당신은 / 조정할 오류 2006 사라 경우이 값을 줄일 수 있습니다) 다음, sudo /etc/init.d/mysql restart.

편집하다:

MySQL 옵션 파일에는 명령을 주석으로 사용할 수 없습니다 (예 : php.ini 등). 당신은에서 변경 / 비틀기를 입력해야합니다 그래서 my.cnfmy.ini과에 배치 mysql/data같은 옵션의 적절한 그룹 아래, 디렉토리 또는 다른 경로 중 하나로 [client], [myslqd]등 예를 들어 :

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

그런 다음 서버를 다시 시작하십시오. 값을 얻으려면 mysql 클라이언트를 입력하십시오.

> select @@wait_timeout;
> select @@max_allowed_packet;

72
제 경우에는 max_allowed_packet 변수였습니다. 기본값은 1MB로 설정되었으며 ( SHOW VARIABLESMySQL 쿼리 를 실행하여 볼 수 있음 ) 가져 오는 파일에 매우 큰 레코드가 있습니다. my.ini 파일 (Windows를 실행 중임)을 열고 값을 다음과 같이 설정했습니다 max_allowed_packet = 64M.
브렌트 Matzelle

webissues를 사용하여 데이터베이스에 큰 파일을 업로드하고있었습니다. 도움을 주셔서 감사합니다 ... :-)
inf3rno 2016 년

@BrentMatzelle "Mysql has away"문제를 확실히 처리했다. 감사!
asprin

2
wait_timeout라인을 찾을 수 없습니다
Oki Erie Rinaldi

4
(XAMPP와) 창문의 경우는의 my.ini 파일 innodb_lock_wait_timeout했다
아난다

98

나를 위해이 솔루션이 작동하지 않아서 실행했습니다.

SET GLOBAL max_allowed_packet=1073741824;

내 SQL 클라이언트에서.

MYSql 서비스가 실행중인 상태에서이를 변경할 수 없으면 서비스를 중지하고 "my.ini"파일에서 변수를 변경해야합니다.

예를 들면 다음과 같습니다.

max_allowed_packet=20M

1
이것은 다른 인기있는 답변이 그렇지 않은 MAMP (OS X)에서 저에게 효과적이었습니다. 그러나 영구적입니까?
atwixtor

2
@atwixtor no, 서버를 다시 시작할 때까지 이와 같은 변수를 설정하십시오. 그런 다음 기본값으로 재설정됩니다.
d.raev

1
그것은 Windows의 테스트 XAMPP 시스템에서 트릭 php.ini을 수행했습니다 (응답에서 @GBD가 제안한대로) 파일과 MySQL 구성 파일 my.ini을 모두 수정해야 작동했습니다.
Gruber

2
나는 당신이 현재 크기를 확인할 수 있다고 덧붙이고 싶습니다SHOW variables LIKE 'max_allowed_packet'
Arth

서버가 다시 시작될 때 (결과적으로) 값이 재설정된다는 점에서 영구적 이지 않지만 현재 세션에만 적용되는 것은 아닙니다. max_allowed_packet한 클라이언트에서 설정 한 다음 .sql다른 세션에서 큰 파일 을 가져 오면 정상적으로 작동합니다.
VoteyDisciple

21

XAMPP에서 작업하는 경우 MySQL 서버에서 다음 변경 사항으로 인한 문제를 해결할 수 있습니다.

my.ini 파일을 엽니 다. my.ini 위치는 (D : \ xampp \ mysql \ bin \ my.ini)입니다.

다음 변수 값을 변경하십시오.

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

wamp를위한 samp, max_allowed_packet = 64M
Andrew

19

기본값으로 실행하는 경우 mysql 구성을 최적화 할 공간이 충분합니다.

내가 권장하는 첫 번째 단계는 max_allowed_packet을 128M으로 늘리는 것입니다.

그런 다음 MySQL Tuning Primer 스크립트를 다운로드하여 실행하십시오. 성능 향상을 위해 구성의 여러 측면에 권장 사항을 제공합니다.

또한 MySQL과 PHP에서 시간 초과 값을 조정하는 방법을 살펴보십시오.

가져 오는 파일의 크기 (파일 크기)는 어느 정도이며 PHPMyAdmin 대신 mysql 명령 줄 클라이언트를 사용하여 파일을 가져올 수 있습니까?


고마워, 나는 이미 max_allowed_packet을 16M으로 설정 한 다음이 질문을 발견하고 32M으로 올려서 충분하다고 생각했지만 대답을 보았고 128M이 확실히 작동하는 것을 보았습니다. * .sql 파일 내의 전체 SQL 문이 하나의 패킷으로 취급된다는 것을 수집하고 있습니까?
Elijah Lynn

8

OS X에서 MAMP를 사용하는 경우 max_allowed_packetMySQL 템플리트 에서 값 을 변경해야합니다 .

  1. 파일> 템플릿 편집> MySQL my.cnf 에서 찾을 수 있습니다.

  2. 그런 다음을 검색 max_allowed_packet하고 값을 변경하고 저장하십시오.


6

이 짧은 /etc/mysql/my.cnf 파일로 문제를 해결했습니다.

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
WAMP의 MySQL v5.6.12에서도 작동 함을 확인했습니다. Windows의 경우 위의 "wait_timeout"및 "max_allowed_packet"행을 다음의 [mysqld] 섹션에 추가하십시오. wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

감사합니다 @ 단 내 하하 문제를 해결 하하, 나는 섹션 아래에 해당 설정을 추가 한 적이 없습니다[mysqld]
shivgre

이것은 MySQL v5.7에서 작동합니다. my-default.ini는 기본적으로 생성되지 않으므로 만들어야합니다.
Rodolfo Velasco

5

이것이 발생할 수있는 다른 이유는 메모리가 부족하기 때문입니다. / var / log / messages를 확인하고 mysqld가 컴퓨터보다 많은 메모리를 할당하도록 my.cnf가 설정되어 있지 않은지 확인하십시오.

mysqld 프로세스는 실제로 커널에 의해 종료 된 후 "safe_mysqld"프로세스에 의해 다시 시작될 수 있습니다.

헤드 룸이 무엇인지 확인하기 위해 top을 사용하고 실행중인 메모리 할당을 확인하십시오.

my.cnf를 변경하기 전에 백업하십시오.


이것이 내 문제의 원인이었습니다. 1GB 스왑 파일을 추가하고 완전히 수정했습니다.
Pikamander2

5

16GB 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을 사용하는 경우이를 사용하여 이들 중 일부 또는 전부를 설정할 수도 있습니다.


2

"max_allowed_packet"을 1024M으로 업데이트했지만 여전히 작동하지 않습니다. 내 배포 스크립트가 실행 중이었습니다.

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

이 방법으로 명령 줄을 사용하는 경우 명령 줄에서 더 큰 숫자를 명시 적으로 지정하십시오.


2

데이터에 데이터가 포함 된 BLOB경우 :

커맨드 라인에서 데이터를 가져 오면 BLOB 데이터가 질식되어 'MySQL 서버가 사라졌습니다'라는 오류가 발생합니다.

이를 피하려면 다음 --hex-blob플래그를 사용하여 mysqldump를 다시 작성하십시오 .

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

다른 텍스트 사이에서 이진이 아닌 16 진 값으로 데이터 파일을 작성합니다.

PhpMyAdmin에는 "16 진수 표기법으로 이진 열 덤프 (예 :"abc "가 0x616263가 됨)"옵션도 있습니다.

GEOM열이 변환되지 않았 음 을 의미하는 버그 (2015 년 12 월 현재)가 있습니다. mysqldump를 사용하여 GEOMETRY 열이있는 테이블을 백업 하시겠습니까? 따라서 PhpMyAdmin과 같은 프로그램을 사용하는 것이 유일한 해결 방법 인 것 같습니다 (위에서 언급 한 옵션은 GEOM 열을 올바르게 변환합니다).


1

실패하는 데 시간이 오래 걸리면 wait_timeout변수 를 확대하십시오 .

즉시 실패하면 max_allowed_packet변수를 확대하십시오 . 여전히 작동하지 않으면 명령이 유효한 SQL인지 확인하십시오. 광산은 모든 것을 망쳐 놓은 따옴표를 이스케이프 처리했습니다.

또한 가능한 경우 단일 SQL 명령의 삽입 수를 1000으로 제한하십시오. n 개의 삽입마다 INSERT ... 부분을 다시 도입하여 단일 명령으로 여러 명령문을 작성하는 스크립트를 작성할 수 있습니다.


1

비슷한 오류가 발생했습니다.이 문제를 해결하려면 my.ini 파일을여십시오. 여기서 36 번 줄에서 최대 허용 패킷 크기 값을 변경하십시오. max_allowed_packet = 20M


1

systemd와 같은 서비스 관리자로 인해 mysqld 프로세스가 다시 시작되지 않도록하십시오.

나는 centos 7과 함께 유창 하게이 문제를 겪었습니다. 구성 조정은 도움이되지 않았습니다. 너무 많은 메모리를 사용할 때마다 mysqld 서비스를 종료시키는 것이 시스템화 된 것으로 나타났습니다.


0

데이터베이스를 복제 할 때 비슷한 오류가 발생했습니다 (MySQL 서버가 사라졌습니다 ...).하지만 mysql.server를 다시 시작하려고하면 오류가 발생했습니다.

ERROR! The server quit without updating PID ...

이것이 내가 해결 한 방법 : 응용 프로그램 / 유틸리티 /를 열고 활동 모니터를 실행했습니다.

 quit mysqld

그런 다음 오류 문제를 해결할 수있었습니다.

mysql.server restart

0

오랜 시간 동안 데이터를 많이 사용하기 위해 mysql 연결과 관련된 대규모 계산을 수행하고 있습니다. 나는이 "Mysql go away issue"에 직면했다. 그래서 쿼리를 최적화하지 않았지만 도움이되지 못했습니다. 기본적으로 mysql 변수 제한이 더 낮은 값으로 설정되었습니다.

wait_timeout max_allowed_packet

당신에게 맞는 것을 제한하려면 Any Number * 1024 (Bytes)가되어야합니다. ' mysql -u username-p '명령을 사용하여 터미널에 로그인 할 수 있으며 이러한 변수 제한을 확인하고 변경할 수 있습니다.


0

For GoDaddy 공유 호스팅

GoDaddy 공유 호스팅 계정에서 PHP.ini 등 파일을 조정하는 것은 까다 롭습니다. 그러나 다른 방법이 있으며 그것은 나를 위해 완벽하게 작동했습니다. (방금 3100 행과 145 열을 포함하는 3.8Mb .sql 텍스트 파일을 성공적으로 업로드했습니다. phpMyAdmin의 IMPORT 명령을 사용하여 겁에 질린 MySQL 서버에 오류가 발생하여 더 이상 정보가 없습니다.)

나는 Matt Butcher가 정답을 가지고 있음을 발견했다. Matt와 마찬가지로, MySQL 데이터베이스를 한 입 크기의 덩어리로 내보내는 것에서부터 큰 수입을 작은 것으로 나누는 스크립트 작성에 이르기까지 모든 종류의 트릭을 시도했습니다. 그러나 여기에 효과가 있습니다.

(1) CPANEL ---> 파일 (그룹) ---> 백업

(2a) "부분 백업"제목에서 ...
(2b) "MySQL 데이터베이스 백업 다운로드"에서
(2c) 데이터베이스를 선택하고 백업을 다운로드합니다 (이 단계는 선택이지만 현명합니다)

(3a) "MySQL 데이터베이스 백업 복원"이라는 제목 아래 2b의 바로 오른쪽에 있습니다.
(3b) 로컬 드라이브에서 .SQL 가져 오기 파일을 선택하십시오.
(3c) 진정한 행복은 당신입니다. 5 초

이 방법을 사용하여 단일 테이블을 가져올 수있었습니다. 내 데이터베이스의 다른 것은 영향을받지 않았습니다. 그러나 위의 2 단계는 보호 대상입니다.

주의 사항 :
가. .SQL 가져 오기 파일을 작성하는 방법을 잘 모르면 phpMyAdmin을 사용하여 테이블을 내보내고 해당 파일 구조를 수정하십시오.

출처 : Matt Butcher 2010 기사


좋아, 즉각적인 하향 조정이지만 그 이유에 대해서는 아무런 언급이 없습니다. 이 정보가 다른 사람에게는 효과가 없었습니까? 그렇다면 공유하십시오-그것이 효과가 있었기 때문에이 답변을 추가했습니다. 위의 다른 답변은 저에게 효과가 없었지만이 솔루션은 효과가 없었습니다. 그럼 왜 공감 율이? GoDaddy를 사용하는데 이것이 효과가없는 경우, 도움을 드릴 수 있도록 알고 싶습니다. 당신이 공유 호스팅에서 GoDaddy를 사용하지 않는 경우는 적용되지 않습니다 단지 때문에, 당신은 왜이 대답을 downvote 것입니다 당신에게 ?
cssyphus

0

증가하면 max_allowed_packet도움이되지 않습니다.

.sqlSequel Pro를 통해 파일을 데이터베이스로 가져올 때와 같은 오류가 발생했습니다 .

max_allowed_packetto를 올린 후에도 오류가 계속 발생 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 덤프는 함께 연결 한 다음 압축을 풀어야하는 두 개의 zip 파일로 제공됩니다. 압축 해제는 처음에 중단되어 파일에 이상한 문자와 인코딩이 남아 있다고 생각합니다. 새로운 MySQL 덤프를 가져 와서 압축을 풀면 제대로 작동했습니다.

다른 사람들이 max_allowed_packet변수 를 늘리는 것이 도움이되지 않는다는 것을 알기 위해 여기에 이것을 추가하고 싶었습니다 .



0

나는 같은 문제가있다

$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);

phpmyadmin의 \ xampp \ mysql \ bin \ my.ini 파일에는

[mysqldump]
max_allowed_packet=110M

이것은 단지 mysqldump -u root -p dbname입니다. 위의 코드를 다음으로 바꾸어 문제를 해결했습니다.

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.