Loading...
MySQL 9.5 Reference Manual 9.5의 17.8.1 InnoDB Startup Configuration의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
InnoDB 구성에 대한 첫 번째 결정 사항은 데이터 파일, 로그 파일, 페이지 크기, 메모리 버퍼의 설정이며, 이는 InnoDB를 초기화하기 전에 설정되어야 합니다. InnoDB가 초기화된 후에 구성을 수정하는 것은 간단하지 않은 절차를 수반할 수 있습니다.
이 섹션에서는 구성 파일에서 InnoDB 설정을 지정하는 방법, InnoDB 초기화 정보를 확인하는 방법, 그리고 중요한 스토리지 관련 고려 사항을 제공합니다.
MySQL은 데이터 파일, 로그 파일, 페이지 크기 설정을 사용하여 InnoDB를 초기화하기 때문에, 이 설정들을 MySQL이 시작 시, InnoDB를 초기화하기 전에 읽는 옵션 파일에 정의하는 것을 권장합니다. 일반적으로 InnoDB는 MySQL 서버가 처음 시작될 때 초기화됩니다.
InnoDB 옵션은 서버가 시작될 때 읽는 임의의 옵션 파일의 [mysqld] 그룹에 지정할 수 있습니다. MySQL 옵션 파일의 위치에 대해서는 Section 6.2.2.2, “Using Option Files”를 참고하십시오.
[mysqld](https://dev.mysql.com/doc/refman/9.5/en/mysqld.html "6.3.1 mysqld — The MySQL Server)가 특정 파일(및 mysqld-auto.cnf)에서만 옵션을 읽도록 하려면, 서버를 시작할 때 커맨드 라인의 첫 번째 옵션으로 --defaults-file 옵션을 사용하십시오:
1mysqld --defaults-file=path_to_option_file
시작 중에 InnoDB 초기화 정보를 보려면, 명령 프롬프트에서 mysqld를 시작하십시오. 그러면 콘솔에 초기화 정보가 출력됩니다.
예를 들어, Windows에서 mysqld가 C:\Program Files\MySQL\MySQL Server 9.5\bin에 있는 경우, MySQL 서버를 다음과 같이 시작합니다:
1C:\> "C:\Program Files\MySQL\MySQL Server 9.5\bin\mysqld" --console
유닉스 계열 시스템에서는 mysqld가 MySQL 설치의 bin 디렉터리에 있습니다:
1$> bin/mysqld --user=mysql &
서버 출력을 콘솔로 보내지 않는 경우, 시작 후 에러 로그를 확인하여 시작 과정에서 InnoDB가 출력한 초기화 정보를 확인하십시오.
다른 방법을 사용하여 MySQL을 시작하는 방법에 대한 정보는 Section 2.9.5, “Starting and Stopping MySQL Automatically”를 참조하십시오.
참고
InnoDB는 시작 시 모든 사용자 테이블 및 연관된 데이터 파일을 열지 않습니다. 그러나 InnoDB는 데이터 딕셔너리에서 참조되는 테이블스페이스 파일의 존재 여부는 확인합니다. 테이블스페이스 파일을 찾을 수 없으면, InnoDB는 에러를 로그하고 시작 시퀀스를 계속 진행합니다. 크래시 복구 시 리두를 적용하기 위해 리두 로그에서 참조되는 테이블스페이스 파일이 열릴 수 있습니다.
시작 구성을 진행하기 전에 다음과 같은 스토리지 관련 고려 사항들을 검토하십시오.
일부 경우, 데이터 파일과 로그 파일을 서로 다른 물리 디스크에 두면 데이터베이스 성능이 향상될 수 있습니다. 또한, InnoDB 데이터 파일에 대해 로우 디스크 파티션(raw 디바이스)을 사용하여 I/O를 빠르게 할 수 있습니다. 자세한 내용은 Using Raw Disk Partitions for the System Tablespace를 참조하십시오.
InnoDB는 사용자 데이터를 보호하기 위해 커밋, 롤백, 크래시 복구 기능을 제공하는 트랜잭션 세이프(ACID 준수) 스토리지 엔진입니다. 하지만, 이는 기본이 되는 운영 체제나 하드웨어가 광고된 대로 동작하지 않는 경우에는 불가능합니다. 많은 운영 체제 또는 디스크 서브시스템은 성능을 개선하기 위해 쓰기 작업을 지연하거나 재정렬할 수 있습니다. 일부 운영 체제에서는 파일에 대해 아직 쓰이지 않은 모든 데이터가 안정적인 스토리지에 플러시될 때까지 기다려야 하는 fsync() 시스템 콜조차도 실제로 데이터가 안정적인 스토리지에 플러시되기 전에 리턴할 수 있습니다.
이 때문에 운영 체제 크래시 또는 전원 장애는 최근에 커밋된 데이터를 손상시킬 수 있으며, 최악의 경우, 쓰기 작업이 재정렬되었기 때문에 데이터베이스 자체를 손상시킬 수도 있습니다. 데이터 무결성이 중요하다면, 프로덕션 환경에서 사용하기 전에 “pull-the-plug” 테스트를 수행하십시오. macOS에서는, InnoDB가 특별한 fcntl() 파일 플러시 방법을 사용합니다. Linux에서는 라이트백 캐시를 비활성화하는 것이 바람직합니다.
ATA/SATA 디스크 드라이브에서는 hdparm -W0 /dev/hda와 같은 명령으로 라이트백 캐시를 비활성화할 수 있습니다. 일부 드라이브나 디스크 컨트롤러는
라이트백 캐시를 비활성화하지 못할 수도 있다는 점에 유의하십시오.
사용자 데이터를 보호하는 InnoDB 복구 기능과 관련하여, InnoDB는 doublewrite buffer라고 하는 구조를 포함하는 파일 플러시 기법을 사용하며, 이 기법은 기본적으로 활성화되어 있습니다(innodb_doublewrite=ON). doublewrite 버퍼는 예기치 않은 종료나 전원 장애 이후 복구 시 안전성을 높여 주며, 대부분의 유닉스 계열 시스템에서 fsync() 연산의 필요성을 줄여 성능을 개선합니다. 데이터 무결성 또는 잠재적인 장애가 우려되는 경우 innodb_doublewrite 옵션을 활성화된 상태로 유지할 것을 권장합니다. doublewrite 버퍼에 대한 정보는 Section 17.11.1, “InnoDB Disk I/O”를 참조하십시오.
InnoDB에서 NFS를 사용하기 전에, Using NFS with MySQL에 설명된 잠재적인 문제를 검토하십시오.
innodb_data_file_path 옵션은 InnoDB 시스템 테이블스페이스 데이터 파일의 이름, 크기, 속성을 정의합니다. MySQL 서버를 초기화하기 전에 이 옵션을 설정하지 않으면, 기본 동작은 약간 12MB보다 큰 크기의 자동 확장 데이터 파일 하나를 ibdata1이라는 이름으로 생성하는 것입니다:
1mysql> SHOW VARIABLES LIKE 'innodb_data_file_path'; 2+-----------------------+------------------------+ 3| Variable_name | Value | 4+-----------------------+------------------------+ 5| innodb_data_file_path | ibdata1:12M:autoextend | 6+-----------------------+------------------------+
전체 데이터 파일 명세 구문에는 파일 이름, 파일 크기, autoextend 속성, max 속성이 포함됩니다:
1file_name:file_size[:autoextend[:max:max_file_size]]
파일 크기는 크기 값 뒤에 K, M, G를 붙여 킬로바이트, 메가바이트, 기가바이트 단위로 지정합니다. 데이터 파일 크기를 킬로바이트 단위로 지정하는 경우 1024의 배수로 지정해야 합니다. 그렇지 않으면 킬로바이트 값은 가장 가까운 메가바이트(MB) 단위로 반올림됩니다. 파일 크기의 합은 최소한 약간 12MB보다 커야 합니다.
세미콜론으로 구분된 목록을 사용하여 둘 이상의 데이터 파일을 지정할 수 있습니다. 예를 들면 다음과 같습니다:
1[mysqld] 2innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
autoextend 및 max 속성은 마지막에 지정된 데이터 파일에만 사용할 수 있습니다.
autoextend 속성이 지정되면, 데이터 파일은 공간이 필요할 때마다 64MB 단위로 크기가 자동으로 증가합니다. innodb_autoextend_increment 변수는 증가 크기를 제어합니다.
자동 확장 데이터 파일의 최대 크기를 지정하려면, autoextend 속성 뒤에 max 속성을 사용하십시오. 디스크 사용량을 제한하는 것이 매우 중요한 경우에만 max 속성을 사용하십시오. 다음 구성은 ibdata1이 최대 500MB까지 커질 수 있도록 허용합니다:
1[mysqld] 2innodb_data_file_path=ibdata1:12M:autoextend:max:500M
doublewrite 버퍼 페이지에 충분한 공간이 있도록 하기 위해 첫 번째 시스템 테이블스페이스 데이터 파일에 대해 최소 파일 크기가 강제됩니다. 다음 표는 각 InnoDB 페이지 크기에 대한 최소 파일 크기를 보여 줍니다. 기본 InnoDB 페이지 크기는 16384(16KB)입니다.
| Page Size (innodb_page_size) | Minimum File Size |
|---|---|
| 16384 (16KB) or less | 5MB |
| 32768 (32KB) | 6MB |
| 65536 (64KB) | 12MB |
디스크가 가득 찬 경우, 다른 디스크에 데이터 파일을 추가할 수 있습니다. 절차에 대해서는 Resizing the System Tablespace를 참조하십시오.
개별 파일의 크기 제한은 운영 체제에 의해 결정됩니다. 대용량 파일을 지원하는 운영 체제에서는 파일 크기를 4GB 이상으로 설정할 수 있습니다. 또한 로우 디스크 파티션을 데이터 파일로 사용할 수도 있습니다. 자세한 내용은 Using Raw Disk Partitions for the System Tablespace를 참조하십시오.
InnoDB는 파일 시스템의 최대 파일 크기를 인지하지 못하므로, 최대 파일 크기가 2GB와 같이 작은 값인 파일 시스템에서는 주의해야 합니다.
기본적으로 시스템 테이블스페이스 파일은 데이터 디렉터리에 생성됩니다(datadir). 다른 위치를 지정하려면 innodb_data_home_dir 옵션을 사용하십시오. 예를 들어, myibdata라는 디렉터리에 시스템 테이블스페이스 데이터 파일을 생성하려면 다음과 같이 설정합니다:
1[mysqld] 2innodb_data_home_dir = /myibdata/ 3innodb_data_file_path=ibdata1:50M:autoextend
innodb_data_home_dir 값을 지정할 때는 끝에 슬래시를 붙여야 합니다. InnoDB는 디렉터리를 생성하지 않으므로, 서버를 시작하기 전에 지정한 디렉터리가 존재하는지 확인하십시오. 또한, MySQL 서버가 해당 디렉터리에 파일을 생성할 수 있는 적절한 액세스 권한을 가지고 있는지 확인해야 합니다.
InnoDB는 각 데이터 파일의 디렉터리 경로를 구성할 때 innodb_data_home_dir 값을 데이터 파일 이름에 문자 그대로 이어 붙입니다. innodb_data_home_dir가 정의되지 않은 경우 기본 값은 데이터 디렉터리를 의미하는 “./”입니다. (MySQL 서버는 실행을 시작할 때 현재 작업 디렉터리를 데이터 디렉터리로 변경합니다.)
또는, 시스템 테이블스페이스 데이터 파일에 대해 절대 경로를 지정할 수도 있습니다. 다음 구성은 앞의 예와 동일합니다:
1[mysqld] 2innodb_data_file_path=/myibdata/ibdata1:50M:autoextend
innodb_data_file_path에 절대 경로를 지정하는 경우, 해당 설정은 innodb_data_home_dir 설정과 이어 붙여지지 않습니다. 시스템 테이블스페이스 파일은 지정된 절대 경로에 생성됩니다. 서버를 시작하기 전에 지정한 디렉터리가 존재해야 합니다.
InnoDB doublewrite 버퍼 스토리지 영역은 doublewrite 파일에 존재하며, 이는 doublewrite 페이지의 스토리지 위치에 대한 유연성을 제공합니다. 이전 릴리스에서는 doublewrite 버퍼 스토리지 영역이 시스템 테이블스페이스에 있었습니다. innodb_doublewrite_dir 변수는 시작 시 InnoDB가 doublewrite 파일을 생성하는 디렉터리를 정의합니다. 디렉터리가 지정되지 않으면, doublewrite 파일은 innodb_data_home_dir 디렉터리에 생성되며, 이 값이 지정되지 않은 경우 기본적으로 데이터 디렉터리가 됩니다.
doublewrite 파일을 innodb_data_home_dir 디렉터리가 아닌 다른 위치에 생성하려면, innodb_doublewrite_dir 변수를 설정하십시오. 예를 들면 다음과 같습니다:
1innodb_doublewrite_dir=/path/to/doublewrite_directory
다른 doublewrite 버퍼 변수는 doublewrite 파일의 개수, 스레드당 페이지 수, doublewrite 배치 크기를 정의할 수 있게 해 줍니다. doublewrite 버퍼 구성에 대한 자세한 내용은 Section 17.6.4, “Doublewrite Buffer”를 참조하십시오.
리두 로그 파일이 차지하는 디스크 공간 양은 innodb_redo_log_capacity 변수에 의해 제어되며, 이 변수는 시작 또는 런타임에 설정할 수 있습니다. 예를 들어, 옵션 파일에서 이 변수를 8GiB로 설정하려면 다음 항목을 추가합니다:
1[mysqld] 2innodb_redo_log_capacity = 8589934592
런타임에 리두 로그 용량을 설정하는 방법에 대한 정보는 Configuring Redo Log Capacity를 참조하십시오.
InnoDB는 각 파일이 innodb_redo_log_capacity의 1/32와 같은 크기를 갖도록 32개의 리두 로그 파일을 유지하려고 합니다. 리두 로그 파일은 데이터 디렉터리의 #innodb_redo 디렉터리에 위치하며, innodb_log_group_home_dir 변수를 사용해 다른 디렉터리를 지정하지 않은 경우 그렇습니다. innodb_log_group_home_dir가 정의된 경우, 리두 로그 파일은 해당 디렉터리의 #innodb_redo 디렉터리에 위치합니다. 자세한 내용은 Section 17.6.5, “Redo Log”를 참조하십시오.
innodb_log_group_home_dir는 InnoDB 로그 파일의 디렉터리 경로를 정의합니다. 이 옵션을 사용하여 InnoDB 리두 로그 파일을 InnoDB 데이터 파일과 다른 물리적 스토리지 위치에 둘 수 있으며, 이를 통해 잠재적인 I/O 리소스 경합을 피할 수 있습니다. 예를 들면 다음과 같습니다:
1[mysqld] 2innodb_log_group_home_dir = /dr3/iblogs
참고
InnoDB는 디렉터리를 생성하지 않으므로, 서버를 시작하기 전에 로그 디렉터리가 존재하는지 확인하십시오. 필요한 디렉터리를 생성하려면 유닉스 또는 DOS mkdir 명령을 사용하십시오.
MySQL 서버가 로그 디렉터리에 파일을 생성할 수 있도록 적절한 액세스 권한이 있는지 확인하십시오. 보다 일반적으로, 서버는 파일을 생성해야 하는 모든 디렉터리에 대한 액세스 권한을 가져야 합니다.
기본적으로 Undo 로그는 MySQL 인스턴스가 초기화될 때 생성되는 두 개의 undo 테이블스페이스에 존재합니다.
innodb_undo_directory 변수는 InnoDB가 기본 undo 테이블스페이스를 생성하는 경로를 정의합니다. 이 변수가 정의되지 않은 경우, 기본 undo 테이블스페이스는 데이터 디렉터리에 생성됩니다. innodb_undo_directory 변수는 동적이 아닙니다. 이를 설정하려면 서버를 재시작해야 합니다.
Undo 로그의 I/O 패턴 때문에 undo 테이블스페이스는 SSD 스토리지에 적합합니다.
추가 undo 테이블스페이스를 구성하는 방법에 대한 정보는 Section 17.6.3.4, “Undo Tablespaces”를 참조하십시오.
global temporary 테이블스페이스는 사용자가 생성한 임시 테이블에 대한 변경 사항을 위한 롤백 세그먼트를 저장합니다.
단일 자동 확장 global temporary 테이블스페이스 데이터 파일은 기본적으로 innodb_data_home_dir 디렉터리에 ibtmp1이라는 이름으로 존재합니다. 초기 파일 크기는 약간 12MB보다 큽니다.
innodb_temp_data_file_path 옵션은 global temporary 테이블스페이스 데이터 파일의 경로, 파일 이름, 파일 크기를 지정합니다. 파일 크기는 크기 값 뒤에 K, M, G를 붙여 KB, MB, GB 단위로 지정합니다. 파일 크기 또는 파일 크기의 합은 약간 12MB보다 커야 합니다.
global temporary 테이블스페이스 데이터 파일의 다른 위치를 지정하려면 시작 시 innodb_temp_data_file_path 옵션을 설정하십시오.
MySQL 9.5에서는 InnoDB가 internal temporary 테이블의 디스크 기반 스토리지 엔진으로 항상 사용됩니다.
innodb_temp_tablespaces_dir 변수는 InnoDB가 세션 temporary 테이블스페이스를 생성하는 위치를 정의합니다. 기본 위치는 데이터 디렉터리의 #innodb_temp 디렉터리입니다.
세션 temporary 테이블스페이스의 다른 위치를 지정하려면 시작 시 innodb_temp_tablespaces_dir 변수를 설정하십시오. 데이터 디렉터리 기준 상대 경로 또는 완전한 경로 모두 허용됩니다.
innodb_page_size 옵션은 MySQL 인스턴스의 모든 InnoDB 테이블스페이스에 대한 페이지 크기를 지정합니다. 이 값은 인스턴스가 생성될 때 설정되며 이후에는 변경되지 않습니다. 유효한 값은 64KB, 32KB, 16KB(기본값), 8KB, 4KB입니다. 또는 65536, 32768, 16384, 8192, 4096과 같이 바이트 단위로 페이지 크기를 지정할 수도 있습니다.
기본 16KB 페이지 크기는 특히 테이블 스캔을 포함하는 쿼리 및 벌크 업데이트를 포함하는 DML 작업에 대해 폭넓은 워크로드에 적합합니다. 더 작은 페이지 크기는 많은 작은 쓰기가 발생하는 OLTP 워크로드에서 더 효율적일 수 있으며, 이 경우 하나의 페이지에 많은 행이 포함되어 경합이 문제가 될 수 있습니다. 또한 더 작은 페이지는 일반적으로 작은 블록 크기를 사용하는 SSD 스토리지 디바이스에 대해 더 효율적일 수 있습니다. InnoDB 페이지 크기를 스토리지 디바이스 블록 크기와 가깝게 유지하면 변경되지 않은 데이터가 디스크에 다시 쓰이는 양을 최소화합니다.
주의
innodb_page_size는 데이터 디렉터리를 초기화할 때만 설정할 수 있습니다. 자세한 내용은 이 변수의 설명을 참조하십시오.
MySQL은 데이터베이스 작업의 성능을 향상하기 위해 다양한 캐시와 버퍼에 메모리를 할당합니다. InnoDB에 메모리를 할당할 때는 항상 운영 체제에 필요한 메모리, 다른 애플리케이션에 할당된 메모리, 그리고 다른 MySQL 버퍼 및 캐시에 할당된 메모리를 고려해야 합니다. 예를 들어, MyISAM 테이블을 사용하는 경우, 키 버퍼(key_buffer_size)에 할당된 메모리를 고려해야 합니다. MySQL 버퍼 및 캐시 개요는 Section 10.12.3.1, “How MySQL Uses Memory”를 참고하십시오.
InnoDB에 특화된 버퍼는 다음 파라미터를 사용하여 설정합니다:
innodb_buffer_pool_size는 버퍼 풀의 크기를 정의하며, 이는 InnoDB 테이블, 인덱스 및 기타 보조 버퍼의 캐시된 데이터를 저장하는 메모리 영역입니다. 버퍼 풀의 크기는 시스템 성능에 중요하며, 일반적으로 innodb_buffer_pool_size를 시스템 메모리의 50%에서 75% 사이로 설정하는 것이 권장됩니다. 기본 버퍼 풀 크기는 128MB입니다.추가 가이드는 Section 10.12.3.1, “How MySQL Uses Memory”를 참조하십시오. InnoDB 버퍼 풀 크기를 설정하는 방법에 대한 정보는 Section 17.8.3.1, “Configuring InnoDB Buffer Pool Size”를 참조하십시오. 버퍼 풀 크기는 시작 또는 동적으로 설정할 수 있습니다.
대용량 메모리를 탑재한 시스템에서는 버퍼 풀을 여러 버퍼 풀 인스턴스로 나누어 동시성을 개선할 수 있습니다. 버퍼 풀 인스턴스 수는 innodb_buffer_pool_instances 옵션으로 제어됩니다. 기본적으로 InnoDB는 하나의 버퍼 풀 인스턴스를 생성합니다. 버퍼 풀 인스턴스의 수는 시작 시 설정할 수 있습니다. 자세한 내용은 Section 17.8.3.2, “Configuring Multiple Buffer Pool Instances”를 참조하십시오.
innodb_log_buffer_size는 InnoDB가 디스크의 로그 파일에 쓰기할 때 사용하는 버퍼의 크기를 정의합니다. 기본 크기는 64MB입니다. 큰 로그 버퍼는 트랜잭션이 커밋되기 전에 로그를 디스크에 쓰지 않고도 큰 트랜잭션을 실행할 수 있게 해 줍니다. 많은 행을 업데이트, 삽입 또는 삭제하는 트랜잭션이 있는 경우, 디스크 I/O를 줄이기 위해 로그 버퍼 크기를 늘리는 것을 고려할 수 있습니다. innodb_log_buffer_size는 시작 시 설정할 수 있습니다. 관련 정보는 Section 10.5.4, “Optimizing InnoDB Redo Logging”을 참조하십시오.주의
32-bit GNU/Linux x86에서 메모리 사용량이 너무 높게 설정되면, glibc가 프로세스 힙이 스레드 스택 위로 확장되도록 허용하여 서버 장애를 유발할 수 있습니다. 이는 mysqld 프로세스에 대해 글로벌 및 스레드당 버퍼와 캐시에 할당된 메모리가 2GB에 가깝거나 이를 초과하는 경우 위험합니다.
다음과 같이 MySQL에 대해 글로벌 및 스레드당 메모리 할당을 계산하는 공식은 MySQL 메모리 사용량을 추정하는 데 사용할 수 있습니다. 사용하는 MySQL 버전 및 구성에 따라 버퍼와 캐시를 반영하도록 공식을 수정해야 할 수도 있습니다. MySQL 버퍼 및 캐시 개요는 Section 10.12.3.1, “How MySQL Uses Memory”를 참조하십시오.
1innodb_buffer_pool_size 2+ key_buffer_size 3+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) 4+ max_connections*2MB
각 스레드는 스택(일반적으로 2MB이지만, Oracle Corporation에서 제공하는 MySQL 바이너리에서는 256KB만 사용)을 사용하며, 최악의 경우 sort_buffer_size + read_buffer_size만큼의 추가 메모리를 사용할 수 있습니다.
Linux에서 커널이 대용량 페이지 지원을 활성화한 경우, InnoDB는 버퍼 풀에 할당된 메모리에 대해 대용량 페이지를 사용할 수 있습니다. 자세한 내용은 Section 10.12.3.3, “Enabling Large Page Support”를 참조하십시오.
17.8 InnoDB Configuration
17.8.2 Configuring InnoDB for Read-Only Operation