본문 바로가기
Database/Mysql

MySQL 파라메터 재기동 없이 설정 PERSIST 기능

by 화곡공룡 2023. 7. 4.
반응형

MySQL에서 파라메터를 설정할때 시스템 변수는 동적 변수와 정적 변수로 구분한다.

동적 변수의 경우 DB 상에서 바로 설정이 가능하지만 DB 서버 재기동을 하게 될 경우

my.cnf 파일을 다시 읽어 오기때문에 기존 설정값으로 가져 오게된다.

 

만약 장애 등 긴급 조치시 동적 변수를 설정하고 my.cnf를 설정하지 않게 된다면

다음 재기동시 장애가 다시 발생할 가능성이 크다.

 

MySQL 8.0 버전에서 이런 문제점을 보안하기 위해 PERSIST 명령이 도입되었다.

이 명령으로 동적변수를 설정시 시스템 변수가 바로 적용되며 my.cnf 대신 별도의 mysqld-auto.cnf 파일에 기록되어 DB가 재기동되어도 해당 파일을 참조하여 읽어 오게 된다.

 

1. 현재 max_connections 상태

root@localhost:(none) 15:19:35>show global variables like 'max_connections' ;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.00 sec)

root@localhost:(none) 15:19:36>
root@localhost:(none) 15:19:37>
root@localhost:(none) 15:19:37>set global max_connections=300 ;
Query OK, 0 rows affected (0.00 sec)

root@localhost:(none) 15:19:52>
root@localhost:(none) 15:19:54>
root@localhost:(none) 15:19:54>show global variables like 'max_connections' ;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 300   |
+-----------------+-------+
1 row in set (0.01 sec)

2. PERSIST 명령으로 변경하게 되면 다음과 같이 동적 변수가 적용되며 mysqld-auto.cnf 파일도 생성이 된다.

mysqld-auto.cnf 파일은 data 폴더에 생성이 된다.

root@localhost:(none) 15:19:58>
root@localhost:(none) 15:20:02>set persist max_connections=1000;
Query OK, 0 rows affected (0.00 sec)

root@localhost:(none) 15:20:43>show global variables like 'max_connections' ;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.01 sec)

root@localhost:(none) 15:20:46>exit
Bye
[root@mysql_test8 data]# ls -l mysqld-auto.cnf
-rw-r-----. 1 mysql dba 172 Jul  4 15:20 mysqld-auto.cnf
[root@mysql_test8 data]# cat mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "1000" , "Metadata" : { "Timestamp" : 1688451643895688 , "User" : "root" , "Host" : "localhost" } } } }[root@mysql_test8 data]#
[root@mysql_test8 data]#
반응형

3. DB 재부팅 후 확인

만약 my.cnf에 변수가 설정되어 있고 mysqld-auto.cnf 파일에도 설정이 되어 있다면 mysqld-auto.cnf 변수가 나중에 적용되기 때문에 같은 변수가 설정되어 있어서 mysqld-auto.cnf 변수를 따라간다.

[root@mysql_test8 data]# cat /etc/my.cnf | grep max_connections
max_connections = 300
[root@mysql_test8 data]# cat /mydata/data/mysqld-auto.cnf | grep max_connections
{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "1000" , "Metadata" : { "Timestamp" : 1688451643895688 , "User" : "root" , "Host" : "localhost" } } } }
[root@mysql_test8 data]#
[root@mysql_test8 data]# systemctl status mysql
● mysql.server.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysql.server; bad; vendor preset: disabled)
   Active: active (running) since Thu 2023-06-29 15:20:21 KST; 5 days ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1006 ExecStart=/etc/rc.d/init.d/mysql.server start (code=exited, status=0/SUCCESS)
    Tasks: 52
   Memory: 785.0M
   CGroup: /system.slice/mysql.server.service
           ├─1057 /bin/sh /sw/mysql/bin/mysqld_safe --datadir=/mydata/data --pid-file=/mydata/data/mysqld.pid
           └─1996 /sw/mysql/bin/mysqld --basedir=/sw/mysql --datadir=/mydata/data --plugin-dir=/sw/mysql/lib/plugin --user=mysql --log-error=/log/mysqld.err --pid-file=/mydata/data/mysqld.pid --...

