이 저장소는 DBA(Database Administrator)로 성장하기 위한 단계별 학습 자료다. 이 브랜치는 vendor-neutral 원본에서 PostgreSQL 명령어만 걸러낸 뷰이며, main 브랜치에서 자동 재생성된다(자세한 내용은 docs/dbms-branch-strategy.md 참고).
이 저장소는 DBA(Database Administrator)로 성장하기 위한 단계별 학습 자료다. 이 브랜치는 vendor-neutral 원본에서 MySQL 명령어만 걸러낸 뷰이며, main 브랜치에서 자동 재생성된다(자세한 내용은 docs/dbms-branch-strategy.md 참고).
이 저장소는 DBA(Database Administrator)로 성장하기 위한 단계별 학습 자료다. 이 브랜치는 vendor-neutral 원본에서 Oracle 명령어만 걸러낸 뷰이며, main 브랜치에서 자동 재생성된다(자세한 내용은 docs/dbms-branch-strategy.md 참고).
이 저장소는 DBA(Database Administrator)로 성장하기 위한 단계별 학습 자료다. 특정 DBMS 벤더에 종속되지 않고 관계형 데이터베이스 공통 이론을 다루되, 주요 DBMS(PostgreSQL / MySQL / Oracle, 필요시 MSSQL)의 명령어를 함께 병기·비교한다.
특정 DBMS만 보고 싶다면 —
postgresql/mysql/oracle브랜치에서 해당 DBMS 명령어만 걸러낸 뷰를 볼 수 있다. 이 브랜치들은main에서 자동 생성되는 파생 뷰이며 직접 수정하지 않는다 — 자세한 내용은docs/dbms-branch-strategy.md참고.
01-beginner (예비/신입 DBA)
└─ RDBMS 기초 → SQL 기초 → 설치/접속 → 계정·권한 → 기본 백업 → 기본 모니터링
│
▼
02-intermediate (실무 독립 수행 DBA)
└─ 트랜잭션/락 → 인덱싱/쿼리튜닝 → 성능 모니터링 → 백업·복구 전략
→ 복제 → 스키마 변경 관리 → 클라우드 DB 인프라 구축/접속 → 클라우드 매니지드 DB 기초
│
▼
03-advanced (시니어 DBA / DB 아키텍트)
└─ 고급 성능 튜닝 → 고가용성/페일오버 → 재해복구(DR) → 확장/샤딩
→ 보안/컴플라이언스 → 자동화(IaC) → 클라우드 매니지드 DB 심화
→ Kubernetes 기반 DB Operator → 장애 대응/포스트모템
각 단계는 순서대로 학습하는 것을 권장하지만, 이미 실무 경험이 있다면 00-overview.md의 체크리스트로 자신의 현재 위치를 먼저 진단하고 필요한 챕터부터 골라 보는 것도 좋다.
| 챕터 | 내용 |
|---|---|
| 00. 개요 | 선수 지식, 이 단계의 목표, 중급 진입 체크리스트 |
| 01. RDBMS 기초 | 관계형 모델, ACID, 정규화, 키·제약조건 |
| 02. SQL 기초 | DDL/DML/DCL/TCL |
| 03. 설치와 접속 | 설치, 서비스 시작/중지, 클라이언트 도구 접속 |
| 04. 계정과 권한 관리 | 계정 생성, GRANT/REVOKE, 역할 |
| 05. 백업 기초 | 논리 백업/복원(pg_dump, mysqldump, expdp) |
| 06. 기본 모니터링 | 로그 확인, 세션 조회, 디스크 사용량 |
| 07. 명령어 대조표 | 초급 단계 명령어 요약 |
| 챕터 | 내용 |
|---|---|
| 00. 개요 | 선수 지식, 이 단계의 목표, 고급 진입 체크리스트 |
| 01. 트랜잭션과 락 | 격리 수준, MVCC, 락, 데드락 |
| 02. 인덱싱과 쿼리 튜닝 | 인덱스 종류, 실행계획 분석 |
| 03. 성능 모니터링 | 슬로우 쿼리, 성능 지표, 통계 뷰 |
| 04. 백업·복구 전략 | 물리 백업, PITR, 보관 정책 |
| 05. 복제 기초 | 동기/비동기 복제, 주요 구현체 |
| 06. 스키마 변경 관리 | 마이그레이션 도구, 온라인 DDL |
| 07. 클라우드 DB 인프라 구축과 접속 | VPC/서브넷 그룹/보안 그룹, 인스턴스 생성, SSL/IAM 인증, 프라이빗 접속 |
| 08. 클라우드 매니지드 DB 기초 | RDS/Cloud SQL 기본 운영 |
| 09. 명령어 대조표 | 중급 단계 명령어 요약 |
| 챕터 | 내용 |
|---|---|
| 00. 개요 | 선수 지식, 이 단계의 목표, 지속적 성장 방향 |
| 01. 고급 성능 튜닝 | 옵티마이저 내부, 파티셔닝, 캐싱 |
| 02. 고가용성과 페일오버 | HA 아키텍처, 자동 페일오버, Runbook |
| 03. 재해복구(DR) | RPO/RTO, 멀티리전 복구, DR 훈련 |
| 04. 확장과 샤딩 | 샤딩 전략, 리드 리플리카, 커넥션 풀링 |
| 05. 보안과 컴플라이언스 | 암호화, 감사 로그, 컴플라이언스 |
| 06. 자동화와 IaC | Terraform/Ansible, GitOps |
| 07. 클라우드 매니지드 DB 심화 | Aurora/AlloyDB, 멀티리전, 비용 최적화 |
| 08. Kubernetes 기반 DB Operator | Percona XtraDB Cluster Operator, Oracle MySQL Operator, CloudNativePG · 로컬 kind 실습 |
| 09. 장애 대응과 포스트모템 | 인시던트 대응 프로세스, 사후분석 |
| 10. 명령어 대조표 | 고급 단계 명령어 요약 |
| 문서 | 내용 |
|---|---|
| DBMS 비교표 | PostgreSQL/MySQL/Oracle/MSSQL/클라우드 매니지드 서비스 전체 비교 |
| 용어집 | 학습서 전반의 핵심 용어 정리 |
한 줄로 끝난다. 저장소를 기본값인 ~/.local/share/dba-guide에 두고(아래에서 바꿀 수 있다)
guide·exam·shoot 세 명령을 ~/.local/bin에 걸어 준다.
curl -fsSL https://raw.githubusercontent.com/Ahngbeom/dba-guide/main/install.sh | bash설치하면 ./를 뗀다. 이 문서는 클론해서 쓰는 경우를 기준으로 ./guide·./exam·./shoot이라고
적지만, 설치본에서는 어느 디렉터리에 있든 guide·exam·shoot이다. 받는 인자는 양쪽이 같다.
같은 명령을 다시 실행하면 최신 릴리스로 업데이트된다. 제거는
… | bash -s -- --uninstall이며, 이때 학습 기록(시험 결과·정리 노트)은 남는다.
기록까지 지우는 --purge는 파이프로 실행할 수 없다. 지우기 전에 확인을 받는데,
파이프에서는 표준 입력이 curl이라 답을 받을 방법이 없기 때문이다. 스크립트를
내려받아 직접 실행한다.
curl -fsSL -o install.sh https://raw.githubusercontent.com/Ahngbeom/dba-guide/main/install.sh
bash install.sh --uninstall --purge스크립트를 먼저 읽고 실행하고 싶다면 두 단계로 나눠도 된다.
curl -fsSL -o install.sh https://raw.githubusercontent.com/Ahngbeom/dba-guide/main/install.sh
less install.sh && bash install.sh설치하지 않아도 된다. 클론만 해도 전부 그대로 동작한다.
git clone https://github.com/Ahngbeom/dba-guide.git
cd dba-guide && ./guide필요한 것은 git과 python3(3.9 이상)뿐이다. 장애 대응 게임을 하려면 Docker가
추가로 필요하다(./shoot doctor가 점검해 준다). Windows에서는 WSL 안에서 쓴다.
설치 경로를 옮기려면 XDG_DATA_HOME을 지정한다. 아래처럼 하면 저장소가
~/tools/dba-guide에 놓인다 — 명령 링크는 어느 경우든 ~/.local/bin이다.
curl -fsSL https://raw.githubusercontent.com/Ahngbeom/dba-guide/main/install.sh \
| XDG_DATA_HOME="$HOME/tools" bash규칙은 하나다 — 주면 그 값을 따르고, 주지 않으면 지난 위치를 기억한다.
기억하는 것은 이 스크립트가 직접 내려받은 위치뿐이다. 클론한 순간 그 경로가
${XDG_STATE_HOME:-~/.local/state}/dba-guide/install-path에 기록되고, 이후 업데이트·제거는
값 없이도 그리로 간다. 이미 있던 디렉터리를 지정한 경우에는 기록하지 않는다 — 이번 실행이
만들지 않은 트리를 우리 것이라고 적어 두면 나중에 엉뚱한 곳을 지울 수 있기 때문이다.
그 위치가 기록된 곳과 다르면 기억하지 않는다고 화면에 알려 주므로, 그때는
업데이트·제거에도 값을 함께 준다.
옮기고 싶으면 새 값을 주고 다시 설치하면 된다 — 옛 설치본은 지워지지 않으니 학습 기록은 직접 옮기거나 정리한다.
v1.3.0이전에 커스텀 경로로 설치했다면 기록이 없다. 그 설치본은 이 스크립트가 이번 실행에서 만든 것이 아니므로 기록하지 않는다 — 이미 있던 트리를 기록하면 한 번의 지정이 영구 조준점이 되어, 나중에 맨손으로 친--purge가 엉뚱한 곳을 지울 수 있기 때문이다. 그러니 그 설치본을 계속 쓰려면XDG_DATA_HOME을 매번 함께 준다(v1.3.0과 같다) — 업데이트뿐 아니라--uninstall·--purge에도 준다. 값 없이 제거하면 링크만 사라지고 설치본은 그대로 남는다. 새로 설치하고 옛 것을 정리하는 편이 낫다면, 새 경로로 설치한 뒤 옛 경로를 직접 지우면 된다.
./guide챕터 읽기 · 학습 점검 · 장애 대응을 한 메뉴에서 고른다. 읽기 → 확인 → 겪기가
한 자리에서 닫힌다. 학습 점검·장애 대응을 고르면 아래 두 절과 똑같은 화면으로
이어진다. 챕터 읽기는 별도 절이 없다 — 고른 챕터 본문이 그대로 $PAGER(따로
지정하지 않았고 less가 있으면 less)로 열리고, 나오면 곧바로 챕터 목록으로
돌아온다. 그 목록에서 x를 누르면 커서가 놓인 챕터의 시험이 시작되고, 아직
시험이 없는 챕터(개요·치트시트·부록)는 [시험 없음]으로 표시된다 — 한 번
풀어 본 챕터에는 [지난 최고 A·92%]처럼 기록이 붙는다. 무엇을 할지 정해져
있다면 ./exam·./shoot을 바로 써도 된다 — 인자(--dbms, --seed 등)는
그쪽이 받는다.
./guide 메뉴 · 챕터 읽기 · 장애 대응(선택 화면)에서는 Esc/q가 한 단계
뒤로, 대문자 Q가 앱 전체 종료다 — 챕터 목록처럼 깊이 들어간 자리에서도
한 타로 빠져나온다. 최상위 메뉴는 이미 맨 위 층이라 Esc/q도 결과가
Q와 같다(둘 다 종료). 예외 둘: 장애 대응 게임이 진행 중일 때 c로 접속할
서버를 고르는 화면은 Q가 막혀 있다 — 게임을 끊으면 실습용 컨테이너가 뜬 채로
남기 때문이다(그 화면은 Esc로 취소한다). 학습 점검(exam) 화면은 아직
자체 키 계약을 쓴다 — q(대소문자 무관)는 시험만 끝내고(앱은 그대로 메뉴로
돌아온다) Esc는 무반응이다.
각 챕터를 실제로 이해했는지 스스로 검증할 수 있는 TUI 퀴즈/시험 기능을 제공한다. 이론 개념은 객관식으로, 명령어·실전 내용은 주관식/서술형으로 출제된다. 파이썬 표준 라이브러리만 쓰므로 내려받을 의존성이 없다.
./exam이 한 줄이면 된다. 실행하면 TUI 안에서 순서대로 고른다:
- DBMS 선택 — 전체(공통 + 모든 벤더) / PostgreSQL / MySQL / Oracle. 특정 벤더를 고르면 공통 문항 + 그 벤더 문항만 출제된다.
- 티어 선택 — 초급/중급/고급 (문제은행이 있는 티어만, 하나뿐이면 자동 생략).
- 챕터 선택 — 해당 티어의 챕터.
이후 시험이 진행된다. 시험 중 조작:
- 객관식:
↑/↓로 보기 이동,Enter로 제출. 보기 순서는 매번 무작위로 섞인다. - 주관식/서술형:
Enter로 입력창을 열어 답을 적는다. 입력창에서←/→로 커서 이동(Option+←/→는 단어 단위),Home/End·Backspace/Delete로 중간 편집,Esc로 닫으면 작성 내용은 초안으로 보존되어 다시 열면 이어서 쓸 수 있다. 주관식은 자동 채점, 서술형은 모범답안을 보고 스스로 채점(y/n)한다. - 서술형은 여러 줄로 쓸 수 있다:
Shift+Enter(또는Option+Enter)로 줄을 바꾸고↑/↓로 줄 사이를 이동한다.Enter는 제출이다. 터미널이Shift+Enter를 구분하지 못하면Option+Enter를 쓰면 된다. - 입력창에서
Option조합이 반응하지 않으면 터미널 설정 문제다(Ghosttymacos-option-as-alt = true, iTerm2 Left Option key: Esc+, Terminal.app Option 키를 Meta 키로 사용). 설정과 무관하게Ctrl+A(줄 처음) ·Ctrl+E(줄 끝) ·Ctrl+←/Ctrl+→(단어 이동) 는 항상 동작한다. 키가 이상하면./exam --keydebug로 터미널이 보내는 값을 확인할 수 있다. - 제출은 문항당 한 번으로 확정된다. 채점과 동시에 정답이 공개되므로, 제출 후에는 답을 바꿀 수 없다(점수·연속 정답 조작 방지). 제출한 문항에서
Enter를 누르면 다음 문항으로 넘어가고, 마지막 문항에서는 결과 화면으로 간다. - 공통:
←/→로 이전·다음 문항을 오갈 수 있고(이미 제출한 문항은 내 답·정답·해설을 읽기 전용으로 다시 볼 수 있다),h로 힌트를 보고,m으로 효과음/플래시를 끄고 켜며,q로 결과를 본다. - 정답/오답 시 강조 배너와 화면 플래시(오답은 비프음)가 잠깐 재생되고, 연속 정답이 이어지면 상단에
🔥 연속 N이 표시되며 3·5·10연속에서 축하 배너가 뜬다. 효과가 거슬리면m으로 끄거나./exam --no-effects로 시작한다. - 상단에 실시간 진행상황(정답·오답·정답률·등급 A~F)과 문항별 점 스트립이 표시된다. 자동채점 정답률 70% 미만이면 재학습을 권장한다.
- 시험을 마치면 결과 화면에서 다른 챕터 (같은 티어) / 처음부터 다시 선택 / 종료를 고를 수 있어, 나가지 않고 이어서 여러 챕터를 볼 수 있다.
- 각 시험 결과는
.exam-results/results.jsonl에 자동 저장된다 — 클론해서 쓰면 그 클론 안에, 설치했다면 설치본(${XDG_DATA_HOME:-~/.local/share}/dba-guide) 안에 쌓인다. 개인 학습 기록이라 git에 커밋되지 않는다(.gitignore처리). 챕터를 다시 고를 때 그 챕터의[지난 최고 등급·정답률]이 함께 표시된다.
바로 특정 챕터/옵션으로 실행하기 (선택 사항)
./exam exams/01-beginner/01-rdbms-fundamentals.json # 특정 챕터 바로
./exam 01-beginner # 초급 티어 전체를 한 번에
./exam --dbms postgresql # DBMS 선택만 건너뛰고 티어·챕터는 TUI에서
./exam 01-beginner/02-sql-basics.json --shuffle # 문항 순서 섞기./exam은 python3 scripts/exam.py의 단축이며, 인자·옵션을 그대로 받는다.
- 문항은
exams/<티어>/<챕터>.json에 있다. 문항 추가·작성 규칙과 시드 자동 생성 워크플로는docs/exam-authoring.md를 참고한다.
초급·중급·고급 전 23개 챕터의 문제은행(총 216문항)이 제공된다. 상위 티어일수록 판단·설계를 묻는 서술형 비중이 높다.
읽고(챕터) 확인했다면(퀴즈), 이제 직접 겪어볼 차례다. ./shoot는 로컬 Docker에 진짜 MySQL(과 PostgreSQL)을 띄우고 실제 장애를 주입한 뒤, 당신이 자기 터미널의 진짜 mysql·psql 클라이언트로 진단·복구하는 동안 DB 상태와 명령 이력을 감시해 클리어를 판정한다. 슈팅게임의 라운드/스테이지 진행 구조를 빌렸을 뿐, 플레이 자체는 진짜 트러블슈팅이다.
./shoot doctor # 사전 점검 (docker / 포트 / DB 클라이언트)
./shoot up # 랩 기동 (최초 1회는 이미지 내려받기로 몇 분)
./shoot up --with-postgresql # PostgreSQL 스테이지도 하려면
./shoot # 스테이지를 골라 플레이
./shoot replay # 지난 판을 같은 시드로 다시
./shoot down # 정리DB 접근은 c 키로 한다 — 게임이 잠시 물러나고 진짜 클라이언트(스테이지에 따라 mysql 또는 psql)가 이 터미널에 뜬다. exit으로 나가면 게임 화면으로 돌아와 즉시 갱신된다. readline 편집·Ctrl+R 기록 검색·컬럼 자동완성이 전부 동작하고, 넓은 결과는 알아서 세로로 펼쳐지며(--auto-vertical-output), 긴 결과는 less로 훑는다. 원한다면 외부 터미널로 접속해도 된다. 판정은 어느 쪽을 쓰든 동일하다 — 판정이 보는 것은 어디서 쳤는지가 아니라 서버의 명령 기록에 누구로 남았는지이기 때문이다.
조작키는 c DB 접속(스테이지에 따라 mysql 또는 psql) · n 지난 정리 노트 · r 상황 보고 · h 힌트 · q 포기이고, 문항에서는 ↑·↓·숫자로 고르고 Enter로 제출한다. Esc를 누르면 제출하지 않고 닫히며(고르던 위치와 입력 내용은 보존된다) r로 다시 열어 이어서 답할 수 있다. 화면 하단의 ⠹ 감시 중 · 4초 전 갱신은 감시가 살아있는지와 데이터 신선도를 보여주고, 문제가 생기면 빨간 ⚠ 감시 오류가 뜬다.
스테이지가 끝나면 정리 노트(포스트모템)를 쓴다. 엔진이 관찰한 사실 — 타임라인, 내가 친 명령, 틀린 진단 문항, 금지 행동, 소요 시간 — 으로 초안을 만들어 편집기를 띄우되, 근본 원인·5 Whys·재발 방지는 빈칸으로 남긴다. 그걸 채우는 게 학습이다.
그래서 스테이지의 정답 해설은 편집기를 닫은 뒤에 노트 끝에 덧붙는다. 쓸 때는 안 보이고, 나중에 꺼내 볼 때는 내 분석과 공식 해설이 한 문서에 나란히 남는다. 쓴 노트는 다음 스테이지에서 n 키나 ./shoot notes로 다시 꺼내 볼 수 있다 — 새벽 3시에 자기가 쓴 Runbook을 보는 건 실무 그 자체다.
클리어하면 관련 챕터와 함께 그 챕터의 자가진단 명령(./exam exams/…json)이 뜬다 — 읽기(챕터) → 확인(./exam) → 겪기(./shoot)가 한 화면에서 이어진다.
판정은 두 축으로 이뤄진다. 이 분리가 이 게임의 핵심이다.
- 결과 — 목표 상태에 도달했는가. DB를 2초마다 폴링한다. 상태는
hold_seconds만큼 연속으로 유지돼야 인정되므로, 스쳐 지나간 순간적 정상 상태로는 클리어되지 않는다. - 방법 — 어떻게 도달했는가.
mysql.general_log에서 당신이 친 명령을 읽는다. 상태만 보면 "범인만 정확히KILL"과 "전부 쓸어버리기"가 똑같은 정상 복구지만, 실무에서는 전혀 다른 이야기다. - 이해 — 원인을 알고 고쳤는가. "원인을 식별했다"는 DB 상태로 증명할 수 없어, 장애 도중 뜨는 상황 보고 문항으로 묻는다(퀴즈 채점기를 그대로 재사용한다).
목숨도 하드 리밋도 없다. 소요 시간·힌트 사용·금지 행동·진단 정확도를 합산해 S/A/B/C 등급만 매기므로, 실패 부담 없이 다시 도전해 등급을 올리면 된다.
- 스테이지는
shooting/stages/*.json에 선언적으로 정의한다. 새 스테이지 작성 규약은docs/shooting-game.md를 참고한다.
현재 제공되는 스테이지는 다음과 같다. 🔥는 장애 대응, 🔧는 구축 과제다. 모든 스테이지가 고급 09. 장애 대응과 포스트모템의 회고 루프와 이어진다.
| 스테이지 | 무엇을 겪는가 | 관련 챕터 |
|---|---|---|
| 🔥 1-1 끝나지 않는 리포트 | 에러도 없고 접속도 되는데 끝나지 않는 배치 하나가 CPU를 붙잡고 있다. '지금 무엇이 돌고 있는가'가 첫 질문임을 익히는 자리 | 초급 06. 기본 모니터링, 중급 03. 성능 모니터링 |
| 🔥 1-2 서로를 기다리다 | 트랜잭션이 간헐적으로 실패하는데 멈춘 세션은 없다. InnoDB가 스스로 한쪽을 롤백하므로 '지금 대기 중' 화면에는 아무것도 남지 않는다 | 중급 01. 트랜잭션과 잠금 |
| 🔥 1-3 락 지옥 | 커밋되지 않은 트랜잭션이 만든 잠금 대기 사슬. 사슬의 뿌리 하나만 정확히 끊어야 한다 | 중급 01. 트랜잭션과 잠금 |
| 🔥 1-4 멈춘 배포 | ALTER TABLE이 멈췄는데 잠금 대기 화면은 비어 있다. 행 잠금이 아니라 메타데이터 잠금이다 |
중급 01. 트랜잭션과 잠금, 중급 06. 스키마 변경 관리 |
| 🔧 2-1 리포팅 서버 붙이기 | 복제가 배선되지 않은 replica를 GTID 기반으로 직접 붙인다. 왜 빈 상태에서 출발해야 하는지도 함께 | 중급 05. 복제 기초 |
| 🔥 2-2 멈춘 리포트 | 복제 연결은 멀쩡한데 데이터만 뒤처진다. 범인은 replica에 있다 — 읽기 전용은 안전과 다르다 | 중급 05. 복제 기초, 고급 02. 고가용성과 장애조치 |
| 🔥 3-1 문이 닫혔다 | 반환되지 않은 커넥션이 한도를 채워 새 접속이 거부된다. 한도를 올리는 것은 복구가 아니라 유예다 | 중급 03. 성능 모니터링, 고급 01. 고급 성능 튜닝 |
| 🔥 3-2 지워지지 않는 과거 | 아무도 막히지 않았는데 느려진다. 잠금을 하나도 잡지 않은 트랜잭션이 범인이라, 1-3의 진단 화면은 비어 있다 | 중급 01. 트랜잭션과 잠금, 고급 01. 고급 성능 튜닝 |
| 🔥 3-3 쌓아둔 것의 값 | 특정 테이블만 쓰기가 실패한다. DELETE로는 공간이 돌아오지 않고, 가득 찬 뒤에는 재구축조차 자리가 없다 |
초급 06. 기본 모니터링, 중급 03. 성능 모니터링 |
| 🔥 3-4 있지도 않은 중복 | 'Duplicate entry'가 나는데 그 값으로 조회하면 행은 하나뿐이다. 오류 메시지가 가리키는 곳과 원인이 다르다 — id 공간이 바닥났다 | 초급 01. RDBMS 기초, 중급 06. 스키마 변경 관리 |
| 🔥 4-1 느린 화면 | 인덱스 없는 조회가 만든 적체. 범인이 없고 KILL로도 풀리지 않는 첫 스테이지 |
중급 02. 인덱싱과 쿼리 튜닝, 고급 01. 고급 성능 튜닝 |
| 🔧 4-2 보이지 않는 느림 | 고칠 것이 아니라 갖출 것이 과제다. 슬로우 쿼리 로그를 구성하고, 켜는 것만으로는 부족하다는 것까지 확인한다 | 중급 03. 성능 모니터링, 초급 06. 기본 모니터링 |
| 🔥 4-3 있는데 쓰지 않는다 | CPU는 타는데 슬로우 쿼리 로그는 비어 있다. 인덱스도 있다. possible_keys 에는 있는데 key 가 NULL — 쓸 수 있었는데 쓰지 않은 것이다 |
중급 02. 인덱싱과 쿼리 튜닝, 고급 01. 고급 성능 튜닝 |
PostgreSQL 스테이지는 선택 화면에서 따로 고른다(./shoot --dbms postgresql). 랩이 프로파일 뒤에 있으므로 ./shoot up --with-postgresql 로 띄운다.
| 스테이지 | 무엇을 겪는가 | 관련 챕터 |
|---|---|---|
| 🔥 1-1 아무 일도 하지 않는 범인 | 자원은 한가한데 결제만 멈췄다. 범인은 아무 질의도 돌리고 있지 않은 idle in transaction 세션이라, pg_cancel_backend 는 성공을 돌려주고도 아무것도 바꾸지 못한다 |
중급 01. 트랜잭션과 잠금, 초급 06. 기본 모니터링 |
스테이지는 앞의 것을 푼 사람의 반사를 일부러 배신하도록 배치돼 있다. 1-3에서 배운
data_lock_waits는 1-4에서 빈 화면을 돌려주고, 3-2에서는 그 화면이 비어 있다는 사실 자체가 단서가 된다. 1-3·1-4에서 통했던KILL은 4-1에서 오히려 감점 대상이다. 4-2에서 직접 갖춘 슬로우 쿼리 로그는 4-3에서 끝내 비어 있다 — 도구가 조용한 것과 문제가 없는 것은 다르다. 벤더를 건너가면 한 겹 더 있다 — MySQL 1-3에서 익힌 '사슬의 뿌리를 끊는다'는 PostgreSQL 1-1에도 통하지만, 뿌리가 놀고 있어서 질의를 취소하는 명령은 성공을 돌려주고도 아무것도 하지 않는다.
- 각 챕터(개요 제외)는 핵심 개념 설명 → 주요 명령어/문법 → 실습 예제 → 체크리스트 순서로 구성되어 있다. 체크리스트를 통과하면 다음 챕터로 넘어간다.
- 명령어는 기본적으로 PostgreSQL → MySQL → Oracle 순서로 병기하며, 차이가 클 때는 별도로 표기한다. 용어나 명령어가 헷갈리면 DBMS 비교표를 확인한다.
- 낯선 용어가 나오면 용어집에서 찾아보고, 관련 챕터로 이동해 더 깊이 학습한다.
- 각 단계의
00-overview.md에 있는 체크리스트로 스스로 단계 이동 준비가 되었는지 점검한다. - 지금 보고 있는 것이 어느 시점의 학습서인지는 릴리스 페이지에서 확인한다. 버전을 매기는 기준과 릴리스 절차는
docs/release-policy.md에 정리돼 있다.