반응형

Mysql 서버의 시스템 변수는 동적 변수와 정적 변수로 구분되는데, 동적 변수의 경우 Mysql 서버에서 set global 명령으로 변경하면 즉시 Mysql 서버에 반영된다.


예를 들어, Mysql 서버의 max_connections라는 시스템 변수가 있는데, 이 시스템 변수는 Mysql 서버로 접속할 수 있는 최대 커넥션의 개수를 제한하는 동적 시스템 변수다.
Mysql 서버에 커넥션을 더많이이 사용 중이라면 최대 연결 가능 커넥션의 개수를 더 늘리기 위해서 다음과 같이 Mysql 서버의 시스템 변수를 즉시 변경하게 될 것이다.

 

SET GLOBAL max_connections=5000;



문제는 이렇게 변경한 후 Mysql 서버의 설정 파일에서도 이 내용을 적용해야 하는데, 응급조치를 하다 보면 Mysql 서버의 설정 파일에 변경한 내용을 적용하는 것을 잊어버릴 때도 있다.


그리고 시간이 지나서 Mysql 서버를 재시작하면 다시 예전의 max_connections 시스템 변수의 값으로 Mysql 서버가 시작되고, 이로 인해 장애가 반복적으로 발생하게 된다.
실제로 이런 상황은 꽤 빈번하게 일어난다.

Mysql 8.0에서는 이런 문제점을 보안하기 위해 SET PERSIST 명령을 도입했다.

 

mysql> SET PRESIST max_connections=5000;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 5000  |
+-----------------+-------+
1 row in set (0.00 sec)



위 예제와 함께 SET PRESIST 명령으로 시스템 변수를 변경하면 Mysql 서버는 변경된 값을 즉시 적용하고 별도로 mysqld-auto.cnf 파일에 변경된 내용을 추가기록해둔다.

그리고 DB가 재시작할 때 my.cnf파일 뿐만아니라 mysqld-auto.cnf 파일을 같이 참조해서 시스템 변수를 적용한다.
SET PRESIST 명령은 세션 변수에는 적용되지 않으며, GLOBAL 시스템 변수의 변경으로 인식하고 변경한다.


만약 현재 시스템말고 재시작할 때만 변경 내용을 반영하고 싶다면 SET PERSIST_ONLY 명령을 사용한다.

 

mysql> SET PRESIST_ONLY max_connections=5000;
mysql> show global variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 5000  |
+-----------------+-------+
1 row in set (0.00 sec)



DB가 재시작되어야만 반영되는 정적변수 예를 들어 innodb_doublewrite 같은 변수도 미리 반영해둘 수 있다.

 

mysql> SET PRESIST innodb_doublewrite=ON;
ERROR 1238 (HY000) : Variable 'innodb_doublewrite' is read only variable


mysql> SET PRESIST_ONLY innodb_doublewrite=ON;
Query OK, 0 rows affected (0.00 sec)



다만!  이렇게 편리한 명령어도..

SET PERSIST나 SET PERSIST_ONLY 명령으로 추가된 시스템 변수의 내용을 삭제해야 할 때도 있다.
이때 mysqld-auto.cnf 파일의 내용을 직접 변경하다가 내용상 오류를 만드는 경우 Mysql 서버가 시작되지 못할 수도 있다.

 

mysqld-auto.cnf 은 직접  파일 건드리지 말자.;


그래서 mysqld-auto.cnf 파일의 내용을 삭제해야 하는 경우에는 다음과 같이 명령어를 사용하는 것이 안전하다.

 

##특정 시스템 변수만 삭제
mysql> RESET PRESIST max_connections;
mysql> RESET PRESIST IF_EXISTS max_connections;

##mysql-auto.cnf 파일의 모든 시스템 변수를 삭제
mysql> RESET PERSIST;



자동화는 어디서나 양날의 검이다.
제대로 알고 사용하면 가장 편한 수단이지만 
어설프게 알고 사용하면 DB가 죽을 수도 있다.

반응형
블로그 이미지

dung beetle

취미는 데이터 수집 직업은 MYSQL과 함께 일하는 DBA의 소소한 일상 이야기

,