Jun 29 15:20:21 mysql_test8.0 systemd[1]: Starting LSB: start and stop MySQL...
Jun 29 15:20:21 mysql_test8.0 mysql.server[1006]: Starting MySQL SUCCESS!
Jun 29 15:20:21 mysql_test8.0 systemd[1]: Started LSB: start and stop MySQL.
[root@mysql_test8 data]#
[root@mysql_test8 data]#
[root@mysql_test8 data]# systemctl stop mysql
[root@mysql_test8 data]# systemctl status mysql
● mysql.server.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysql.server; bad; vendor preset: disabled)
   Active: inactive (dead) since Tue 2023-07-04 15:24:42 KST; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 3594 ExecStop=/etc/rc.d/init.d/mysql.server stop (code=exited, status=0/SUCCESS)
  Process: 1006 ExecStart=/etc/rc.d/init.d/mysql.server start (code=exited, status=0/SUCCESS)

Jun 29 15:20:21 mysql_test8.0 systemd[1]: Starting LSB: start and stop MySQL...
Jun 29 15:20:21 mysql_test8.0 mysql.server[1006]: Starting MySQL SUCCESS!
Jun 29 15:20:21 mysql_test8.0 systemd[1]: Started LSB: start and stop MySQL.
Jul 04 15:24:41 mysql_test8.0 systemd[1]: Stopping LSB: start and stop MySQL...
Jul 04 15:24:42 mysql_test8.0 mysql.server[3594]: Shutting down MySQL. SUCCESS!
Jul 04 15:24:42 mysql_test8.0 systemd[1]: Stopped LSB: start and stop MySQL.
[root@mysql_test8 data]# systemctl start mysql
[root@mysql_test8 data]#
[root@mysql_test8 data]# systemctl status mysql
● mysql.server.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysql.server; bad; vendor preset: disabled)
   Active: active (running) since Tue 2023-07-04 15:24:53 KST; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 3594 ExecStop=/etc/rc.d/init.d/mysql.server stop (code=exited, status=0/SUCCESS)
  Process: 3637 ExecStart=/etc/rc.d/init.d/mysql.server start (code=exited, status=0/SUCCESS)
    Tasks: 42
   Memory: 604.5M
   CGroup: /system.slice/mysql.server.service
           ├─3654 /bin/sh /sw/mysql/bin/mysqld_safe --datadir=/mydata/data --pid-file=/mydata/data/mysqld.pid
           └─4277 /sw/mysql/bin/mysqld --basedir=/sw/mysql --datadir=/mydata/data --plugin-dir=/sw/mysql/lib/plugin --user=mysql --log-error=/log/mysqld.err --pid-file=/mydata/data/mysqld.pid --...

Jul 04 15:24:51 mysql_test8.0 systemd[1]: Starting LSB: start and stop MySQL...
Jul 04 15:24:53 mysql_test8.0 mysql.server[3637]: Starting MySQL.. SUCCESS!
Jul 04 15:24:53 mysql_test8.0 systemd[1]: Started LSB: start and stop MySQL.
[root@mysql_test8 data]#
[root@mysql_test8 data]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost:(none) 15:25:03>show global variables like 'max_connections' ;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.02 sec)

root@localhost:(none) 15:25:08>

4. 만약 동적 시스템 변수는 그대로 두고 향후 재기동시에만 적용하고자 한다면 my.cnf를 직접 변경하지 않고 persist_only 명령으로 mysqld-auto.cnf에 기록하게 할 수 있다.

다음과 같이 max_connections를 2000으로 변경하였지만 시스템은 적용되지 않았고 mysqld-auto.cnf 파일에만 기록된것을 볼 수 있다.

root@localhost:(none) 15:27:25>set persist_only max_connections=2000;
Query OK, 0 rows affected (0.01 sec)

root@localhost:(none) 15:27:43>show global variables like 'max_connections' ;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.00 sec)

root@localhost:(none) 15:27:46>exit
Bye
[root@mysql_test8 data]# cat /mydata/data/mysqld-auto.cnf | grep max_connections
{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "2000" , "Metadata" : { "Timestamp" : 1688452063879599 , "User" : "root" , "Host" : "localhost" } } } }
[root@mysql_test8 data]#

 

 

 

Mysql using 사용법

mysql 에서 테이블간 join시 on 절을 이용하여 각각 테이블의 컬럼명을 명시하여 join 하지만 같은 컬럼명을 사용할 경우 using을 사용하여 작성할 수 있다. 두가지 방식의 차이점은 on은 각각의 컬럼

m2seo.tistory.com

 

반응형

댓글