max_allowed_packet은 충분히 크며 왜 변경해야합니까?


14

master-slave 설정에 MySQL (5.5)이 있고 다른 슬레이브 서버를 만들었습니다.

원래 슬레이브를 중지하고 데이터를 덤프하고 복사하여 다시 가져 와서 제대로 작동했습니다. 원래 슬레이브의 master_log pos를 기록하고이 명령을 사용하여 새 슬레이브에 설정했습니다.

CHANGE MASTER TO MASTER_HOST='<ipaddress>', 
MASTER_USER='<username>', MASTER_PASSWORD='<password>', 
MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000851', 
MASTER_LOG_POS=15824150, 
MASTER_CONNECT_RETRY=10;

새로운 노예를 시작했을 때

Last_IO_Error : 이진 로그에서 데이터를 읽을 때 마스터에서 치명적인 오류 1236이 발생했습니다. '로그 이벤트 항목이 max_allowed_packet을 초과했습니다. 마스터에서 max_allowed_packet 증가

그러나 원래 슬레이브를 시작했을 때 잘 잡히고 동기화되었습니다.

따라서 질문 :

  • 현재 가치는 16M입니다. 얼마나 큰지 어떻게 알 수 있습니까? (생산 서버의 시행 착오를 피하는 것이 좋습니다).

  • 원래 슬레이브가 제대로 처리되면 마스터에서 값을 늘려야하는 이유는 무엇입니까? 새 슬레이브에 문제가있을 수 있습니까?

최신 정보

Rolando가 마스터, 이전 슬레이브 및 새 슬레이브에서 제안한대로 max_allowed_packet을 1073741824로 늘렸다가 다시 시작했습니다 ( SET GLOBAL max_allowed_packet = 1073741824;어떤 이유로는 걸리지 않는 것 같습니다).

이제 마지막 IO 오류는 이전과 동일하지만 이제는

Last_SQL_Error : 릴레이 로그 읽기 실패 : 릴레이 로그 이벤트 항목을 구문 분석 할 수 없습니다. 가능한 원인은 다음과 같습니다. 마스터의 이진 로그가 손상되었습니다 (이진 로그에서 'mysqlbinlog'를 실행하여이를 확인할 수 있음), 슬레이브의 릴레이 로그가 손상되었습니다 (중계 로그에서 'mysqlbinlog'를 실행하여이를 확인할 수 있음), a 네트워크 문제 또는 마스터 또는 슬레이브 MySQL 코드의 버그. 마스터의 이진 로그 또는 슬레이브의 릴레이 로그를 확인하려면이 슬레이브에서 'SHOW SLAVE STATUS'를 발행하여 해당 이름을 알 수 있습니다.

마스터 파일에서 mysqlbinlog를 수행하면 오랫동안 행복하게 명령을 사용하여 과거로 스크롤합니다. 파일은 722M입니다-슬레이브 릴레이 로그에 대해 수행하면

오류 : Log_event :: read_log_event () 오류 : 'Sanity check failed', data_len : 38916267, event_type : 69

오류 : 오프셋 253에서 항목을 읽을 수 없습니다 : 로그 형식 오류 또는 읽기 오류.

변수를 확인했지만 변경 사항이 작동했습니다.

mysql> 변수 표시 LIKE '% max_allowed_packet %';

새로운 노예에서 max_allowed_packet그리고 slave_max_allowed_packet마스터 와 마찬가지로 그것이 가지고있는 곳을 보여주었습니다.max_allowed_packet

그래서 마스터에서 버전을 확인했습니다.

mysql> show variables LIKE '%version%';
+-------------------------+--------------------------------------+
| Variable_name           | Value                                |
+-------------------------+--------------------------------------+
| innodb_version          | 1.1.6                                |
| protocol_version        | 10                                   |
| slave_type_conversions  |                                      |
| version                 | 5.5.11-log                           |
| version_comment         | MySQL Community Server (GPL) by Remi |
| version_compile_machine | x86_64                               |
| version_compile_os      | Linux                                |
+-------------------------+--------------------------------------+

그리고 새로운 노예에

mysql> show variables LIKE '%version%';
+-------------------------+--------------------------------------+
| Variable_name           | Value                                |
+-------------------------+--------------------------------------+
| innodb_version          | 5.5.32                               |
| protocol_version        | 10                                   |
| slave_type_conversions  |                                      |
| version                 | 5.5.32-log                           |
| version_comment         | MySQL Community Server (GPL) by Remi |
| version_compile_machine | x86_64                               |
| version_compile_os      | Linux                                |
+-------------------------+--------------------------------------+

