MySQL에서 쿼리 타임아웃을 설정하려면?
MySQL에서 쿼리를 실행하다 보면, 클라이언트쪽이 아니라 서버쪽에서 실행시간을 제어하고 싶을 때가 있다. 너무 실행시간이 길어지는 경우 kill을 하면 좋겠지만, 클라이언트와 서버간 중간 커넥션이 끊어지면 트래킹하기도 어렵다. 만약, 조건(?)만 만족한다면 다음의 옵션을 검토해 보자.
사용 옵션 - MAX_EXECUTION_TIME(n)
제목에도 썼듯이, 사용할 옵션은 MAX_EXECUTION_TIME이다. 환경 변수나, conf로 설정하게 되면 여러 쿼리들에 적용되는 부작용을 겪을 수도 있다. 따라서, 쿼리 힌트로 사용하는 것이 현실적이라고 생각한다.
SELECT /*+ MAX_EXECUTION_TIME(n) */ * FROM ...
형식으로 사용하면 된다. n은 ms 값이다.
사전 조건
단, 이 옵션을 사용하기 위한 사전 조건이 있는데, MySQL의 버전이 5.7.4 이상이어야 한다. 이보다 낮은 버전에서는 사용해도 아무런 변화가 없다. MySQL의 버전은 다음 명령어로 확인할 수 있다.
SELECT version();
8.0.20
동작 확인
보통은 실행하는데 얼마 걸리지 않는 아래의 쿼리로 확인해 본다.
SELECT
col.TABLE_NAME,
col.COLUMN_NAME,
col.COLUMN_TYPE,
tab.AUTO_INCREMENT
FROM
information_schema.TABLES tab,
information_schema.COLUMNS col
WHERE
col.TABLE_NAME = tab.TABLE_NAME;
그런데, 이 쿼리에 위의 힌트를 적용해 보았다. 실행이 금방 끝나기 때문에 n 값을 작게 지정했다. (n = 20)
SELECT
/*+ MAX_EXECUTION_TIME(20) */
col.TABLE_NAME,
col.COLUMN_NAME,
col.COLUMN_TYPE,
tab.AUTO_INCREMENT
FROM
information_schema.TABLES tab,
information_schema.COLUMNS col
WHERE
col.TABLE_NAME = tab.TABLE_NAME;
를 실행하면,
스크린샷 하단에서 볼 수 있듯이,
[HY000][3024] Query execution was interrupted, maximum statement execution time exceeded
와 같은 에러 메시지가 발생하면서 쿼리가 강제로 종료되었다.
MySQL 공식 문서 확인 (사용시 주의 사항)
https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-hints-execution-time
- 복합 SELECT 문의 경우, 복합문 전체에 적용되며 힌트는 첫번째 SELECT 문에 표기할 것
- 읽기 전용 SELECT 문에만 적용
- STORED PROCEDURE에는 적용되지 않음
'Development > Database' 카테고리의 다른 글
psql (postgresql client) command (0) | 2021.03.17 |
---|---|
Docker 기반 Postgresql 설치하기 (0) | 2021.03.11 |
DB 트랜잭션 - 격리수준(Transaction Isolation Level) (0) | 2021.03.07 |
맥북에 psql 설치하기 (postgresql client) (0) | 2021.03.06 |
MySQL information_schema로 세부 정보 확인하기 (0) | 2021.02.13 |
Docker 기반 MySQL 설치하기 (0) | 2021.02.11 |
쿼리로 테이블 이름 조회하기 - MySQL, PostgreSQL, Oracle, MS-SQL (1) | 2020.12.02 |
DB 설치하지 않고 간편하게 온라인으로 SQL Query 실행해 보기 (0) | 2020.11.29 |