티스토리 뷰

Mysql

Mysql - 시스템 변수

realizers 2022. 4. 12. 00:31
728x90
반응형

시스템 변수란?


  • Mysql 서버는 실행하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어하기 위해 이러한 값들을 별도로 지정해 둡니다. Mysql 서버에서는 이렇게 저장된 값을 시스템 변수라고 합니다.
  • 시스템 변수 값이 어떻게 Mysql 서버와 클라이언트에게 영향을 미치는지 판단할려면 각 변수가 글로벌 변수인지 세션 변수인지 구분할 수 있어야합니다. 그리고 이를 위해서는 글로벌 변수와 세션 변수가 무엇이고 서로 어떠한 연관 관계가 있는지 이해해야합니다.

 

시스템 변수 확인 방법
SHOW GLOBAL VARIABLES;

 

MySql 서버 시스템 변수 관련 페이지

https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html

 

MySQL :: MySQL 8.0 Reference Manual :: 5.1.5 Server System Variable Reference

MySQL 8.0 Reference Manual  /  ...  /  MySQL Server Administration  /  The MySQL Server  /  Server System Variable Reference PREV   HOME   UP   NEXT

dev.mysql.com

💡 Cmd-Line

Mysql 서버의 명령행 인자로 설정될 수 있는지 나타냅니다. 즉 이 값이 YES라면 명령행 인자로 이 시스템 변수의 값을 변경하는 것이 가능하다는 의미입니다.

 

💡 Option File

Mysql의 설정 파일인 my.cnf(또는 my.ini)로 제어할 수 있는지 여부를 나타냅니다. 

 

💡 System Var

시스템 변수인지 아닌지를 나타냅니다. Mysql 서버의 설정 파일을 작성할 때에는 각 변수명에 사용된 하이픈(-)이나 언더스코어(_) 구분에 주의해야 합니다. Mysql 8.0에서는 모든 시스템 변수들이 언더스코어(_)를 구분자로 사용하도록 변경된 것으로 보이며, 명령행 옵션으로만 사용 가능한 설정들은 언더스코어가 아닌 하이픈(-) 구분자로 사용합니다.

 

💡 Var Scope

시스템 변수의 적용 범위를 나타냅니다. 이 시스템 변수가 영향을 미치는 곳이 Mysql 서버 전체(Globla)를 대상으로 하는지, 아니면 Mysql 서버와 클라이언트 간의 커넥션(Session)만인지 구분합니다. 그리고 어떠한 변수는 세션과 글로벌 범위에 모두 적용(Both)되기도 합니다.

 

💡 Dynamic

시스템 변수가 동적인지 정적인지 구분하는 변수입니다.

 

 

글로벌 변수와 세션 변수


글로벌 변수란?
  • 글로벌 범위의 변수는 하나의 Mysql 서버 인스턴스에서 전체적으로 영향을 미치는 변수를 말합니다. 주로 Mysql 서버 자체에 관련된 설정일 경우가 많습니다. 대표적으로는 InnoDB 버퍼 풀 크기 또는 쿼리 캐시 크기가 있습니다.

 

세션 변수란?
  • 세션 범위의 변수는 Mysql 클라이언트가 Mysql 서버에 접속할 때 기본으로 부여하는 옵션의 기본값을 제어하는데 사용됩니다.
  • 클라이언트가 처음 접속하면 기본적으로 부여하는 기본값을 가지고 있습니다. 별도로 그 값을 변경하지 않은 경우에도 그대로 값이 유지되지만, 클라이언트의 필요에 따라 개별 커넥션 단위로 다른 값으로 변경할 수 있는 것이 세션 변수입니다.
  • 대표적으로 각 클라이언트가 쿼리 단위로 자동 커밋을 수행할지 여부를 결정하는 Autocommit이 있습니다.

 

