DB/MySQL 9

MySQL의 락

글로벌 락 글로벌 락은 MySQL에서 제공하는 락 중에서 가장 범위가 큽니다. 일단 하나의 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 다른 대부분의 DDL, DML 문장이 대기 상태로 됩니다. 글로벌 락이 영향을 미치는 범위는 MySQL 서버 전체이며, 작업 대상 테이블이나 데이터베이스의 범위를 넘어섭니다. 글로벌 락은 여러 데이터베이스에 존재하는 MyISAM이나 Memory 테이블에 대해서 mysqldump로 일관된 백업을 받아야 할 때 사용합니다. InnoDB는 트랜잭션을 지원하기 때문에 일관된 데이터 상태를 위해 모든 데이터 변경 작업을 멈출 필요는 없습니다. 글로벌 락은 FLUSH TABLES WITH READ LOCK 명령어로 획득할 수 있습니다. 이 작업은 모든 읽기 작..

DB/MySQL 2024.03.18

MySQL 쿼리 실행 구조

MySQL 엔진 쿼리 파서 사용자 요청으로 들어온 문자열을 토큰으로 분리해서 트리 형태의 구조로 변형 문법 오류가 발생하면 이 과정에서 오류 메시지가 전달된다 전처리기 컬럼 이름, 내장 함수와 같은 객체를 매핑해서 객체의 존재 여부를 확인 해당 객체에 접근 권한이 있는지 확인 실제로 존재하지 않은 객체를 지정하거나 권한이 없으면 오류 메시지가 전달됨 옵티마이저 (쿼리 변환, 비용 최적화, 실행 계획 수립) 쿼리 실행기 MySQL 엔진이 핸들러를 사용해서 MySQL 서버 밑단에서 데이터를 디스크로 저장하거나 디스크로부터 읽어오는 요청을 보낸다. 이 핸들러는 스토리지 엔진을 의미한다. 스토리지 엔진 💡 쿼리 캐시 MySQL 서버에서 쿼리 캐시는 SQL 실행 결과를 메모리에 캐시하고, 동일 SQL 캐시가 실행..

DB/MySQL 2024.01.28

MySQL 메모리 구조

MySQL의 메모리는 크게 글로벌 메모리와 로컬 메모리 영역으로 나뉜다. 글로벌 메모리 영역은 MySQL 서버가 시작되면서 운영체제로부터 할당을 받는다. 처음부터 요청한 100%를 받는지, 상황에 따라서 조금씩 더 할당받는지는 운영체제의 정책에 따라 다른데, 결론적으로 시스템 변수에 설정해 둔 만큼 운영체제로부터 메모리를 할당받는다고 생각하면 된다. 글로벌 메모리 영역은 모든 쓰레드에 의해서 공유된다. 클라이언트 쓰레드(Foreground)의 수와 상관없다. (InnoDB 버퍼 풀, 리두(redo) 로그 버퍼 등을 위해서 사용되는데, 개인적으로는 당장은 그 역할이 와닿지 않는 메모리 영역이다.) 로컬 메모리 영역, 클라이언트 메모리 영역, 세션 메모리 영역으로 불리는 메모리 영역은 클라이언트 커넥션으로부..

DB/MySQL 2024.01.28

MySQL 멀티 쓰레딩

MySQL의 멀티쓰레딩 MySQL 서버는 프로세스 기반이 아니라 쓰레드 기반으로 동작한다. MySQL에서 사용하는 쓰레드는 크게 Foreground, Background 쓰레드로 구분할 수 있다. SELECT thread_id, name, type FROM performance_schema.threads ORDER BY type, thread_id; MySQL 서버에서 실행 중인 대부분의 쓰레드는 Background 쓰레드이고, 일부만 Foreground 타입이다. 위 사진에서 마지막에 있는 thread/sql/one_connection 쓰레드가 사용자의 요청을 처리하는 Foreground 쓰레드이다. 같은 이름의 쓰레드가 2개보이는 것은 여러 쓰레드가 동일한 작업을 병렬로 처리하고 있는 경우이다. Fo..

