programing

MySQL이 허용된 제한보다 짧은 쿼리로 max_allowed_packet 위반에 대해 불만을 제기함

bestcode 2022. 9. 24. 12:43
반응형

MySQL이 허용된 제한보다 짧은 쿼리로 max_allowed_packet 위반에 대해 불만을 제기함

다중 삽입 쿼리를 실행하면 "SQLSTATE[08S01]:통신 링크 장애: 1153 'max_allowed_packet' 바이트보다 큰 패킷을 받았습니다.여러 개의 삽입 쿼리를 구성하여 제한을 철저히 확인하는 복잡한 클래스가 있기 때문에 매우 이상하지만, 우리는 모두 인간이기 때문에 문제를 찾으려는 몇 가지 시도 후 예외 세부 정보를 기록했을 뿐이며, 무엇이 진행 중인지 알 수 없습니다.코드(PHP 7.4, PDO, MariaDB 10.5.10):

        $this->pdoInstance = sql_get_connect($this->connection);

        $stmt = $this->pdoInstance->query("show variables like 'max_allowed_packet'");
        $d = sql_fetch($stmt);
        $stmt->closeCursor();
        $this->max_size = (int) $d['Value'];
...
        try {
            $stmt = $this->pdoInstance->query($query);
        } catch (CDbException $e) {
            if (strpos($e->getMessage(), 'max_allowed_packet') !== false) {
                log ([
                    'total_size' => strlen($query),
                    'max_size' => $this->max_size,
                ];
            }
            throw $e;
        }

그리고 내가 얻는 것은:

total_size => 33554425
max_size => 33554432

그래서 보내는 쿼리는 실제로 제한치보다 7바이트 적습니다.하지만 문제는 안정적으로 재현되고 있습니다.뭐가 원인이죠?아마도 쿼리나 다른 것과 함께 보낸 헤더가 있을 것입니다만, 그 사이즈는 어떻게 확인할 수 있을까요?MySQL에서도 MariaDB 문서에서도 찾을 수 없었습니다.

strlen()는 1자가 1바이트라고 가정하기 때문에 멀티바이트 문자를 올바르게 처리하지 않습니다.이것은 단순히 Unicode에서는 무효입니다.

사용해보십시오.mb_strlen()대신 기능합니다(mb는 멀티바이트를 나타냅니다).

음, 문제는 아주 간단해 보였어요.PDO 쿼리 실행을 방해하는 PHP Extension이 앱 서버에 설치되어 있으며, 여기에 특별한 설명을 추가합니다.복잡한 침입 탐지 시스템의 일부이지만 쿼리 길이에 영향을 미친다는 것은 문서화되어 있지 않습니다.이제 알았습니다.

방해해서 미안하고 도와주려고 한 모두에게 고마워!

언급URL : https://stackoverflow.com/questions/69289264/mysql-complains-about-max-allowed-packet-violation-with-query-shorter-than-the-a

반응형