본문 바로가기

DB/MySQL

MySQL Timeout 설정

MySQL에서의 timeout은 interactive_timeout과 wait_timeout 이렇게 두 가지가 존재합니다.

1. interactive_timeout은 mysql> 과 같은 콘솔이나 터미널 모드(대화형 클라이언트)에서 mysqld와 client가 연결을 맺은 다음 요청을 기다리는 최대시간입니다.

2. wait_timeout은 API를 이용한 client 프로그램(PHP, JDBC, ODBC...) 상에서 최대 연결시간을 말하며, 설정된 시간 동안 아무 요청이 없으면 연결은 취소되고 다시 요청이 들어오면 자동으로 연결이 맺어집니다. 현재 설정된 값을 확인 하시려면 아래와 같은 명령으로 확인 가능합니다.

mysql

1) Global 설정 확인

mysql> show global variables like '%timeout';

2) Session 설정 확인

mysql> show variables like '%timeout';

3. Timeout 시간을 조절하려면 아래와 같이 설정합니다.

1) Global 설정

mysql> set global interactive_timeout=10;

mysql> set global wait_timeout=10;

2) Session 설정

mysql> set interactive_timeout=10;

mysql> set wait_timeout=10;

단, 위와 같은 방법은 mysql 데몬 재시작 시 초기 값으로 돌아갑니다. 

mysql 시작 시 고정된 값으로 설정하기 위해서는 아래와 같이 my.cnf 파일을 통해 설정합니다.

# vi /etc/my.cnf

[mysqld]

interactive_timeout=10

wait_timeout=10

 

* Mysql Query 응답 체크

mysqladmin -i5 status -u root -p

mysqladmin -i5 status -u root -p

번외로, conf 파일 수정시 설정이 안되는 경우 ~

my.cnf의 [mysqld] section에 wait_timeout=300 으로 설정 추가하고 다시 띄운다.(기본값은 28800)

mysql로 접속하여 show variables like 'wait_timeout' 을 해본다.

어라? 28800이다. 왜 적용이 안되는 걸까...

show variables like '%timeout%'을 해보면, interactive_timeout이라는게 있는데, 이게 바로 커맨드라인 클라이언트인 mysql (보통 /usr/local/mysql/bin/mysql 또는 /usr/local/bin/mysql 등등)을 말하는 거다.

당연히 mysql 기본 클라이언트로 interactive mode접속하면 wait_timeout을 interactive_timeout값으로 바꿔주는거다.

interactive mode로 접속했기때문이다.

show global variables like '%timeout%'을 해본다.

wait_timeout=300으로 설정이 잘 되어있다. 즉, interactive mode가 아닌 접속 쓰레드에 대해서 wait_timeout이 새로 설정한 값이 된다는거다. 당연히 mysql로 접속해서는 확인을 못한다.

결론은,

본인이 작성하는 프로그램의 라이브러리를 이용하여 테스트 커넥션을 만들고 300초간 아무것도 하지 않은 후에 쿼리를 하나 날려보자 "SELECT 1" 같은..

에러가 난다. 2006, Mysql server has gone away. 설정한 wait_timeout이 먹었다.

참고하자...