본문 바로가기

DB/MySQL

(7)
리두로그와 언두로그 리두로그 트랜잭션이 만들어내는 모든 변경사항을 순차적으로 기록한다. 주로 시스템이 비정상적으로 종료되었을 때 트랜잭션의 변경사항을 복구하는데 사용된다. 시스템이 비정상적으로 종료되었을 떄, 마지막 체크포인트 이후에 발생한 모든 트랜잭션을 다시 실행해 데이터를 복구하는데 사용된다. 동작 트랜잭션이 커밋될 때 메모리의 로그 버퍼에 먼저 기록되고, 이후 디스크에 플러시된다. 체크포인트는 더티 페이지를 디스크에 플러시 하는 것과 관련이 있으며, 리두 로그와는 별도의 프로세스이다. 체크포인트 발생시, 변경된 데이터 페이지가 디스크의 데이터 파일에 플러시되어 데이터의 일관성을 유지한다. WAL 원칙 데이터 페이지를 디스크에 기록하기 전에 해당 변경 사항을 먼저 리두 로그에 기록한다. (버퍼 풀의 페이지보다도 리두로..
바이너리 로그의 복제 데이터 포맷 바이너리 로그 MySQL에서 발생하는 모든 변경 사항을 순서대로 기록하는 로그 데이터의 변경 내역, 테이블의 구조 변경, 계정이나 권한의 변경 정보까지 모두 저장된다. 바이너리 로그에 기록된 각 변경 정보들을 이벤트라고 한다. 복제 데이터 포맷 Statement 변경 이벤트를 발생시킨 SQL문을 기록하는 방식 장점 로그 크기가 작다. 저장 공간이 얼마 들지 않는다. 레플리카 서버에서 복제할 때 빠르게 처리할 수 있다. 단점 비결정적인 쿼리의 경우, 복제 시 소스 서버와 레플리카 서버 간에 데이터가 달라질 수 있다. 데이터에 락을 더 많이 건다. 트랜잭션 격리 수준이 REPEATABLE-READ 이상이어야 한다. 하나의 트랜잭션 내에서도 각 쿼리가 실행되는 시점마다 데이터 스냅숏이 달라질 수 있는데, 이로..
[Real MySQL] 인덱스 (2) 8.6 함수 기반 인덱스 칼럼의 값을 변형해서 만들어진 값에 대해 인덱스를 구축할 수 있게 한다. 인덱스 내부적인 구조 및 유지관리 방법은 B-Tree 인덱스와 동일하다. 함수 기반 인덱스를 구현하는 방법 가상 칼럼을 이용한 인덱스 함수를 이용한 인덱스 8.6.1 가상 칼럼을 이용한 인덱스 ALTER TABLE user ADD full_name VARCHAR(30) AS (CONCAT(first_bame,' ',last_name)) VURTUAL, ADD INDEX ix_fullname (full_name); 가상 칼럼은 VIRTUL과 STORED 옵션이 있다. 테이블에 새로운 칼럼을 추가하는 것과 같은 효과를 내기 때문에 실제 테이블의 구조가 변경된다는 단점이 있다. 8.6.2 함수를 이용한 인덱스 M..
[Real MySQL] 트랜잭션과 잠금 MyISAM 스토리지 엔진은 트랜잭션을 지원하지 않는다. InnoDB는 스토리지 엔진 내부에서 레코드 기반의 잠금 방식이 있다. 5.2 MySQL 엔진의 잠금 1. 스토리지 엔진 레벨 스토리지 엔진 간 상호 영향을 미치지 않는다. 2. MySQL 엔진 레벨 MySQL 서버에서 스토리지 엔진을 제외한 나머지 부분 MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다. 테이블 락: 테이블 데이터 동기화를 위한 락 메타데이터락: 테이블 구조를 잠근다. 네임드 락: 사용자의 필요에 맞게 사용할 수 있는 락 5.2.1 글로벌 락 글로벌락 SELECT를 제외한 DDL, DML 문장을 실행할 경우 글로벌 락이 해제될 때까지 대기상태로 남는다. MySQL 서버 전체에 영향을 미친다. 작업 대상 테이블이나 ..
Isolation Levels Isolation Levels 한 트랜잭션에서 다른 트랜잭션이 동시에 수행하는 작업을 어느 정도로 보게할 것인지를 결정한다. DIRTY READ NON-REPEATABLE READ PAHNTOM READ READ UNCOMMITTED o o o READ COMITTED x o o REPEATABLE READ x x o (InnoDB는 x) SERIALIZABLE READ x x x READ UNCOMMITTED 한 트랜잭션에서 다른 트랜잭션의 아직 커밋되지 않은 변경사항을 볼 수 있다. Dirty Read를 허용한다. READ COMMITTED 한 트랜잭션에서 다른 트랜잭션에서의 커밋된 변경사항을 볼 수 있다. Non-repeatable Read와 Phantom Read를 허용한다. 같은 트랜잭션 내에서..
InnoDB Strage Engine MVCC (Multi Version Concurrency Control) 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다. 격리 수준 (Isolation level)이 READ_COMMITTED인 MySQL 서버에서 InnoDB 스토리지 엔진을 사용하는 테이블의 변경을 어떻게 처리하는지 살펴보자. UPDATE 문장이 실행되면 커밋 실행 여부와 관계없이 InnoDB의 버퍼 풀은 새로운 값으로 업데이트된다. 아직 COMMIT이나 ROLLBACK이 되지 않은 상태에서 다른 사용자가 다음 같은 쿼리로 작업 중인 레코드를 조회하면 어디에 있는 데이터를 조회할까? 이는 격리 수준에 따라 다르다. READ_UNCOMMITTED인 경우에는 변경된 상태의 데이터를 반환한다. READ_COMMITTED 이상의 격리..
[Real MySQL] 인덱스 (1) 8.1 디스크 읽기 방식 Random I/O 3개의 페이지를 디스크에 기록 하기 위해 3번의 시스템 콜 요청 → 디스크 헤더 3번 움직임 인덱스 레인지 스캔에서 Random I/O 사용 OLTP (On-Line Transaction Processing) 성격의 웹 서비스에서 자주 사용 일반적으로 쿼리를 튜닝한다 함은 Random I/O → Sequential I/O 가 아닌 Random I/O 를 줄이는 것 Sequencial I/O 3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜 요청 → 디스크 헤더 1번 움직임 풀 테이블 스캔에서 Sequential I/O 사용 데이터웨어하우스나 통계 작업에서 자주 사용 (많은 레코드를 더 빨리 읽어올 수 있으므로) 8.2 인덱스 데이터가 저장 될 때 마다 ..