MariaDB/Admin

[MariaDB][Admin]스토리지 엔진 - InnoDB

DBA_JSH 2015. 10. 20. 18:16

1.InnoDB 스토리지 엔진

  - 멀티스레드 기반의 언두 퍼지(Multi threaded purge)

  - InnoDB는 MVCC와 롤백을 위해서 언두 영역(언두 스페이스,롤백 세그먼트)를 별도로 관리 한다.


1.1 언두퍼지(Undo purge)

  - 많은 클라이언트 커넥션에서 데이터를 변경하게 되면 언두 로그 영역에 수많은 변경 전 정보들이 쌓이게 되는데,이렇게 쌓인 언두 로그를 언젠가는 삭제를 하고 빈 공간을 마련해야 이후의 변경 이력을 저장 할 수 있게 한다.  InnoDB에서는 언두퍼지를 전담하는 별도의 스레디가 존재하며, Innodb_purge_threads 시스템 설정 변수로 언두 퍼지 개수 설정 가능.값이 0이면 마스터 스레드 사용(5.5 이전 메커니즘), 1이면 1개의 언두 퍼지 , 2이상이면 다수의 언두 퍼지 사용 한다.

 

1.2 독립된 플러시 스레드

  - 사용자가 DML문장을 실행하면 변경된 데이터는 먼저 리두 로그에 기록되면서 디스크에 영구적으로 기록

  - InnoDB 스토리지 엔진은 실제 테이블의 데이터를 메모리(버퍼풀) 상에서만 변경 à 사용자에게 쿼리가 실행 완료 보고

  - InnoDB는 메모리상에만 변경되어 있는 데이터(dirty)를 언제가 디스크에 영구적으로 기록해야 하는데 이 작업을 플러시(Flush)

 

1.3 가변 페이지 사이즈

  -  InnoDB에서는 데이터나 인덱스 페이지의 크기를 기존 16kb에서 4kb 또는 4kb로 조정 할 수 있게 되었다.

  - 권장 방법 : 프라이머리 키나 인덱스를 통해서 1~2건의 레코드를 읽는 단순한 형태의 쿼리들이 빈번이 일어나는 서버는 4KB

 

1.4 데이블스페이스 복사 및 이관 작업 


[SQL]

 

