트래픽이 보통 인 Drupal 7의 max_allowed_packet에 대한 합리적인 값은 무엇입니까?


12

드루팔 7 사이트에서이 변수에 대한 볼 파크 번호를 알아야합니다. 최근에 "drupal"PDOException : SQLSTATE [08S01] : Communication link failure : 1153 "오류가 발생했습니다. mysql을 처음 사용하고 공유 호스팅을 사용하고 있습니다. 관리자에게 요청 해주세요.

미리 감사드립니다.


1
내 대답은 이것에 대한 나의 경험을 보여 주지만 dba.stackexchange.com에서 MySQL을 유지하는 사람들로부터 더 나은 응답을 얻을 수 있습니다.
mpdonadio

답변:


12

가장 큰 BLOB에 관한 질문에 대한 흥미로운 답변을 보았습니다. 다음은 ServerFault에서 확인한 내용입니다. innodb_log_file_size 및 innodb_log_buffer_size 결합은 큰 객체가 많은 경우 가장 큰 BLOB 객체의 10 배보다 커야합니다 .

Nils-Anders Nøttseter의 ServerFault 게시물을 기반으로 테이블을 쿼리하고 가장 큰 BLOB를 찾아 해당 숫자에 11 이상을 곱한 다음 max_allowed_packet 으로 사용하십시오 .

max_allowed 패킷의 크기를 조정하여 문제를 해결할 수있는 또 다른 질문을 제기 한 것은 재미있는 일입니다 .

경고

에 따르면

TheBookImage

다음은 MySQL 패킷에 대한 내용입니다.

MySQL 네트워크 통신 코드는 쿼리가 항상 합리적으로 짧다는 가정하에 작성되었으므로 서버에서 하나의 청크로 서버로 보내고 처리 할 수 ​​있습니다 .이를 MySQL 용어 로 패킷 이라고합니다 . 서버는 패킷을 저장하기 위해 임시 버퍼를위한 메모리를 할당하고이를 완전히 맞추기에 충분한 요청을합니다. 이 아키텍처는 서버에 메모리가 부족하지 않도록주의해야합니다.이 옵션은 패킷 크기를 제한합니다.

이 옵션과 관련하여 관심있는 코드는 sql / net_serv.cc에 있습니다. 한 번 봐 가지고 my_net_read ()를 , 다음의 호출에 따라 my_real_read을 () 와에 특히주의 ) (net_realloc .

이 변수는 또한 많은 문자열 기능의 결과 길이를 제한합니다. 자세한 내용은 sql / field.ccsql / intem_strfunc.cc 를 참조하십시오.

MySQL 패킷에 대해이 사실을 알면 DBA는 크기가 크더라도 하나의 MySQL 패킷 내에 여러 BLOB를 수용 할 수 있도록 크기를 조정할 수 있습니다.

상황에 따라 데이터베이스에서 가장 큰 BLOB가 무엇인지, 그 숫자를 11로 곱한 다음 max_allowed_packet 을 해당 숫자로 설정해야합니다 . mysql을 다시 시작하지 않고 서버에 설정할 수 있어야합니다 (개인적으로는이 포럼의 범위를 벗어난 마이그레이션 및 복제와 관련된 다른 문제를 해결하기 때문에 256M으로 설정합니다). 들어오는 모든 연결에 대해 데이터베이스에 256M으로 설정하려면 다음을 실행하십시오.

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

그런 다음 [mysqld]섹션 아래의 my.cnf에이 설정을 추가 하십시오.

[mysqld]
max_allowed_packet = 256M

최대 허용 패킷이 삽입 문의 크기에도 영향을 미치지 않습니까?
Buttle Butkus

@ButtleButkus 물론입니다. 이것이 더 큰 MySQL 패킷이 INSERT에 적합한 이유입니다. max_allowed_packet의 최대 크기는 1G입니다. max_allowed_packet을 256M으로 설정해도 256M을 미리 할당하지 않습니다. dev.mysql.com/doc/refman/5.6/en/… 에 따르면 mysqld는 net_buffer_length가 초기 MySQL 패킷 크기 인 것을 할당합니다. 패킷은 max_allowed_packet에서 설정 한 크기로 점차 커집니다. 따라서 큰 max_allowed_packet을 설정해도됩니다. INSERT는 당신을 사랑합니다.
RolandoMySQLDBA

우리는 32G RAM을 가진 몇 대의 머신을 가지고 있지만 그 크기에 가까운 것을 설정하지 않았습니다. 그러나 응용 프로그램이 숨어 들었고 기본값 (1M?)에서 32M으로 늘리면 효과가 있습니다. 아마 아프지 않을 경우 더 늘릴 것입니다. 그러나 응용 프로그램에서 max_allowed_packet을 확인하고 인서트를 청크로 분할하여 제한을 초과하지 않도록해야합니까? 그 접근법의 단점은 무엇입니까? 아마도 그 질문을 dba 스택 사이트에 게시해야합니다.
Buttle Butkus

왜 11을 곱해야하는지 좀 더 자세히 설명해 주시겠습니까? 링크 된 게시물은 innodb 버퍼에 관한 것입니다-패킷 크기와 어떤 관련이 있습니까?
SystemParadox

4

Drupal의 데이터베이스 서버 요구 사항 페이지 에서 가져온 것 :

시스템 변수 max_allowed_packet을 16M 이상으로 설정해야 할 수도 있습니다. 일부 저렴한 호스팅 계획은이 값을 너무 낮게 설정합니다 (MySQL 기본값은 1M에 불과 함). 이 경우 더 나은 호스팅 계획을 선택해야 할 수도 있습니다. Drupal 5에는 1M의 값으로 충분할 수 있습니다.

공유 호스팅 사이트에 적합합니다.


1
와!! Drupal 서버 요구 사항은 공식적으로 16M이라고 말합니다! 나는 그것을 전혀 몰랐다. 다음에 염두에 두십시오. 이 정보를 공유해 주셔서 감사합니다. 최선의 답변으로 표시 할 수 있기를 바랍니다.
shivams

2

설정하기가 약간 까다로울 수 있습니다 max_allowed_packet. 그 값을 계산하는 방법을 아직 찾지 못했습니다. 일반적으로 {cache}테이블의 행을 포함하는 데이터베이스 스냅 샷을 복원하려고 할 때 문제가 발생합니다 .

이 문제가 발생하면 4M에서 8M 사이의 값을 선택합니다. 나는 그 값이 멈출 때까지 계속 부딪칩니다. 그러나 공유 호스트 가이 값을 변경하는지 여부는 알 수 없습니다.

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