정적 변수와 동적 변수


  • Mysql 서버의 시스템 변수는 Mysql 서버가 실행 중인 상태에서 변경 가능한지 여부에 따라 동적 변수와 정적 변수로 구분 됩니다.
  • Mysql 서버의 시스템 변수는 설정 파일(my.cnf or my.ini)을 변경하는 경우와 이미 실행중인 Mysql 서버의 메모리에 올려져 있는 변수를 변경하는 경우로 구분할 수 있습니다. 설정 파일에 저장되어 있는 변수들은 해당 내용을 변경하더라도 Mysql 서버를 재시작 하기전까지는 실제로 적용되지 않습니다. 하지만 SET 명령어를 통해 재시작을 하지 않고도 값을 변경할 수 있습니다. 이때 SET 명령어를 통해 변경된 시스템의 변수값이 Mysql의 설정 파일(my.cnf or my.ini)에 반영되는 것은 아니기 때문에 현재 실행 중인 Mysql의 인스턴스에서만 유효합니다. 이말은 서버를 재시작하면 SET명령어를 통해 설정한 값들은 초기화가 된다는 의미입니다. 때문에 설정을 영구적으로 적용하기 위해서는 설정 파일도 반드시 변경을 해야합니다.
  • Mysql 8.0 버전부터는 SET PERSIST 명령어를 통해 실행 중인 Mysql 서버의 시스템을 변경함과 동시에 자동으로 설정 파일로도 기록이 됩니다. 

 

SET PERSIST


  • 아래와 같은 명령어를 통해 시스템 변수를 변경하면 Mysql 서버는 변경된 값을 즉시 적용함과 동시에 별도의 설정 파일(mysqld-auto.cnf)에 변경된 내용을 추가적으로 기록하고 Mysql 서버가 재시작할 때 기본 설정 파일 뿐만 아니라 mysqld-auto.cnf에 변경된 내용을 참고하여 시스템 변수를 적용합니다.
  • 즉 SET PERSIST 명령어를 사용하면 Mysql 서버 설정 파일(my.cnf)에 변경 내용을 수동으로 기록하지 않아도 서버가 재시작할 때 자동으로 양구 변경이 가능합니다.
  • SET PERSIST 명령은 세션 변수에는 적용되지 않으며, SET PERSIST 명령으로 시스템 변수를 변경하면 Mysql 서버는 자동으로 GLOBAL 시스템 변수의 변경으로 인식하고 변경합니다.
SET PERSIST max_connections = 5000;

 

SET PERSIST 명령어로 정적 변수 변경
  • SET PERSIST 명령은 현재 실행중인 Mysql 서버에서 동적인 변수들의 값을 변경함과 동시에 mysqld-auto.cnf 파일에도 기록하여 재시작할 때 적용하는 용도인데 정적 변수는 실행 중인 Mysql 서버에서는 변경할 수 없습니다. 대표적으로 innodb_doublewrite는 정적 변수로써 Mysql 서버가 재시작될 때만 변경할 수 있습니다. 이렇게 정적 변수를 mysqld-auto.cnf 파일에 등록만 하여 서버가 재시작할 때 자동적으로 적용할 수 있도하고자 할 때 SET PERSIST_ONLY 명령어를 사용합니다.
SET PERSIST_ONLY innodb_doublewrite = ON;

 

SET PERSIST로 변경한 변수 삭제
  • SET PERSIST나 SET PERSIST_ONLY 명령어를 통해 변경되거나 추가된 시스템 변수의 내용을 삭제해야하는 경우에는 mysqld-auto.cnf 파일의 내용을 직접적으로 변경하다가 오류를 만드는 경우 Mysql 서버가 제대로 동작하지 않을 수가 있습니다. 그래서 mysqld-auto.cnf 파일의 내용을 삭제해야 하는 경우 아래 명령어를 사용할 수 있습니다.
# 특정 시스템 변수만 삭제하는 경우
RESET PERSIST max_connections;(변수명)
RESET PERSIST IF EXISTS max_connections;(변수명)

# mysqld-auto.cnf 파일의 모든 시스템 변수를 삭제하는 경우
RESET PERSIST

 

 


해당 내용은 Real Mysql 8.0 책을 바탕으로 작성되었습니다.

 

 

 

728x90
반응형