14.3 InnoDB 구성
InnoDB 구성을 먼저 결정하는 것은 InnoDB 데이터 파일의 레이아웃 방법 및 InnoDB 스토리지 엔진에 할당 할 메모리의 양입니다. 이러한 선택을 기록하려면 시작할 때 MySQL에서 읽을 구성 파일에 기록하거나 시작 스크립트의 명령 행 옵션으로 지정합니다. 옵션 설명 및 허용되는 매개 변수 값의 전체 목록은 섹션 14.12 "InnoDB 부팅 옵션 및 시스템 변수" 를 참조하십시오.
InnoDB 테이블 스페이스 및 로그 파일 개요
InnoDB
스토리지 엔진에서 관리되는 2 개의 중요한 디스크 기반의 자원은 그 테이블 스페이스 데이터 파일과 로그 파일입니다. InnoDB
구성 옵션을 지정하지 않으면, MySQL에 의해 MySQL 데이터 디렉토리에 약간 12M 바이트보다 큰 ibdata1
라는 이름의 자동 확장 데이터 파일과 ib_logfile0
및 ib_logfile1
라는 두 개의 로그 파일이 생성됩니다. 이러한 크기는 innodb_log_file_size
시스템 변수의 크기로 지정됩니다. 적절한 성능을 보장하려면 다음 예에서 설명하는 바와 같이, InnoDB
매개 변수를 명시 적으로 지정합니다. 당연히, 하드웨어 및 요구 사항에 맞게 설정을 편집합니다.
여기 예제는 대표적인 것입니다. InnoDB
관련 구성 매개 변수에 대한 자세한 내용은 섹션 14.12 "InnoDB 부팅 옵션 및 시스템 변수" 를 참조하십시오.
저장 장치 고려 사항
경우에 따라 일부 데이터가 동일한 실제 디스크에 배치되지 않은 경우 데이터베이스의 성능이 향상 될 수 있습니다. 많은 경우 로그 파일을 데이터와는 다른 디스크에 배치하면 성능 향상에 도움이됩니다. 다음 예제에서는이 방법을 보여줍니다. 2 개의 데이터 파일이 별도의 디스크에 배치 된 로그 파일이 세 번째 디스크에 배치되어 있습니다. InnoDB
는 첫 번째 데이터 파일에서 순서대로 테이블 공간에 수용됩니다. InnoDB
데이터 파일로 RAW 디스크 파티션 (RAW 장치)를 사용할 수도 있습니다. 이로 인해 I / O의 속도를 높일 수 있습니다. 섹션 14.5.8 "공유 테이블 스페이스에서 RAW 디스크 파티션의 사용" 을 참조하십시오.
InnoDB
는 트랜잭션 안전 (ACID 준수) MySQL의 스토리지 엔진이며, 사용자 데이터를 보호하기 위해 커밋, 롤백 및 크래시 복구 기능을 제공합니다. 그러나 기본 운영 시스템과 하드웨어가 공표 한대로 작동하지 않는 경우 수행 할 수 없습니다. 많은 운영 체제 나 디스크 서브 시스템은 성능 향상을 위해 쓰기 작업이 지연되거나 다시 지시 할 수 있습니다. 일부 운영 체제에서는 바로 fsync()
시스템 호출은 파일의 모든 기록되지 않은 데이터가 플러시 될 때까지 대기해야하지만 실제로는 데이터가 안정된 스토리지에 플래시되기 전에 반환 수 있습니다. 따라서 운영 시스템 충돌이나 정전으로 인해 최근 커밋 된 데이터가 손상되거나, 심지어 최악의 경우 쓰기 작업이 다시 지시 된 위해 데이터베이스가 손상 될 수 있습니다. 데이터 무결성이 중요한 경우는 프로덕션 환경에서 뭔가를 사용하기 전에 어떻게 든 "전원 플러그를 뽑는다"테스트를 실행하십시오. OS X 10.3 이후 InnoDB
에서는 특별한 fcntl()
파일 플래시 방식이 사용됩니다. Linux는 다시 쓰기 캐시를 비활성화하는 것이 좋습니다되어 있습니다.
ATA / SATA 디스크 드라이브에서 hdparm -W0 /dev/hda
같은 명령을 사용하면 다시 쓰기 캐시를 비활성화 할 수 있습니다. 일부 드라이브 나 디스크 컨트롤러는 다시 쓰기 캐시를 비활성화 할 수 없을 수 있다는 점에 유의하십시오.
사용자를 보호하는 InnoDB
복구 기능에 관해서는 InnoDB
는 이중 기입 버퍼 로 불리는 구조에 관련한 파일 플래시 기술이 사용되어 있습니다. 이것은 기본적으로 활성화되어 있습니다 ( innodb_doublewrite=ON
). 이중 쓰기 버퍼를 사용하면 충돌이나 정전 후 복구의 안전성이 높아질뿐만 아니라 fsync()
조작의 필요성이 줄어들 기 때문에 거의 모든 종류의 Unix에서 성능이 향상됩니다. 데이터 무결성 또는 오류의 가능성에 관심이 있다면, innodb_doublewrite
옵션을 활성 상태로하는 것을 권장하고 있습니다. 이중 쓰기 버퍼의 추가 정보 섹션 14.10 "InnoDB의 디스크 I / O 및 파일 공간 관리" 를 참조하십시오.
데이터의 신뢰성이 고려 사항이있는 경우에는 NFS 볼륨에서 데이터 파일과 로그 파일이 사용되도록 InnoDB
를 구성하지 마십시오. 발생할 수있는 문제는 OS 및 NFS의 버전에 따라 다릅니다. 이러한 문제는 경쟁 쓰기에서 보호가 부족한 등의 문제와 최대 파일 크기 제한 등이 포함됩니다.
InnoDB 테이블 스페이스 파일의 위치와 크기 지정
InnoDB
테이블 스페이스 파일을 설정하려면 my.cnf
옵션 파일의 [mysqld]
섹션에서 innodb_data_file_path
옵션을 사용합니다. Windows에서는 대신 my.ini
를 사용할 수 있습니다. innodb_data_file_path
의 값은 하나 이상의 데이터 파일의 목록을 지정하도록하십시오. 여러 데이터 파일 이름을 지정하는 경우 세미콜론 ( " ;
")으로 구분합니다.
innodb_data_file_path=datafile_spec1
[;datafile_spec2
]...
예를 들어, 다음 설정은 최소 크기의 시스템 테이블 스페이스가 명시 적으로 작성됩니다.
[mysqld] innodb_data_file_path=ibdata1:12M:autoextend
이 설정은 ibdata1
라는 12M 바이트의 자동 확장 데이터 파일이 하나 구성됩니다. 파일의 위치가 지정되어 있지 않기 때문에 InnoDB
에 의해 기본적으로 MySQL 데이터 디렉토리에 생성됩니다.
K 바이트 M 바이트 또는 G 바이트의 단위를 지정하기 위해, 크기는 K
, M
또는 G
의 접미사 문자를 사용하여 지정됩니다.
데이터 디렉토리에있는 ibdata1
라는 50M 바이트의 고정 크기 데이터 파일과 ibdata2
라는 50M 바이트의 자동 확장 파일을 포함하는 테이블 스페이스는 다음과 같이 구성 할 수 있습니다.
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
데이터 파일을 지정하기위한 전체 구문은 파일 이름, 크기 및 여러 옵션 속성이 포함되어 있습니다.
file_name
:file_size
[:autoextend[:max:max_file_size
]]]
autoextend
및 max
속성은 innodb_data_file_path
행의 마지막 데이터 파일에서만 사용할 수 있습니다.
마지막 데이터 파일에 autoextend
옵션을 지정하면 테이블 공간에 여유 공간이 부족한 경우, InnoDB
는 데이터 파일을 확장합니다. 기본적으로 한 번에 8M 바이트 씩 증가됩니다. 증분을 변경하려면 innodb_autoextend_increment
시스템 변수를 변경합니다.
디스크가 꽉 차면 다른 디스크에 다른 데이터 파일을 추가하면 좋을 것입니다. 테이블 공간을 재구성하는 절차는 섹션 14.5.7 "InnoDB 로그 파일의 크기 나 변경 및 InnoDB 테이블 스페이스의 크기 변경" 을 참조하십시오.
InnoDB
는 파일 시스템의 최대 파일 크기를 인식하지 못하기 때문에 최대 파일 크기가 2G 바이트와 같은 작은 값으로되어있는 파일 시스템에서는주의하십시오. 자동 확장 데이터 파일의 최대 크기를 지정하려면 autoextend
속성의 뒤에 max
속성을 사용하십시오. 최대 크기를 초과하면 치명적인 오류가 발생 충돌 할 가능성도 있기 때문에 디스크 사용량을 제한하는 것이 매우 중요하다 경우에만 max
속성을 사용하십시오. 다음 구성에서는 ibdata1
이 최대 500M 바이트의 제한까지 증가 할 것으로 허용됩니다.
[mysqld] innodb_data_file_path=ibdata1:12M:autoextend:max:500M
InnoDB
는 기본적으로 MySQL 데이터 디렉토리에 테이블 공간 파일을 만듭니다. 장소를 명시 적으로 지정하려면 innodb_data_home_dir
옵션을 사용합니다. 예를 들어, ibdata1
및 ibdata2
라는 두 개의 파일을 사용하지만 /ibdata
디렉토리에 생성하려면 다음과 같이 InnoDB
를 구성합니다.
[mysqld] innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
InnoDB
는 디렉토리가 생성되지 않기 때문에 서버를 시작하기 전에 /ibdata
디렉토리가 있는지 확인하십시오. 이는 사용자가 구성 할 로그 파일 디렉토리에도 적용됩니다. 필요한 디렉토리를 작성하려면 Unix 또는 DOS의 mkdir
명령을 사용합니다.
MySQL 서버가 데이터 디렉토리에 파일을 생성하기위한 적절한 권한을 가지고 있는지 확인하십시오. 더 일반적으로 말하면, 서버는 데이터 파일과 로그 파일을 작성해야하는 디렉토리에 액세스 권한이 있어야합니다.
InnoDB
는 innodb_data_home_dir
의 값을 텍스트로 데이터 파일 이름에 연결시켜 필요에 따라 경로 이름 구분자 (슬래시 또는 백 슬래시)를 사이에 추가함으로써, 각 데이터 파일의 디렉토리 경로를 형성합니다 . my.cnf
에 innodb_data_home_dir
옵션이 전혀 지정되지 않은 경우 기본값이 "점"디렉토리 ./
(즉, MySQL 데이터 디렉토리)입니다. (MySQL 서버는 실행을 시작할 때 현재 작업 디렉토리를 데이터 디렉토리로 변경합니다.)
innodb_data_home_dir
를 빈 문자열로 지정하면 innodb_data_file_path
값에 나열 된 데이터 파일에 절대 경로를 지정할 수 있습니다. 다음 예제는 이전 예제와 동일합니다.
[mysqld] innodb_data_home_dir = innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
InnoDB 구성 옵션 지정
소규모 시스템 용 샘플 my.cnf
파일. 512M 바이트의 RAM과 1 개의 하드 디스크가 탑재 된 컴퓨터를 사용한다고 가정합니다. 다음 예제에서는 autoextend
속성을 포함 InnoDB
의 my.cnf
또는 my.ini
에서 지정 가능한 구성 매개 변수를 보여줍니다. 이 예는 InnoDB
데이터 파일과 로그 파일을 여러 디스크에 분산하는 것을 원하지 않는, Unix 및 Windows 모두 대부분의 사용자에게 적합합니다. 여기에서는 MySQL 데이터 디렉토리에 자동 확장 데이터 파일 ibdata1
과 두 개의 InnoDB
로그 파일 ib_logfile0
및 ib_logfile1
를 만듭니다.
[mysqld] # You can write your other MySQL server options here # ... # Data files must be able to hold your data and indexes. # Make sure that you have enough free disk space. innodb_data_file_path = ibdata1:12M:autoextend # # Set buffer pool size to 50-80% of your computer's memory innodb_buffer_pool_size=256M innodb_additional_mem_pool_size=20M # # Set the log file size to about 25% of the buffer pool size innodb_log_file_size=64M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1
일부 파일 시스템에서는 데이터 파일을 2G 바이트 미만으로 할 필요가 있다는 점에 유의하십시오. 로그 파일을 결합한 크기는 최대 512G 바이트까지 할 수 있습니다. 데이터 파일을 결합한 크기는 10M 바이트 조금 넘는 크기로해야합니다.
InnoDB 시스템 테이블 스페이스의 설정
처음 InnoDB
시스템 테이블 스페이스를 작성할 때 명령 프롬프트에서 MySQL 서버를 시작하는 방법이 가장 좋습니다. 그 후, 데이터베이스 작성에 대한 정보가 InnoDB
화면에 출력되기 때문에 무엇이 발생하고 있는지를 확인할 수 있습니다. 예를 들어, Windows의 경우, mysqld가 C:\Program Files\MySQL\MySQL Server 5.6\bin
에 배치되어 있으면, 다음과 같이 시작할 수 있습니다.
C:\> "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld" --console
서버의 출력이 화면에 전송되지 않은 경우 서버 오류 로그를 확인하여 부팅 과정에서 InnoDB
에서 출력 된 내용을 확인하십시오.
InnoDB
에 표시되는 정보의 출력 내용은 섹션 14.5.1 "InnoDB 테이블 공간 만들기" 를 참조하십시오.
MySQL 구성 파일 편집
서버 시작시 읽는 어떤 옵션 파일의 [mysqld]
그룹에 InnoDB
옵션을 지정할 수 있습니다. 옵션 파일의 위치는 섹션 4.2.6 "옵션 파일 사용" 에 설명되어 있습니다.
설치 및 구성 마법사를 사용하여 MySQL을 Windows에 설치 한 경우, 옵션 파일이 MySQL 설치 디렉토리 내에 배치 된 my.ini
파일입니다. 섹션 2.3.3 "MySQL Installer를 사용하여 MySQL의 Microsoft Windows에 설치" 를 참조하십시오.
C:
드라이브가 부팅 드라이브가 아닌 부트 로더가 PC에서 사용되는 경우 Windows 디렉토리 (일반적으로 C:\WINDOWS
)의 my.ini
파일을 사용하는 것이 유일한 옵션입니다. 콘솔 창에서 명령 프롬프트에서 SET
명령을 사용하면 WINDIR
의 값을 출력 할 수 있습니다.
C:\> SET WINDIR
windir=C:\WINDOWS
mysqld에서 특정 파일에서 옵션 만 읽을 수 있는지 확인하려면 서버를 시작할 때 --defaults-file
옵션을 명령 행의 첫 번째 옵션으로 사용합니다.
mysqld --defaults-file=your_path_to_my_cnf
대규모 시스템을위한 샘플 my.cnf
파일. 디렉토리 경로 /
, / /dr2
및 /dr3
에 2G 바이트의 RAM과 3 개의 60G 바이트 하드 디스크가 탑재 된 Linux 컴퓨터를 사용한다고 가정합니다. 다음 예제에서는 InnoDB
의 my.cnf
에서 지정 가능한 구성 매개 변수를 보여줍니다.
[mysqld] # You can write your other MySQL server options here # ... innodb_data_home_dir = # # Data files must be able to hold your data and indexes innodb_data_file_path = /db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend # # Set buffer pool size to 50-80% of your computer's memory, # but make sure on Linux x86 total memory usage is < 2GB innodb_buffer_pool_size=1G innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # # Set the log file size to about 25% of the buffer pool size innodb_log_file_size=250M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1 innodb_lock_wait_timeout=50 # # Uncomment the next line if you want to use it #innodb_thread_concurrency=5
InnoDB의 최대 메모리 할당 결정
32 비트 버전의 GNU / Linux x86에서는 너무 높은 메모리 사용량을 설정하지 않도록주의하십시오. glibc
는 프로세스 힙이 스레드 스택에서 증가하는 것이 허가되어있을 수 있기 때문에 서버가 충돌합니다. 다음 식의 값이 2G 바이트에 접근하고, 초과 할 경우 위험합니다.
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
각 스레드는 스택을 사용 (많은 경우는 2M 바이트이지만, Oracle Corporation이 제공하는 MySQL 바이너리는 256K 바이트 만), 최악의 경우, sort_buffer_size + read_buffer_size
의 추가 메모리도 사용됩니다.
다른 mysqld 서버 파라미터의 조정. 다음 값은 일반적인 현상이며 대부분의 사용자에게 적합합니다.
[mysqld]
skip-external-locking
max_connections=200
read_buffer_size=1M
sort_buffer_size=1M
#
# Set key_buffer to 5 - 50% of your RAM depending on how much
# you use MyISAM tables, but keep key_buffer_size + InnoDB
# buffer pool size < 80% of your RAM
key_buffer_size=value
Linux의 경우 커널에서 대형 페이지 지원이 활성화되어 있으면, InnoDB
버퍼 풀이나 추가 메모리 풀의 메모리를 할당 할 때 큰 페이지를 사용할 수 있습니다. 섹션 8.11.4.2 "대형 페이지 지원 활성화" 를 참조하십시오.