DB/MySQL 2024.01.28

MySQL 아키텍처

MySQL의 아키텍처 MySQL 서버 = MySQL 엔진 + 스토리지 엔진 MySQL 엔진 SQL 인터페이스 SQL 파서 SQL 옵티마이저 캐시 & 버퍼 스토리지 엔진 ex ) InnoDB or MyISAM MySQL 엔진과 스토리지 엔진의 관계 : SQL 엔진은 스토리지 엔진을 조정하기 위해 Handler라는 것을 사용한다. MySQL에서 MyISAM, InnoDB와 같이 다른 스토리지 엔진을 사용하는 테이블에 대해 쿼리를 실행하더라도 MySQL의 처리 내용은 대부분 동일하다. GROUP BY, ORDER BY 등 복잡한 처리는 스토리지 엔진 영역이 아니라 MySQL 엔진의 처리 영역인 ‘쿼리 실행기’에서 처리된다 MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 ..

DB/MySQL 2024.01.28

MySQL 시스템 변수 조회 및 변경

시스템 변수 개념 글로벌 변수, 세션 변수로 나뉨 세션 변수 : 클라이언트의 필요에 따라 개별 커넥션 단위로 다른 값을 변경할 수 있는 값 (ex autocommit) 설정 파일 (my.cnf)에 변경된 사항은 mysql 서버를 재시작해야 적용됨 SET 명령어로 설정 값을 변경할 수는 있으나, SET으로 수정한 사항이 설정 파일에 반영되지는 않음 8.0이상부터 SET PERSIST 명령어로 시스템 변수를 변경하고 설정 파일에 기록도 가능함 mysqld-auto.cnf my.cnf 파일과 별도의 파일에 저장되고 재시작시 로딩된다. mysqld-auto.cnf 파일은 직접 삭제하지 않고, RESET PERSIST;를 호출해야 한다 SET GLOBAL은 글로별 변수를, SET은 세션 변수를 변경함 시스템 변수..

DB/MySQL 2024.01.28

MySQL 업그레이드 주의사항

In-Place Upgrade : MySql 서버의 데이터 파일을 그대로 두고 업그레이드 Logical Upgrade : mysqldump 도구 등을 이용해 mysql 서버의 데이터를 SQL 문장이나 텍스트 파일로 덤프한 후, 새로 업그레이드 된 버전의 MySQL 서버에서 덤프된 데이터를 적재함 제약 사항 같은 메이저 버전에서 마이너 버전 간 업그레이드는 여러 버전 건너 뛰기 가능 (8.0.16 → 8.0.21) 메이저 버전 간 업그레이드는 반드시 한 단계씩 업그레이드를 해야함 (하위호환성이 한단계까지만 유지됨) 5.5 →8.0으로 메이저 업그레이드를 하려면 5.5→5.6→5.7→8.0으로 한단계씩 업그레이드를 해야한다. 만약 이 과정이 번거로우면 Logical Upgrade를 고려할 수 있다. In-P..

DB/MySQL 2024.01.28

MySQL 실행 및 종료 (+ PID file not found 해결 방법)

mysql 실행 및 종료 기본적으로는 아래의 명령어로 실행 및 종료할 수 있다 sudo /usr/local/mysql/support-files/mysql.server start sudo /usr/local/mysql/support-files/mysql.server stop zshrc에 등록해두면 편하다 // ~/.zshrc # mysql alias mysqlstart='sudo /usr/local/mysql/support-files/mysql.server start' alias mysqlstop='sudo /usr/local/mysql/support-files/mysql.server stop' export PATH="/usr/local/mysql/bin:$PATH" 그런데 아래의 에러가 발생하는 경우가 ..

DB/MySQL 2024.01.28