유닉스 계열(리눅스 포함)에서 MySQL 설정 파일은 my.cnf라는 이름으로 사용된다.
※ 윈도우 OS의 경우
my.ini라는 이름으로 사용된다.
MySQL 서버가 실행될 때 my.cnf 파일을 참조한다. 이때 특정 경로 하나만 참조하는 것이 아니라, 여러 디렉터리를 순차적으로 탐색하면서 가장 먼저 발견한 my.cnf 파일만을 사용하고, 이후 경로의 설정 파일은 무시한다.
만약 MySQL 서버를 실행할 때 어떤 경로의 my.cnf 파일을 사용하는지 확인하려면 아래 명령어를 사용하여 확인할 수 있다.
$> mysqld --verbose --help | grep 'my.cnf' 또는 $> mysql --help | grep 'my.cnf'
위 명령어를 실행하면 MySQL 서버가 참조할 수 있는 my.cnf 파일을 순서대로 확인할 수 있다.
출력 결과를 보면 아래 순서대로
my.cnf파일을 참조한다.
1./etc/my.cnf(1 순위 : 가장 먼저 탐색)
2./etc/mysql/my.cnf
3./usr/etc/my.cnf
4.~/.my.cnf
설정 파일은 일반적으로 /etc/my.cnf 또는 /etc/mysql/my.cnf을 사용한다.
그러나 하나의 DB 서버에 여러 개의 MySQL 서버를 실행할 때 설정 파일 충돌이 발생할 수 있다. (충돌을 방지하기 위해 공유 디렉터리가 아닌 별도 디렉터리를 만들어 각 MySQL 서버에 맞는 설정 파일을 적용해야 한다)
my.cnf 파일에는 여러 개의 설정 그룹(실행 프로그램명)을 담을 수 있다. MySQL에서는 일반적으로 실행 프로그램명을 설정 그룹명으로 지정하여 참조/사용한다.
아래는 참고 예시며, 프로그램명이 2개 이상의 설정 그룹을 참조하는 경우도 있다.
+------------------+-----------------+ | 프로그램명 | 설정 그룹 | +------------------+-----------------+ | mysqldump | [mysqldump] | | mysqld | [mysqld] | | mysqld_safe | [mysqld_safe] | +------------------+-----------------+
또한, 각 프로그램은 같은 설정 파일을 참조/공유하지만, 서로 독립적으로 무관하게 적용된다.
MySQL 서버는 실행 방식과 제어 설정을 위한 다양한 값들을 시스템 변수(System Variables)라는 이름으로 관리한다.
MySQL의 시스템 변수는 아래 명령문을 통해 확인할 수 있다.
# 글로벌 변수 mysql> SHOW GLOBAL VARIABLES; # 세션 변수 (현재 접속 세션에 적용된 값을 보여준다) mysql> SHOW VARIABLES;
MySQL에서 각 시스템 변수는 여러 속성으로 정의되어 있다. 시스템 변수 속성은 변수마다 서로 상이하기 때문에 공식 문서 확인이 필요하다.
속성 설명 Command-Line 서버 시작 시 명령어 인자로 사용할 수 있는 형식 System Variable 변수명 Scope 변수의 적용 범위 (Global, Session) Dynamic 실행 중 변경 가능 여부 (Yes: 동적, No: 정적 SET_VAR Hint Applies 힌트로 적용 가능한지 여부 Type 변수의 값 타입 Default Value 기본 값
이러한 시스템 변수는 다음과 같은 기준으로 분류된다.
글로벌 변수는 하나의 MySQL 서버 인스턴스에 전체적으로 영향을 미치는 시스템 변수이다. 때문에 글로벌 변수는 MySQL 서버 전체에 대한 설정이 필요할 때 사용된다.
세션 변수는 각 클라이언트 접속 세션 단위로 적용되는 시스템 변수다. 클라이언트가 MySQL 서버에 접속하면, 해당 세션에만 적용되는 기본값이 할당된다. 이를 통해 클라이언트별 개별 커넥션 단위로 시스템 변수값을 다르게 지정할 수 있다.
일반적으로 세션 변수로 적용된 시스템 변수는 세션 변수와 글로벌 변수에도 동시에 존재한다.
이러한 경우 아래 그림처럼 표시(MySQL 8.4 기준)된다.
정적 변수는 MySQL 서버 시작 시 설정된 값이 서버가 종료될 때까지 유지되는 변수다.
시스템 정적 변수는 디스크에 저장된 설정 파일(my.cnf)을 변경하더라도 MySQL을 재시작하기 전에는 적용되지 않는다.
동적 변수는 SET 명령을 사용하여 서버의 재시작 없이 시스템 변수값을 변경할 수 있다. 이는 설정 파일(my.cnf)에 적용된 것은 아니며, 현재 실행 중인 MySQL 인스턴스에서만 유효하다. (MySQL이 재시작하면 다시 초기화)
mysql> SET GLOBAL max_connections = 500; mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 500 | +-----------------+-------+
이러한 이유로 영구적인 변수값을 적용하려면 설정 파일(my.cnf)에 변수값을 설정하거나 PERSIST 옵션을 사용하여 변수값을 수정해야 한다.
SET또는SHOW명령을 사용할 때GLOBAL키워드를 사용하면 글로벌 변수에 대한 목록과 설정을 확인/수정할 수 있으며,GLOBAL키워드를 제외하면 세션 변수의 목록과 설정을 확인/수정할 수 있다.
마지막으로 변수의 범위가 Global이면서 Session인 경우 Global 변수의 값을 변경해도 이미 클라이언트 세션으로 연결된 변수값은 변경되지 않고 그대로 유지된다.
동적 변수(Dynamic Variables)는 MySQL 서버 실행 중 SET 명령를 사용하여 시스템 변수값을 변경할 수 있다. 하지만 이는 현재 실행 중인 MySQL 인스턴스에만 유효하기 것이기 때문에 MySQL 서버가 종료되면 시스템 변수값은 초기화가 된다.
초기화를 방지하고 변수 설정값을 영구 적용하고 싶다면 SET PERSIST 명령문을 사용해야 한다.
SET PERSIST 명령문을 사용하여 동적 시스템 변수를 설정할 경우 해당 시스템 변수값은 즉시 반영됨과 동시에 별도의 설정 파일(mysqld-auto.cnf)에 변경 내용을 기록한다.
mysql> SET PERSIST max_connections = 1000; mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1000 | +-----------------+-------+
MySQL 서버가 실행할 때 my.cnf 파일 뿐만 아니라 mysqld-auto.cnf 파일도 같이 참조하여 실행한다.
즉, SET PERSIST 명령문을 사용한 경우 별도의 my.cnf 파일 수정 없이 변경된 시스템 변수를 사용할 수 있다.
※
SET PERSIST명령문은 세션 변수(Session Variables)에는 적용되지 않는다.이러한 이유로 아래 두 명령문은 같은 결과를 보여준다.
# 권장 O mysql> SET PERSIST max_connections = 1000; # 사용은 가능, 권장 X mysql> SET GLOBAL PERSIST max_connections = 1000;
일반적으로 시스템 변수는 SET 명령을 통해 서버 실행 중 즉시 적용할 수 있다.
그러나 정적 변수는 서버 실행 중에는 변경할 수 없기 때문에, 서버 재시작 이후에 적용되도록 미리 저장하고 싶을 때는 SET PERSIST_ONLY 명령을 사용한다.
mysql> SET PERSIST max_connections = 5000; mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1000 | +-----------------+-------+ mysql 서버 재시작... mysql> SHOW GLOBAL VARIABLES LIKE 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 5000 | +-----------------+-------+
SET PERSIST_ONLY는 값을mysqld-auto.cnf파일에만 기록하고, 현재 실행 중인 MySQL 인스턴스에는 적용하지 않는다.이후 MySQL 서버가 재시작될 때 이 설정 파일을 읽어, 해당 변수값이 적용된다.
SET PERSIST와 SET PERSIST_ONLY을 사용하여 생성/기록된 mysqld-auto.cnf 파일은 JSON 형태로 데이터를 기록한다.
$> cat /var/lib/mysql/mysqld-auto.cnf
{"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "5000", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1754217803622744}}}}
[
mysqld-auto.cnf파일의 JSON 데이터 정렬 후]{ "Version":2, "mysql_dynamic_parse_early_variables":{ "max_connections":{ "Value":"5000", # 수정 값 "Metadata":{ "Host":"localhost", "User":"root", # 수정자 "Timestamp":1754217803622744 # 수정 시간 } } } }
SET PERSIST와 SET PERSIST_ONLY을 사용하여 시스템 변수를 설정한 후 해당 설정 내용을 삭제해야 할 때도 있다.
이때 mysqld-auto.cnf 파일에 들어가 직접 내용을 수정하는 방법은 매우 위험한 방법이다.
mysqld-auto.cnf 파일 내용을 삭제할 때는 RESET PERSIST 명령문을 사용하여 설정된 시스템 변수 내용을 삭제하는 것이 안전한 방법이다.
RESET PERSIST명령문을 사용한 직후 시스템 변수값이 즉시 반영되진 않는다. MySQL 서버 재시작 이후 시스템 변수값을 확인해 보면 값이 변경됨을 확인할 수 있다.RESET PERSIST max_connections; # 전체 초기화 RESET PERSIST;
버전에 따라 다르지만, MySQL 서버의 시스템 변수는 600개 전후로 보인다. 상황에 따라 플러그인/컴포넌트에 따라 시스템 변수의 수는 증가할 수 있다.
아래 리스트 중요 시스템 변수 목록이다.
---- 파일 및 디렉터리 관련 ----
datadir : 데이터베이스 파일이 저장되는 기본 디렉터리입니다.
socket : 서버 연결에 사용되는 Unix 소켓 파일의 경로입니다.
tmpdir : 임시 파일이 생성되는 디렉터리입니다.
secure_file_priv : LOAD DATA INFILE과 같은 작업 시 파일을 읽거나 쓸 수 있는 디렉터리를 제한합니다.
---- 연결 및 권한 관련 ----
max_connections : 동시에 접속할 수 있는 최대 클라이언트 수를 지정합니다.
max_connect_errors : 연결 실패 횟수가 이 값을 초과하면 해당 호스트를 차단합니다.
activate_all_roles_on_login : 로그인 시 모든 역할을 자동으로 활성화할지 여부를 결정합니다.
skip_name_resolve : 클라이언트 연결 시 호스트 이름 대신 IP 주소를 사용해 DNS 조회를 건너뜁니다.
local_infile : LOAD DATA LOCAL INFILE 명령의 사용 가능 여부를 설정합니다.
---- 서버 동작 및 기타 옵션 관련 ----
default_storage_engine : 테이블을 생성할 때 기본으로 사용될 스토리지 엔진입니다.
default_tmp_storage_engine : 임시 테이블에 사용될 기본 스토리지 엔진입니다.
table_open_cache : 모든 스레드에서 열어놓을 수 있는 테이블 파일의 캐시 크기입니다.
table_open_cache_instances : table_open_cache를 분할하여 동시 접근 성능을 향상시킵니다.
open_files_limit : MySQL이 열 수 있는 파일의 최대 개수를 설정합니다.
explicit_defaults_for_timestamp : TIMESTAMP 데이터 타입의 기본 동작 방식을 변경합니다.
sql_mode : MySQL이 지원하는 SQL 구문과 유효성 검사 규칙을 설정합니다.
max_allowed_packet : 서버가 처리할 수 있는 패킷의 최대 크기입니다.
time_zone : 서버의 시간대를 설정합니다.
---- 보안 및 암호화 관련 ----
block_encryption_mode : AES_ENCRYPT() 및 AES_DECRYPT() 함수에 사용될 블록 암호화 모드를 지정합니다.
default_password_lifetime : 비밀번호 만료 기간을 설정합니다.
---- 오류 및 코어 파일 관련 ----
log_error : 오류 로그 파일의 경로를 지정합니다.
log_error_verbosity : 오류 로그에 기록될 메시지의 상세 수준을 설정합니다.
core_file : 서버가 비정상 종료될 경우 코어 파일을 생성할지 여부를 결정합니다.
---- 버퍼 및 캐시 관련 ----
max_heap_table_size : 메모리 테이블의 최대 크기를 제한합니다.
tmp_table_size : 메모리 임시 테이블의 최대 크기를 설정합니다.
innodb_buffer_pool_size : InnoDB 데이터와 인덱스를 캐싱하는 메인 메모리 영역의 크기입니다.
innodb_buffer_pool_instances : 버퍼 풀을 여러 개로 분할하여 동시 접근 성능을 향상시킵니다.
---- 인덱스 및 검색 관련 ----
ngram_token_size : ngram 전문 검색 파서에서 토큰의 크기를 설정합니다.
innodb_adaptive_hash_index : 자주 접근하는 페이지에 대해 해시 인덱스를 생성하여 성능을 높입니다.
innodb_cmp_per_index_enabled : 압축된 테이블의 압축 효율을 모니터링합니다.
---- 문자셋 및 정렬 관련 ----
character_set_server : 서버의 기본 문자 집합입니다.
character_set_filesystem : 파일 시스템의 문자 집합을 설정합니다.
collation_server : 서버의 기본 정렬 방식입니다.
---- 바이너리 로그 관련 ----
log_bin : 바이너리 로그 활성화 여부를 결정합니다.
binlog_format : 바이너리 로그의 기록 형식을 설정합니다 (STATEMENT, ROW, MIXED).
max_binlog_size : 바이너리 로그 파일의 최대 크기를 지정합니다.
sync_binlog : 바이너리 로그를 디스크에 얼마나 자주 동기화할지 설정합니다.
binlog_checksum : 바이너리 로그에 체크섬을 기록할지 여부를 지정합니다.
binlog_order_commits : 커밋 순서대로 바이너리 로그를 기록할지 여부를 설정합니다.
binlog_row_image : ROW 기반 바이너리 로그에 전체 행을 기록할지, 변경된 부분만 기록할지 결정합니다.
gtid_mode : GTID(Global Transaction Identifier)를 사용할지 여부를 설정합니다.
---- 슬로우 쿼리 로그 설정 ----
slow_query_log : 실행 시간이 긴 쿼리를 기록하는 슬로우 쿼리 로그를 활성화합니다.
slow_query_log_file : 슬로우 쿼리 로그 파일의 경로를 지정합니다.
long_query_time : 이 시간(초)을 초과하는 쿼리만 슬로우 쿼리 로그에 기록합니다.
log_slow_admin_statements : ALTER TABLE, ANALYZE TABLE 같은 관리 구문도 로그에 기록할지 여부를 설정합니다.
log_slow_extra : 로그에 추가적인 정보를 기록할지 여부를 결정합니다.
---- InnoDB 설정 ----
innodb_data_home_dir : 테이블스페이스 파일의 기본 디렉터리입니다.
innodb_data_file_path : InnoDB 시스템 테이블스페이스 파일의 이름과 크기를 설정합니다.
innodb_temp_data_file_path : InnoDB 임시 테이블스페이스 파일의 경로와 크기를 지정합니다.
innodb_log_group_home_dir : 리두 로그 파일이 저장되는 디렉터리입니다.
innodb_log_files_in_group : 리두 로그 그룹에 속한 파일의 개수를 설정합니다.
innodb_log_file_size : 각 리두 로그 파일의 크기를 지정합니다.
innodb_file_per_table : 각 테이블을 별도의 .ibd 파일에 저장할지 여부를 결정합니다.
innodb_undo_directory : UNDO 로그 파일이 저장되는 디렉터리입니다.
innodb_rollback_segments : 롤백 세그먼트의 개수입니다.
innodb_undo_tablespaces : UNDO 테이블스페이스의 개수를 설정합니다.
innodb_max_undo_log_size : UNDO 로그 파일의 최대 크기를 제한합니다.
innodb_undo_log_truncate : UNDO 로그 파일의 크기가 innodb_max_undo_log_size를 초과할 경우 잘라낼지 여부를 설정합니다.
innodb_sort_buffer_size : 인덱스 생성 시 사용되는 정렬 버퍼의 크기입니다.
innodb_flush_log_at_trx_commit : 커밋 시 리두 로그를 디스크에 플러시하는 방식을 제어하여 성능과 내구성 사이의 균형을 맞춥니다.
innodb_flush_method : 데이터와 로그 파일에 접근할 때 사용되는 플러시 방법을 설정합니다.
innodb_io_capacity : InnoDB가 백그라운드 I/O 작업을 위해 사용할 수 있는 최대 I/O 작업량입니다.
innodb_io_capacity_max : I/O 부하가 높을 때 InnoDB가 사용할 수 있는 최대 I/O 작업량입니다.
innodb_doublewrite : 데이터 페이지의 이중 쓰기를 활성화하여 데이터 손상을 방지합니다.
innodb_checksum_algorithm : 데이터 페이지의 손상 여부를 확인하는 체크섬 알고리즘을 설정합니다.
innodb_print_all_deadlocks : 데드락 발생 시 모든 데드락 정보를 오류 로그에 출력합니다.
innodb_status_output_locks : SHOW ENGINE INNODB STATUS 명령에 잠금 정보를 추가합니다.
innodb_ft_enable_stopword : 전문 검색(Full-Text Search)에서 불용어 사용 여부를 설정합니다.
---- 성능 스키마 설정 ----
performance_schema : 성능 스키마의 활성화 여부를 결정합니다.
performance_schema_events_stages_history_long_size : 스테이지 이력 테이블에 저장될 최대 이벤트 수를 설정합니다.
performance_schema_events_stages_history_size : 스테이지 이력 테이블의 크기를 지정합니다.
performance_schema_events_statements_history_long_size : 구문 이력 테이블에 저장될 최대 이벤트를 설정합니다.
performance_schema_events_statements_history_size : 구문 이력 테이블의 크기를 지정합니다.
performance_schema_events_waits_history_long_size : 대기 이력 테이블에 저장될 최대 이벤트를 설정합니다.
performance_schema_events_waits_history_size : 대기 이력 테이블의 크기를 지정합니다.
---- 비밀번호 유효성 검사 설정 ----
password_history : 재사용할 수 없는 이전 비밀번호의 개수를 지정합니다.
validate_password.policy : 비밀번호 유효성 검사 정책을 설정합니다. (LOW, MEDIUM, STRONG)
validate_password.length : 최소 비밀번호 길이를 지정합니다.
validate_password.mixed_case_count : 소문자, 대문자의 최소 개수를 설정합니다.
validate_password.number_count : 숫자의 최소 개수를 설정합니다.
validate_password.special_char_count : 특수 문자의 최소 개수를 설정합니다.
validate_password.dictionary_file : 비밀번호에 사용할 수 없는 단어 목록이 담긴 파일을 지정합니다.