source

mysqli_sql_exception에 '해당 파일 또는 디렉터리 없음' 메시지가 표시됨

manysource 2023. 9. 17. 13:19

mysqli_sql_exception에 '해당 파일 또는 디렉터리 없음' 메시지가 표시됨

이 오류는 'localhost'(잘못된 소켓 경로로 변환됨)를 사용하여 연결을 열려고 시도한 모든 사용자에게 친숙하지만...

TCP 연결에서 임의로 이 예외를 발생시킬 수 있는 것은 무엇입니까?

(간편화된) 스택 추적은 다음과 같습니다.

Uncaught exception 'mysqli_sql_exception'
With message 'No such file or directory' in /var/www/mysite/DB.php:88

#0 [internal function]: mysqli->real_connect()
#1 /var/www/mysite/DB.php(88): mysqli->query('SELECT * FR...')
#2 /var/www/mysite/OtherClass.php(668): DB::query('SELECT * FR...')

이것은 겉보기에는 임의의 시간에 동일한 mysqli 개체/연결로 여러 개의 다른 유사한 쿼리를 성공적으로 만든 후에 발생합니다.

이런 일이 일어나면,mysqli개체에는 다음과 같은 정보가 포함되어 있습니다. 이 정보 중 일부는 이전에 성공한 것으로 분명하게 남아 있습니다.mysqli->query()호출(영향을 받는_행 등):

'affected_rows' => 14,
'client_info' => 'mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $'
'client_version' => 50011
'connect_errno' => 2002
'connect_error' => 'No such file or directory'
'errno' => 0
'error' => ''
'error_list' => array ()
'field_count' => 3
'host_info' => '192.168.114.23 via TCP/IP'
'info' => NULL
'insert_id' => 0
'server_info' => '5.5.5-10.1.48-MariaDB'
'server_version' => 50505
'stat' => 'Uptime: 27634  Threads: 1075  Questions: 515109918  
           Slow queries: 92168  Opens: 601885  Flush tables: 1  
           Open tables: 2000  Queries per second avg: 18640.439'
sqlstate' => '00000'
protocol_version' => 10
thread_id' => 4057839
warning_count' => 0               

이것은 systemd 아래의 CLI 모드(daemon)에서 실행되는 PHP 5.6.40 + mysqlnd와 서버당 1K에서 3K 세션으로 중간 부하에서 실행되는 mariadb 클러스터(4 서버)에서 발생합니다.

이는 동일한 서버에 대해 다른 mysqli 개체/연결이 열려 있는 스크립트에서 발생하지만, 그것이 어떻게 문제가 될 것인지 알 수 없습니다.연결이 영구(p:...) 모드가 아닙니다.

연결이 서로 다른 자격 증명을 사용하고 있으며 장애가 발생한 자격 증명은 사용하고 있습니다.SET SESSION binlog_format = 'ROW'첫 번째 질문으로, 그것이 어떻게 이것을 설명할 수 있는지 확실하지 않습니다.

TCP mysql 연결의 맥락에서 오류는 저를 완전히 당황스럽게 합니다.

EDIT: 두 세션에 동일한 자격 증명과 binlog_format을 사용해도 문제가 해결되지 않습니다.

연결을 설정하는 코드는 다음과 같습니다(두 싱글레톤 모두 기본적으로 동일합니다).

private static function connect()
{
    self::$conn = new mysqli('192.168.144.23', 'web', 'secret', 'products', 3306);
    self::$conn->query("SET SESSION binlog_format = 'ROW'");
    self::$conn->query('SET CHARACTER SET utf8, character_set_connection = utf8');
}

쿼리를 만드는 코드는 동일하게 표준입니다.

public static function query($query)
{
    if(self::$conn === null) {
        self::connect();
    }

    return $result = self::$conn->query($query)->fetch_all()
}

주 데몬 코드에서 두 개의 싱글턴은 교대로 사용되며, 사용 순서는 데이터에 따라 달라집니다.

while($processingLongListOfTasks) {
   ...
   if($someChangingCondition) {
     // exception after a few loops
     $results[] = DB::query("SELECT * FROM `table1`");
   }
   ...
   if($someOtherChangingCondition) {
     $results[] = OtherDB::query("SELECT * FROM `table2`");
   }
   ...
}

언급URL : https://stackoverflow.com/questions/66268251/mysqli-sql-exception-with-message-no-such-file-or-directory