이 두 버전이 너무 멀리 떨어져 있습니까?


여기서 흥미로운 점이 있습니다 . 이것이 도움이되기를 바랍니다.
Sathish D

답변:


18

max_allowed_packet를 1G로 제한해도 됩니다. MySQL 패킷이 구성 될 때마다 처음부터 1G로 이동하지 않습니다. 왜?

먼저 MySQL 패킷이 무엇인지 알아야합니다. 이 책의 99면

MySQL 내부 이해

단락 1-3에서 다음과 같이 설명합니다.

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

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

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

다음의 MySQL 설명서와 비교하십시오 max_allowed_packet.

하나의 패킷 또는 생성 / 중간 문자열 또는 mysql_stmt_send_long_data () C API 함수가 전송 한 매개 변수의 최대 크기입니다. 기본값은 MySQL 5.6.6에서 4MB이며 그 이전의 1MB입니다.

패킷 메시지 버퍼는 net_buffer_length 바이트로 초기화되지만 필요한 경우 max_allowed_packet 바이트까지 커질 수 있습니다. 큰 (아마도 잘못된) 패킷을 포착하기 위해이 값은 기본적으로 작습니다.

큰 BLOB 열 또는 긴 문자열을 사용하는 경우이 값을 늘려야합니다. 사용하려는 가장 큰 BLOB만큼 커야합니다. max_allowed_packet의 프로토콜 제한은 1GB입니다. 값은 1024의 배수 여야합니다. 비 멀티플은 가장 가까운 배수로 내림됩니다.

max_allowed_packet 변수의 값을 변경하여 메시지 버퍼 크기를 변경할 때 클라이언트 프로그램이 허용하는 경우 클라이언트 측의 버퍼 크기도 변경해야합니다. 클라이언트 측에서 max_allowed_packet의 기본값은 1GB입니다. mysql 및 mysqldump와 같은 일부 프로그램을 사용하면 명령 줄 또는 옵션 파일에서 max_allowed_packet을 설정하여 클라이언트 측 값을 변경할 수 있습니다.

이 정보가 제공되면 MySQL이 필요에 따라 MySQL 패킷을 확장 및 축소하게되어 기쁩니다. 따라서 계속

마스터와 슬레이브는 데이터를 전송하는 사람, 특히 BLOB 데이터와 관련하여 일치해야합니다.

업데이트 2013-07-04 07:03 EDT

릴레이 로그에 관한 메시지에서 다음과 같이 보입니다.

  • 손상된 릴레이 로그
  • 좋은 마스터 로그

암시

SHOW SLAVE STATUS\G
STOP SLAVE;
CHANGE MASTER TO
MASTER_LOG_FILE='(Relay_Master_Log_File from SHOW SLAVE STATUS\G)',
MASTER_LOG_POS=(Exec_Master_Log_Pos from SHOW SLAVE STATUS\G);
START SLAVE;

실행 CHANGE MASTER TO하면 모든 릴레이 로그가 지워지고 새 릴레이 로그가 시작됩니다. 슬레이브에서 실행 된 마지막 마스터 BinLog 이벤트 (BinLog, Position)에서 복제됩니다.

시도 해봐 !!!


감사합니다. 안전합니다. 그러나 현재 값이 마스터와 완벽하게 작동하는 다른 슬레이브와 일치 할 때 왜 왜 변경해야합니까?
CodeMonkey

다른 일이 일어나고 있습니다. 자세한 내용을 추가했습니다
CodeMonkey

1
귀하의 정보를 위해서만 : 이것은 복제 프로세스를 재설정하고 실수로 잘못된 MASTER_LOG_FILE이름을 입력했을 때 발생했습니다 . 예를 들어 에서 에서 mysql-bin.000001사용해야했을 때 사용 됩니다 . mysql-bin.000003SHOW MASTER STATUSCHANGE MASTER TO
Mikko Ohtamaa

8

오히려 당황스럽게도 문제는 로그의 파일 이름이 잘못되어 이상한 결과가 발생하고 올바른 파일 이름으로 다시 가져 왔으며 모든 것이 부끄러운 일이었습니다.


고마워요! 당신은이 실수를하는 유일한 사람이 아니 었습니다.
Mikko Ohtamaa

3
어리석은 경우에도 항상 답변을 게시 할 가치가 있습니다. 우리 모두 인간이기 때문에 누구나 바보 같은 실수를합니다. 로봇 인 우리를 제외하고.
존 헌트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.