티스토리 뷰

Packets larger than max_allowed_packet are not allowed


Packets larger than "max_allowed_packet" are not allowed

쿼리 길이가 최대 길이 제한보다 큰 조건에서 MySql.Data.DLL에 의해 발생하는 예외 메시지 (오류) 중 하나입니다.


이 SQL 쿼리를 예로 들어 보겠습니다.

SELECT * FROM member;

쿼리의 길이가 매우 길어지는 경우가 있습니다. 예를 들어, LONGBLOB 또는 LONGTEXT를 삽입하거나 여러 INSERT를 결합합니다. 예 :


INSERT INTO member(code,name,age) values
('A1','John',30),('B1','Smith',32),('C1','Adam',31),
('D1','Cane',28),('E1','Irene',25),('F1','Boo',21);

위의 쿼리는 테이블에 6 개의 행 (144 자)을 여전히 짧은 것으로 간주하지만 많은 양의 INSERT를 단일 쿼리로 결합하면 길이 제한에 도달 할 수 있습니다.이 길이는 max_allowed_packet입니다.


단일 SQL 쿼리의 기본 최대 길이는 1MB (1024 x 1024)입니다.


다음 세 가지 방법으로이 문제를 해결할 수 있습니다.


첫 번째 방법 : 제한을 수정하기 위해 SQL 쿼리 / 문 실행

길이 제한을 32MB로 설정하십시오.

SET GLOBAL max_allowed_packet=32*1024*1024;

또는 SET SESSION

SET SESSION max_allowed_packet=1024*1024*1024; 

당신이 알아야 할 것 :


MySQL 서버에 연결하는 데 사용한 USER는 GLOBAL 변수를 수정할 수있는 권한 (관리 권한)이 있어야합니다.

SET GLOBAL은 현재 연결이 아닌 새 연결에 적용됩니다.

SET SESSION은 현재 연결에 적용됩니다.

MySQL 서버를 다시 시작하면 변경 사항이 재설정됩니다.

SET GLOBAL을 사용하여 max_allowed_packet을 수정하는 샘플 C # 코드 :


using (MySqlConnection conn = new MySqlConnection(connectionString))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        conn.Open();

        cmd.CommandText = "SET GLOBAL max_allowed_packet=32*1024*1024;";
        cmd.ExecuteNonQuery();

        // Close and Reopen the Connection
        conn.Close();
        conn.Open();

        // Start to take effect here...
        // Do something....

        conn.Close();
    }
}


두 번째 방법 : my.ini 옵션 파일 수정

1. MySQL 서버를 중지하십시오.

2. 서버상의 MySQL 옵션 파일 열기 - my.ini, mysqld 섹션 아래에 다음 줄을 추가한다 :

max_allowed_packet=32M

3. MySQL 서버를 다시 시작하십시오.

4. 이렇게하면 모든 연결에 대해 max_allowed_packet 영구 값이 변경됩니다.

5. MySQL 공식 문서 : http://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html


세 번째 방법은 MySqlBackup.ExportInfo에 MaxSqlLength를 설정하는 것입니다.


MySQL에서 max_allowed_packet을 수정할 수있는 권한이 없거나 권한이없는 경우 MySqlBackup.NET이 생성 될 단일 SQL 결합 덤프 쿼리의 최대 길이 제한을 설정해야합니다.


예 : 최대 길이를 1MB로 제한 :

using (MySqlConnection conn = new MySqlConnection(constring))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        using (MySqlBackup mb = new MySqlBackup(cmd))
        {
            cmd.Connection = conn;
            conn.Open();
            mb.ExportInfo.MaxSqlLength = 1024 * 1024; // 1MB
            mb.ExportToFile(file);
        }
    }
}


주 : 테이블에 큰 데이터 길이 데이터 유형이있는 컬럼이 들어있는 경우 (예 : MEDIUMTEXT, LONGTEXT, MEDIUMBLOB, LONGBLOB). 위 코드를 사용하여 덤프 파일을 가져 오지 못할 수도 있습니다. 이는 MySQL 서버가 기본 max_allowed_packet보다 큰 SQL 길이를 차단했기 때문입니다.


특정 MySQL 서버가 허용하는 기본 제한 / 최대 길이는 어떻게 알 수 있습니까?

다음 쿼리를 실행하여

show variables like 'max_allowed_packet';

누가 max_allowed_packet의 값을 정의합니까?

MySQL 서버의 소유자 또는 관리자.

댓글
최근에 달린 댓글
글 보관함
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Total
Today
Yesterday
    뽀로로친구에디
    최근에 올라온 글