1.4.1 테이블 스페이스 익스포트 과정

  - FLUSH TABLES 테이블명 FOR EXPORT(테이블에 명시적인 잠금이 걸리게 됨(TX락 개념)

 

 -cp 경로/명.ibd 경로/a명.cfg /복사 폴더

  - UNLOCK TABLES;

 

1.4.2 테이블 스페이스 임포트 과정

  - ALTER TABLE 테이블 명 DISCARD TABLESPACE;

  - cp 경로/명.ibd 경로/a명.cfg /복사 폴더

  - ALTER TABLE 테이블명 IMPORT TABLESPACE;

  - SELECT * FROM 테이블명

제약 사항 : 테이블 스페이스를 익스포트해서 임포트 할 때 테이블의 이름은 달라도 되지만 반드시 동일한 테이블 구조와 스토리지 엔진인 경우에만 가능 !!!

 

1.5 독립된 언두 스페이스

  - 5.5 이전버전까지는 언두 영역이 시스템 테이블 스페이스의 일부 영역 사용하였으나, 5.6 이상에서는 별도의 공간에 저장 할 수 있도록 시스템 설정 변수 도입됨.

  - Innodb_undo_directory : 언두 영역이 저장 될 디렉터리를 설정( 기본 값 "."이며 이것은 시스템 테이블 스페이스를 사용 하겠다는 것을 의미)

  - Innodb_undo_tablespaces : 일반 테이블의 레코드를 파티션 하듯 언두 영역도 여러 개의 테이블 스페이스로 분리 생성 가능. 126개까지 생성 가능 .

  - Innodb_undo_logs : 언두 세드먼트의 개수를 지정하는 시스템 변수 최대 1023개의 쓰기 트랜잭션이 하나의 언두 세그먼트를 공유 가능. 만약 undo_logs를 20으로 설정 한다면 1023*20개의 쓰기 트렌잭션이 실행 될 수 있다. 단, 한번 증가된 언두 세그먼트의 개수는 데이터베이스를 새로 생성하지 않는 이상 줄일 수 없기 때문에 첨부터 작은 값부터 시작해서 증가 시키는 것이 좋다.

 

1.6 읽기 전용 트랜잭션 최적화

  - START TRANSACTION READ ONLY로 시작된 트랜잭션. AutoCommit이 활성화된 상태에서 SELECT 쿼리만 실행 된 트렌잭션(FOR UPDATE 제외)

위의 두 조건을 만족하는 트랜잭션에 대해서는 읽기 전용 트랜잭션이라는 것을 알아채고 트랜젝션 ID를 발급하지 않고, 메모리 구조체들을 할당 받지 않게 됨으로 빠른 성능

  - 정보 확인 : information_schema 데이터베이스의 INNODB_TRX테이블의 trx_is_read_only 컬럼에서 구분 할 수 있다.

 

1.7 버퍼 풀 덤프 & 로드

  - InnoDB에서는 버퍼풀의 모든 내용이 텅 비어 있는 상태로 시작. 서버가 재시작되면 메모리에는 아무런 데이터가 없기 때문에 모든 쿼리가 디스크에서 읽어야 한다.

  - Innodb_buffer_pool_dump_now : 값은 항상 OFF로 설정, 값을 ON으로 설정하면 즉시 InnoDB 버퍼 풀의 내용을 덤프 한다. 버퍼 풀의 덤프가 완료  - 되면 이 변수 값은 다시 자동으로 OFF로 재설정

  - Innodb_buffer_pool_load_now: 값은 항상 OFF로 설정, 값을 ON으로 설정하면 Innodb_buffer_pool_filename시스템 설정 변수에 저장된 파일을 읽어서 데이터와 인덱스 페이지들을 InnoDB 버퍼 풀에 적재. 완료 되면 OFF

  - Innodb-buffer_pool_dump_at_shutdown : 이 변수가 ON으로 설정 되어 있다면, 서버가 셧다운될 때 InnoDB 버퍼 풀의 내용을 파일로 덤프 한다

  - Innodb_buffer_pool_load_at_startup : 이 변수가 ON으로 설정 되어 있다면, 서버가 시작 될 때 innodb_buffer_pool_filename 시스템 설정 변수에 지정된 파일을 읽어서 데이터와 인덱스 페이지들을 innodb 버퍼 풀에 적재

  - 사용 방법 : SET GLOBAL innodb_buffer_pool_dump_now =ON; //버퍼 풀의 내용을 덤프

  - Innodb_buffer_pool_dump_status, Innodb_buffer_pool_load_status 두 개의 상태 변수를 이용하면 버퍼 풀 덤프나 적재가 얼마나 진행되었는지 확인 가능.


1.8 리두 로그 사이즈

  - 리두 로그 처리 메커니즘 : 커밋 된 트랜잭션 내용을 먼저 로그 파일로 기록하고 실제 데이터 파일의 변경은 나중에 모아서 배치 형태로 처리(WAL).InnoDB의 로그는 여러 개의 파일이 하나의 논리적 저장소처럼 순환되면서 사용.

  - Innodb_log_file_size : 로그 파일 사이즈 설정 , 서버가 처음 시작되면서 지정된 사이즈로 생성하기 때문에 가변적으로 크기가 바뀌지 않는다. 서버를 클린 셧다운 후에만 사이즈 조정 가능

  - Innodb_log_files_in_group : 로그 파일의 개수를 몇 개로 생성할지를 결정하는 시스템 변수. Innodb_log_file_size * innodb_log_files_in_group만큼 생성

  - InnoDB_log_group_home_Ddir : 리두 로그를 생성 할 디렉토리를 설정 하는 변수, 값이 명시되지 않으면 로그 파일 데이터 디렉토리에 생성.

 

1.8.1 리두 로그 크기 변경

  - My.cnf파일에서 innodb_log_file_size를 100mà 512m

  - 서버 재시작

  - 에러 로그 파일과 리두 로그 디렉터리의 파일 사이즈 확인

 

1.9 더티 페이지 플러시

  - 디스크로 기록되지 않는 페이지(블록)를 더티 페이지이며 이를 디스크로 기록하는 것이 플러시이다.

  - 플러시 종류 : LRU_LIST – 버퍼 풀에서 자주 사용되지 않는 페이지들의 목록을 관리 하기 위한 것

                      Flush_list는 버퍼 풀에서 변경된 페이지들의 목록을 시간 순서대로 관리 하기 위한 것

 

2.1 InnoDB의 더티 플러시

  - 더티 페이지 플러시만 전담하는 페이지 클러너(Page Cleaner) 스레드 도입

  - 엑세스 패턴(Access Pattern) : 버퍼 풀에 빈 공간이 없을 때, 최근에 자주 사용되지 않은 페이지가 LRU리스트 플러시에 의해서 디스크로 플러시 된다. LRU리스트의 페이지를 한두 개만 플러시하는 것이 아니라 배치 형식으로 많은 페이지들을 플러시해 버리게 된다는 점이 가장 큰 문제

  - 위와 같은 문제를 없애기 위해서 innodb_lru_scan_depth 도입 : 페이지 클리너 스래드가 플러시 할 더티 페이지를 찾기 위해서 LRU리스트에서 얼마나 많은 페이지를 스캔할지를 결정 한다.

 

2.2 체크포인트 에이지     

  - Flush_list에 남아 있을 수 있는 페이지의 전체 양은 InnoDB의 전체 리두 로그 사이즈의 합에 의해서 결정 된다.

  - innodb_io_capacity : 백그라운드 스레드가 디스크 쓰기를 수행 할 때 허용되는 최대 디스크 쓰기 횟수 제한 변수. 기본 값 200이며 동적 변수     

  - innodb_io_capacity_max : IO 버스터(Burst)가 발생하더라도 디스크 IO가 시스템의 모든 자원을 소모하지 못하도록 제한하는 것.

'MariaDB > Admin' 카테고리의 다른 글

레플리케이션  (0) 2015.10.27
기타 기능2  (0) 2015.10.26
스토리지 엔진 2  (0) 2015.10.20
MariaDB 최적화 1  (0) 2015.10.14
MariaDB 옵티마이저 힌트 및 실행 계획 분석 시 주의사항  (0) 2015.10.12