본문 바로가기

DB

(13)
리두로그와 언두로그 리두로그 트랜잭션이 만들어내는 모든 변경사항을 순차적으로 기록한다. 주로 시스템이 비정상적으로 종료되었을 때 트랜잭션의 변경사항을 복구하는데 사용된다. 시스템이 비정상적으로 종료되었을 떄, 마지막 체크포인트 이후에 발생한 모든 트랜잭션을 다시 실행해 데이터를 복구하는데 사용된다. 동작 트랜잭션이 커밋될 때 메모리의 로그 버퍼에 먼저 기록되고, 이후 디스크에 플러시된다. 체크포인트는 더티 페이지를 디스크에 플러시 하는 것과 관련이 있으며, 리두 로그와는 별도의 프로세스이다. 체크포인트 발생시, 변경된 데이터 페이지가 디스크의 데이터 파일에 플러시되어 데이터의 일관성을 유지한다. 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 이상의 격리..
[Architecture of a Database System] Storage Management DBMS storage manager 타입에는 두 가지가 있다. low-level block-mode 디바이스 드라이버와 바로 연결 표준적인 OS 파일 시스템 이용 두 가지 방법을 차례로 공부하고 스토리지 계층에 대해서 공부한다. 5.1 Spatial Control 디스크로 왔다갔다 하는 Sequential bandwidth 는 Random Access보다 10에서 100배 빠르다. 디스크 밀집도는 18개월마다 두배가 되고 bandwidth는 밀집도의 제곱근으로 증가한다. 디스크 암 움직임은 일년에 약 7퍼센트 향상한다. 따라서 DBMS Storage Manager는 디스크의 블락을 sequential하기 움직일 수 있도록 해야한다. DBMS가 spatial locality를 제어하는 가장 좋은 방법은 ..
[Architecture of a Database System] Relational Query Processor Relational Query Processor는 declarative SQL statement (a type of SQL statement that specifies what data is required, but not how to obtain it)를 받아서 validate하고, 절차적인 데이터 플로우 execution plan으로 optimize하고, 데이터 플로우를 실행한다. 클라이언트는 결과 튜플을 한번에 하나씩, 혹은 작은 배치로 fetch (pull) 한다. 이번 장에서는 DML에 대해 공부한다. DDL은 쿼리 옵티마이저에 의해 실행되지 않는다. DDL 문은 스토리지 엔진 및 카탈로그 관리자에 대한 명시적 호출을 통해 static DBMS 로직에 의해 절차적으로 구현된다. 4.1 Query..