현재 책너두 1.5기 모집 링크 입니다 : https://breakbook.notion.site 요약 인덱스를 이용한 잠금에 대한 이해를 할 수 있었음 InnoDB 에서 인덱스를 통한 잠금 획득하는 방법과 이유를 이해하게 됨. 레코드 수준의 잠금에서 잠금 상태와 대기 상태를 확인할 수 있는 방법을 알게 됨. 메모 인덱스와 잠금 InnoDB 잠금과 인덱스는 중요한 연관관계가 있음. 앞선 InnoDB 스토리지 엔진 잠금 중에 레코드 락은 레코드를 잠그는 것이 아니라 인덱스를 잠그는 방식으로 처리 됨. 즉, 변경해야 할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 락을 걸어야 함. 예시를 보자. mysql> SELECT COUNT(*) FROM employees WHERE first_name='Georg..
현재 책너두 1.5기 모집 링크 입니다 : https://breakbook.notion.site 요약 MySQL 엔진에서 제공하는 잠금에 대한 종류와 각 기능을 이해하게 됨. 글로벌 락, 테이블 락, 네임드 락, 메타데이터 락 InnoDB 스토리지 엔진에서 제공하는 잠금에 대한 종류와 각 기능을 이해하게 됨. 레코드 락, 갭 락, 넥스트 키 락, 자동 증가 락 메모 MySQL 엔진의 잠금 MySQL 에서 사용되는 잠금 스토리지 엔진 레벨 MySQL 엔진 레벨 로 나눌 수 있음. MySQL 엔진은 MySQL 서버에서 스토리지 엔진을 제외한 나머지 부분으로 이해하면 됨. MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미침. 스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 미치지 않음...
요약 슬로우 쿼리 로그에 대한 내용과 쿼리 튜닝을 위한 여러 지표에 대한 내용을 알게 됨. 트랜잭션과 잠금에 대한 내용을 이해하게 됨. MySQL 에서 InnoDB 와 MyISAM, MEMORY 스토리지 엔진에 따른 트랜잭션 여부 및 예시를 통해 트랜잭션을 통한 데이터 정합성의 중요성을 이해하게 됨. 트랜잭션의 범위를 최소화 하고, 네트워크 통신이 필요한 지연이 있을 경우, 해당 부분을 트랜잭션에서 반드시 제외하자는 가이드를 알게 됨. 발췌 잠금(Lock) 은 동시성을 제어하기 위한 기능이다. 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다. 프로그램의 코드에서 라인 수는 한두 줄이라고 하더라도 네트워크 작업이 있는 경우에는 반드시 트랜잭션에서 배제해야 한다. 메모 슬로우 쿼리 로그 MySQL 서버의..
요약 InnoDB, MyISAM, MEMORY 스토리지 엔진과, InnoDB 가 거의 많이 사용된다는 사실을 알게됨. MyISAM 스토리지 엔진의 아키텍쳐와 그 중 키 캐시에 대해 이해하게 됨. 키 캐시를 사용하지 않을 떄 운영체제의 기본 캐시 & 버퍼를 사용한다는 사실을 알게 됨. MyISAM 스토리지 엔진의 데이터 파일과 프라이머리 키(인덱스) 구조에 대해 알게 됨. 가변 길이 ROWID 에서 MyISAM 테이블 최대 크기가 2^(8*(7-1)) 에서 8을 왜 곱하는지 잘 모르겟음.. (해당 테이블의 칼럼에 들어갈 최대 값이 8바이트여서 그런건지.. 모르겟음) → 146page MySQL 트러블 슈팅을 위해 로그 파일을 보는 것을 습관해야 한다. 각 에러로그를 보는 방법에 대해 이해하게 됨. 발췌 M..
요약 리두 로그 의 사용 목적을 이해하게됨. 로그 버퍼를 이용해 리두 로그 버퍼링을 하는 방법을 이해하게 됨. 리두 로그 아카이빙을 통해 리두 로그들을 관리하는 방법들을 이해하게 됨. 리두로그의 활성, 비활성화 상태와 서버의 비정상 종료와의 관계와 어떤 식으로 데이터 파일을 관리할지를 이해하게 됨. 어댑티브 해시 인덱스의 의미와 장단점을 이해하게됨. 책에 설 말하는 28% 정도의 어댑티브 해시 인덱스 이용했다는 근거를 잘 모르겠음.. CPU 사용률이 100% 에 근접하면 어댑티브 해시 인덱스가 효율적이라고 하는데 효율적이지 않은 것 아닌가..? 라고 생각함.. 메모 리두 로그 및 로그 버퍼 리두 로그(Redo Log) 는 트랜잭션의 4가지 요소인 ACID 중 D(Durable) 에 해당하는 영속성과 가장..
요약 Double Write Buffer 사용 목적과 그 방법을 이해하게 됨. 언두 로그의 사용 이유와 모니터링 방법, 테이블 스페이스에 대한 이력과 관리 방법을 이해하게 됨. 체인지 버퍼의 사용 목적과 관리 방법을 이해하게됨. 발췌 대용량의 데이터를 처리하는 트랜잭션뿐만 아니라 트랜잭션이 오랜 시간 동안 실행될 때도 언두 로그의 양은 급격히 증가할 수 있다. 메모 Double Write Buffer InnoDB 스토리지 엔진의 리두 로그는 공간 낭비를 방지하기 위해 페이지의 변경된 내용만 기록함. 더티 페이지를 디스크 파일로 플러시할 때 일부만 기록되는 문제가 발생하면 그 페이지 내용을 복구하지 못할 수 있음. 페이지가 일부만 기록되는 현상을 파셜 페이지(Partial page) 또는 톤 페이지(Tor..
요약 InnoDB 버퍼풀의 역할과 관리하는 방법의 자료구조를 알게 되었다. 쓰기 버퍼링 기능 향상을 위한 버퍼풀과 리두로그와의 관계를 이해하게 되었다. 버퍼 풀에 등록되어있는 더티 페이지의 플러시 전략을 이해하게 되었다. 버퍼풀에 적재된 내용을 확인하는 방법을 알게 되었다. 적재된 내용 확인에 대한 쿼리도 설명해 줬지만 완벽히 이해하지는 못함... 버퍼풀과 리두로그의 관계를 이해하는것이 어려웠다. 다른사람이 정리한 블로그도 읽으면서 내용을 이해하려고 노력했다. https://new-age-jh.tistory.com/288 발췌 InnoDB 스토리지 엔진은 체크 포인트를 발생시켜 디스크의 리두 로그와 데이터 페이지의 상태를 동기화 하게 된다. 체크 포인트는 MySQL 서버가 시작될 때 InnoDB 스토리지..
요약 InnoDB 스토리지 엔진 아키텍처의 전체 그림과 각 요소의 일부분에 대한 역할을 이해하게 됨. 스토리지 엔진별 인덱싱 전략과 프라이머리 키와 클러스터링 인덱스에 대한 간략한 내용을 이해하게 됨. 외래 키 작업의 불편함에 대한 내용을 다시한번 인식하게 됨. 실제 서비스에서 자주 사용하지 않는다고 하는데, 잘 모르겠음. 다른 회사에서 많이 쓰고 있는지도 잘 모르겠다. 우리 회사에서는 JPA 연관관계를 이용해서 자주 쓰고 있는편임. → 책에서 말한 불편함을 경험한 적이 있음. MVCC 를 이해하게 됨. 트랜잭션처리와 묶어서 언두 영역의 존재를 알게되고 어떻게 잠금 없는 읽기가 가능한지 이해하게 됨. 여러 장애 복구 모드에 대한 이해를 하게 됨. 복구 모드별 특이사항을 이해하게 되고, 복구 모드가 발생되..
요약 플러그인 스토리지 엔진 모델에 대해 알게 되었음. 스토리지 엔진과 플러그인을 제공된 핸들러 API & 플러그인 API 를 통해 커스텀하게 구현할 수 있다는 사실을 알게 됨. 쿼리 실행구조와 각 부분의 역할을 이해하게 됨. 쿼리 캐시의 탄생과 삭제 역사를 이해하게 됨. mysql 에서의 스레드풀 동작 원리를 이해하게 됨. 트랜잭션 지원 메타데이터의 관리 방법과 이전 버전의 히스토리를 이해하게 됨. 발췌 MyISAM 이나 InnoDB 스토리지 엔진 가운데 뭘 사용하든 별 차이가 없는 것 아닌가, 라고 생각할 수 있지만 그렇진 않다. 여기서 설명한 내용은 아주 간략하게 언급한 것일 뿐이고, 단순히 보이는 ‘데이터 읽기/쓰기’ 작업 처리 방식이 얼마나 달라질 수 있는가를 이 책의 나머지 부분을 통해 깨닫게..
요약 MySQL 서버의 구성 요소를 알게 되었다. MySQL 엔진의 역할을 알게 되었다. 스토리지 엔진의 역할을 알게 되었다. MySQL 엔진과 스토리지 엔진의 상호작용 방법을 알게 되었다. MySQL 의 스레딩 구조와 메모리 할당 방식을 알게 되었다. 발췌 MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동한다. 메모 MySQL 서버는 다음과 같이 나눌 수 있다. MySQL 엔진 → 사람의 머리 역할 스토리지 엔진 → 손발 역할 핸들러 API 를 만족하는 커스텀 스토리지 엔진 구현하여 사용 가능 ex) InnoDB 스토리지 엔진, MyISAM 스토리지 엔진 MySQL 엔진 아키텍처 MySQL 서버는 다른 DBMS 에 비해 구조가 독특함. 독특한 구조로 인해 다른 DBMS 가 가질 수 없는 엄..
요약 사용자 식별에 아이디 뿐만 아니라 호스트도 함께 명시해야 함. 여러 시스템 내장 계정의 존재를 알게 됨. 유저 생성시 여러 옵션으로 권한, 정책들을 사용할 수 있음을 알게 됨. 이중 비밀번호를 통해 응용 서비스의 다운 타임 없이 비밀번호를 새롭게 변경할 수 있는 방식을 알게됨. 발췌 하나의 계정에 다른 계정의 권한을 병합하기만 하면 되므로 MySQL 서버는 역할과 계정을 구분할 필요가 없는 것이다. 메모 권한 (Privilege) 5.7 버전까지는 글로벌 권한과 객체 단위 권한 으로 구분됐다. 글로벌 권한 : 데이터베이스나 테이블 이외의 객체에 적용되는 권한 객체 권한 : 데이터베이스나 테이블을 제어하는데 필요한 권한 객체 권한은 GRANT 명령으로 권한을 부여할 떄 반드시 특정 객체를 명시해야 함..
요약 사용자 식별에 아이디 뿐만 아니라 호스트도 함께 명시해야 함. 여러 시스템 내장 계정의 존재를 알게 됨. 유저 생성시 여러 옵션으로 권한, 정책들을 사용할 수 있음을 알게 됨. 이중 비밀번호를 통해 응용 서비스의 다운 타임 없이 비밀번호를 새롭게 변경할 수 있는 방식을 알게됨. 발췌 패스 메모 사용자 식별 MySQL 사용자 계정을 생성 하는 방법 & 각 계정 권한 설정 방법은 다른 DBMS 와 조금 차이가 있음. MySQL 사용자 계정은 사용자의 아이디 뿐만 아니라 해당 사용자의 접속 지점 (클라이언트가 실행된 호트스명 or 도메인 or IP 주소)도 계정의 일부가 된다. 항상 아이디와 호스트를 함께 명시해야 함. 'svc_id'@'127.0.0.1' MySQL 서버가 기동중인 로컬 호스트에서 sv..