MySQL 쿼리가 계속 실행되는 동안 클라이언트 시간이 초과됩니까?


9

우리는 MySQL 워크 벤치를 통해 실행되는 읽기 전용 쿼리가 사용자의 UI 관점에서 시간 초과되어 중단 될 때까지 서버에서 계속 실행되고 있으며 더 많은 리소스를 소비하는 문제가 발생했습니다.

질문

  • MySQL에서 이러한 종류의 문제를 처리하는 표준 방법이 있습니까?
  • 피해야 할 근본적인 원인이 있습니까?

답변:


11

시간 종료를 위해 어떤 기본값이 있는지 확인해야합니다.

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

일반적으로 몇 가지 시간 초과 변수를 감시합니다. DB 서버의 MySQL에 접속하는 앱 서버의 MySQL Workbench, mysql 클라이언트 또는 PHP 앱에서 MySQL을 원격으로 사용하는 경우 매우 중요합니다.

다음은 MySQL 설명서에서 설정 중 하나입니다.

  • wait_timeout (기본값 28800 [8 hours]) : 서버가 비 대화식 연결에서 활동을 대기하기 전에 대기하는 시간 (초)입니다. 이 시간 종료는 TCP / IP 및 Unix 소켓 파일 연결에만 적용되며 명명 된 파이프 또는 공유 메모리를 사용하여 작성된 연결에는 적용되지 않습니다. 스레드 시작시 세션 유형 wait_timeout 값은 클라이언트 유형에 따라 전역 wait_timeout 값 또는 전역 interactive_timeout 값에서 초기화됩니다 (CLIENT_INTERACTIVE 연결 옵션으로 mysql_real_connect ()에 정의 됨). interactive_timeout도 참조하십시오.
  • interactive_timeout (기본값 28800 [8 hours]) : 서버가 대화 형 연결을 닫기 전에 활동을 대기하는 시간 (초)입니다. 대화식 클라이언트는 CLIENT_INTERACTIVE 옵션을 mysql_real_connect ()에 사용하는 클라이언트로 정의됩니다. wait_timeout도 참조하십시오.
  • net_read_timeout (기본값 30) : 읽기를 중단하기 전에 연결에서 더 많은 데이터를 기다리는 시간 (초)입니다. 서버가 클라이언트에서 읽을 때 net_read_timeout은 중단시기를 제어하는 ​​시간 초과 값입니다. 서버가 클라이언트에 쓸 때 net_write_timeout은 중단시기를 제어하는 ​​시간 초과 값입니다. slave_net_timeout도 참조하십시오.
  • net_write_timeout (기본값 60) : 쓰기를 중단하기 전에 연결에 블록이 기록되기를 기다리는 시간 (초)입니다. net_read_timeout도 참조하십시오.

다음 시간을 포함하여 매우 오래 실행될 수있는 쿼리를 수용 할 수 있도록 이러한 시간 초과를 높게 설정하십시오.

  • 질량 UPDATEs
  • 질량 DELETEs
  • ENABLE KEYS 큰 MyISAM에

연락이 끊긴 후에도 계속 실행되는 쿼리를 처리하려면 장기 실행 쿼리의 프로세스 ID에 대해 KILL 을 실행해야합니다. KILL 명령을 사용하더라도 디스크를 많이 사용하는 단계 중이거나 내부 뮤텍스가 진행중인 쿼리를 기다려야합니다.


오랫동안 실행 된 프로세스에 대해 KILL을 실행하는 표준적이고 강력한 방법이 있습니까, 아니면 일반적으로 bash 스크립트 / 크론 작업을 통해 수행됩니까?
asthasr

실제로 2011 년 5 월에 information_schema를 사용하여 여러 DB 연결을 종료하는 스크립트를 시작하는 방법에 대한 게시물을 작성했습니다. dba.stackexchange.com/a/2637/877
RolandoMySQLDBA

"매우 업데이트를 포함 할 수있는 매우 오랜 시간 동안 실행될 수있는 쿼리를 수용 할 수 있도록 이러한 시간 초과를 높게 설정하십시오."예 : php + mysql 테이블 열에서 모든 레코드를 선택해야합니다. 그런 다음 뭔가를 수행 한 다음 다른 레코드를 새 값으로 업데이트하십시오. 이 스크립트에는 약 5 분 이상이 필요합니다. 처음에는 하나의 SELECT와 끝에는 하나의 UPDATE, 행을 가져 와서 중간에 수행하십시오. 이 상황에서 wait_timeout을 어떻게해야하는지 설명 할 수 있습니까? 정말 무료 자원 아웃 (wait_timeout)의 안전한 값 무슨 ... 나에게 분명하지 않다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.