반응형
MySQL 엔진 구조MySQL 서버는 크게 커넥션 핸들러, MySQL 엔진, 스토리지 엔진으로 구분할 수 있다. 실행 흐름을 보면 다음과 같은 순서로 요청을 처리한다.1. 프로그래밍 API (클라이언트 단계 )프로그래밍 언어로 작성된 애플리케이션에서 MySQL 서버로 쿼리 요청한다.이 때 각 프로그래밍 언어별 MySQL 커넥터를 통해 통신한다. 2. MySQL 엔진의 커넥션 핸들러클라이언트의 접속 요청을 받아들인다.이 때 사용자 인증 및 권한 검사 수행과 쿼리 요청에 대한 커넥션 생성 및 관리를 담당한다. 3. MySQL 엔진의 쿼리 파서사용자 요청으로 들어온 쿼리 문장을 MySQL이 인식할 수 있는 토큰으로 분리해 트리 형태의 구조로 파싱한다.쿼리 문장의 기본 문법 오류는 이 과정에서 발견되고 사용에게..
Transaction (트랜잭션)트랜잭션은 데이터의 정합성을 보장해주는 RDBMS에 아주 필수적인 기술이다.InnoDB 스토리지 엔진은 트랜잭션을 보장하고 레코드 단위의 잠금을 제공하지만MyISAM, MEMORY 스토리지 엔진은 이 트랜잭션을 지원하지 않고 테이블 단위의 잠금을 제공한다.이 이유로 InnoDB 스토리지 엔진이 가장 많이 사용되는 것이라 추측된다. 트랜잭션 범위트랜잭션은 범위 또한 아주 중요하다.범위가 크다면 범위 내의 작업들의 정합성이 지켜진다는 점이 좋지만정합성이 중요하지 않은 작업이 끼어있다면 오히려 커넥션을 점유하고 있는 시간이 길어지는데이는 여유 커넥션의 개수가 줄어진 다는 것을 의미하고 TPS 수치 또한 떨어질 것이다. 특히 어떤 작업들이 트랜잭션 처리에 좋지 않을까정합성이 중요..
MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다.MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치지만스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 미치지 않는다.각각의 엔진별로 어떠한 잠금들이 있는지 알아보자.MySQL 엔진의 Lock글로벌 락MySQL에서 가장 큰 범위의 Lock으로 MySQL 서버 전체에 적용된다.다음 명령으로 획득할 수 있다.FLUSH TABLES WITH READ LOCK한 세션에서 글로벌 락을 획득하면 다른 세션에서는 SELECT를 제외한 대부분의 DDL, DML이 글로벌 락 해제까지 대기 상태로 기다린다. 다음과 같은 상황에서 사용할 수 있다.전체 DB의 물리적 백업이 필요할 때모든 DB와 타 스토리지 엔..
시스템 계정과 일반 계정SYSTEM_USER 권한을 가지고 있느냐 없느냐에 따라 시스템 계정과 일반 계정으로 구분된다.시스템 계정은 DB 서버 관리자(DBA)를 위한 계정이고 일반 계정은 개발자를 위한 계정이다.시스템 계정은 다음과 같이 DBMS 관리와 관련된 중요 작업을 수행할 수 있는 권한이 있다.데이터베이스 관리 작업일반 계정 관리다른 세션 또는 그 세션에서 실행 중인 쿼리 강제 종료참고로 MySQL 서버에는 다음과 같이 내장된 계정들이 있다.SELECT user, host, account_locked FROM mysql.user WHERE user LIKE 'mysql.%';root@localhost를 제외한 위 3개의 계정은 내부적으로 다음과 같은 목적으로 사용된다. mysql.infoschem..
시스템 변수 (글로벌, 세션)시스템 변수는 MySQL 서버의 설정과 동작을 제어하는 변수들이다.MySQL 서버는 이러한 값이 설정된 파일 my.cnf(또는 my.ini)을 읽어 작동 방식, 메모리, 성능, 보안 등을 초기화한다. 시스템 변수 값을 확인하려면 다음과 같이 MySQL 서버에서 조회할 수 있다.SHOW VARIABLES; 시스템 변수(설정) 값이 어떻게 MySQL 서버와 클라이언트에 영향을 미치는지 판단하기 위해선다음과 같이 글로벌, 세션 변수를 구분할 수 있어야한다.GLOBAL 변수 : MySQL 서버에서 단 하나의 값을 가지며, 시스템에 영향을 미치는 변수이다.SESSION 변수 : 각 세션에만 적용되는 값으로 커넥션 단위로 값을 변경할 수 있다. 이제 시스템 변수에 대해 알아보자.시스템 ..