MySQL 로그에서 "잠금 대기 시간 초과" 오류가 발생하면 트랜잭션이 대기 중임을 나타냅니다. 데이터베이스 항목에 대한 잠금입니다. 어떤 쿼리가 데이터베이스에 액세스하려고 시도하는지 알 수는 있지만 정확한 순간에 잠금을 유지하는 쿼리를 결정하는 것은 어려울 수 있습니다.
"트랜잭션"이라는 단어의 존재 오류 메시지는 문제가 있는 쿼리에 하나 이상의 InnoDB 테이블에서 하나 이상의 행을 수정하는 것이 포함되어 있음을 나타냅니다. 오류를 일으키는 쿼리에 액세스할 수 있으므로 액세스 중인 테이블이 잠재적인 원인인지 확인할 수 있습니다.
자세히 조사하려면 다음을 실행하세요. 명령:
SHOW ENGINE INNODB STATUS\G
이것은 잠금 및 뮤텍스에 대한 정보를 제공합니다. 포함:
예를 들어 클라이언트의 다음 출력은 문제를 보여줍니다.
Type: InnoDB Name: Status: ===================================== 110514 19:44:14 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- Mutex spin waits 0, rounds 11487096053, OS waits 7756855 RW-shared spins 722142, OS waits 211221; RW-excl spins 787046, OS waits 39353 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 110507 21:41:35 Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1 MySQL thread id 3686635, query id 124164167 10.64.89.145 viget updating DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' ) ...
이 출력에는 "file" 테이블이 나타납니다. DELETE 쿼리가 해당 테이블의 행을 수정하려고 시도하므로 영향을 받는 테이블이 됩니다. 출력을 분석하면 잠금 경합을 일으키는 특정 테이블을 정확히 찾아낼 수 있습니다.
향후 이러한 오류가 발생하지 않도록 하려면 잠금 대기 시간 초과를 늘리는 것이 좋습니다. innodb_lock_wait_timeout 매개변수를 설정하여 InnoDB의 값을 설정합니다. 기본값은 50초입니다.
시간 초과를 영구적으로 늘리려면 /etc/my.cnf 파일에 다음 줄을 추가하세요.
[mysqld] innodb_lock_wait_timeout=120
또는 시간 초과를 임시로 조정할 수도 있습니다. 현재 세션 내에서:
SET innodb_lock_wait_timeout = 120;
시간 초과를 늘리면 대기 중인 트랜잭션에 잠금을 획득하는 데 더 많은 시간이 부여됩니다. 시간 초과 오류 가능성을 줄입니다.
위 내용은 MySQL의 '잠금 대기 시간 초과' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!