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
'source' 카테고리의 다른 글
엔티티 프레임워크가 복합 키(Oracle)를 사용하여 테이블의 데이터를 업데이트할 수 없음 (0) | 2023.09.27 |
---|---|
jQuery에서 symbol $의 의미는 무엇입니까? (0) | 2023.09.27 |
파워셸의 배열에 요소를 추가하는 방법? (0) | 2023.09.17 |
키보드 이벤트를 생성하는 방법? (0) | 2023.09.17 |
glibc의 감가상각 __malloc_hook 기능에 대한 대안 (0) | 2023.09.17 |