v1.0.0 — 읽고, 풀고, 겪는 DBA 학습서
2026-07-15 첫 커밋 이후 커밋 54개 · PR 38건이 쌓여 이 저장소는 세 축을 모두 갖췄다.
읽는 가이드(3단계 커리큘럼), 푸는 학습 점검(./exam), 겪는 장애 대응
게임(./shoot). v1.0.0은 그 셋이 처음으로 한자리에 모인 시점을 표시한다.
| 축 | 무엇 | 규모 |
|---|---|---|
| 학습서 | 예비 DBA → 시니어 DBA/아키텍트 3단계 커리큘럼 | 챕터 23개 + 치트시트 3장 + 부록 2종 |
./exam |
챕터별 학습 점검 퀴즈/시험 TUI | 문제은행 23개 (전 챕터) |
./shoot |
로컬 Docker 랩에 실제 장애를 주입하는 대응 게임 | 스테이지 14개 (월드 4개, MySQL·PostgreSQL) |
외부 의존성은 없다. 실행 코드는 Python 3 표준 라이브러리와 Bash뿐이고, pip도
npm도 빌드 단계도 쓰지 않는다.
읽는다 — 3단계 커리큘럼
경력 단계가 디렉터리 이름에 그대로 박혀 있다.
01-beginner(예비/신입 DBA) — RDBMS 기초 · SQL 기초 · 설치/접속 · 계정·권한 · 기본 백업 · 기본 모니터링02-intermediate(실무 독립 수행 DBA) — 트랜잭션/락 · 인덱싱/쿼리튜닝 · 성능 모니터링 · 백업·복구 전략 · 복제 · 스키마 변경 관리 · 클라우드 DB 인프라 · 매니지드 DB 기초03-advanced(시니어 DBA / DB 아키텍트) — 고급 튜닝 · 고가용성/페일오버 · 재해복구 · 확장/샤딩 · 보안/컴플라이언스 · 자동화(IaC) · 매니지드 DB 심화 · Kubernetes DB Operator · 장애 대응/포스트모템
모든 챕터는 핵심 개념 → 명령어/문법 → 실습 예제 → 체크리스트 네 절을 같은 순서로
지킨다. 명령어는 PostgreSQL → MySQL → Oracle 순으로 병기하되, 문법만 다른 곳이 아니라
동작이 실제로 갈리는 곳에서만 차이를 짚는다. 각 티어의 00-overview.md는 선수 지식과
다음 단계로 넘어갈 졸업 기준을 체크리스트로 제시한다.
곁들여 있는 것:
- 티어마다
*-commands-cheatsheet.md— 그 단계의 명령어를 3개 DBMS 열로 비교한 한 장짜리 표 appendix/dbms-comparison-matrix.md— 클라우드 매니지드 서비스(AWS/GCP/Azure)까지 포함한 교차 비교표appendix/glossary.md— 전 티어 용어집03-advanced/labs/oracle-mysql-operator-kind/— kind 위에서 Oracle MySQL Operator를 직접 세워 보는 실습 랩
보고 싶은 DBMS만
main은 벤더 중립을 유지하고, 벤더 전용 문단·코드블록·체크리스트 항목은
<!-- dbms:postgresql --> 류의 마커로 감싼다. scripts/generate-branch.sh <dbms>가
이를 걸러 postgresql /
mysql /
oracle 브랜치를 재생성한다.
v1.0.0 기준 마킹 대상 챕터는 전부 마킹 완료다(치트시트와 부록 비교표는 설계상
필터링하지 않는다). 세 브랜치 모두 main@c98a6e0에서 재생성돼 동기 상태다.
파생 브랜치는 직접 수정하지 않는다. 규약은
docs/dbms-branch-strategy.md.
푼다 — ./exam
챕터를 읽고 나서 실제로 남았는지 확인하는 TUI다.
./exam # DBMS → 티어 → 챕터를 화면에서 고른다
./exam 02-intermediate # 티어 전체를 시험 모드로
./exam --dbms postgresql # 그 벤더 문항만- 전 챕터 23개의 문제은행이
exams/<tier>/<chapter>.json에 들어 있다 - 객관식·단답(
short) 혼합. 벤더 종속 명령은dbms태그가 붙어--dbms필터에 걸린다 - curses TUI가 기본, 터미널이 아니면 라인 모드로 자동 폴백해 파이프에서도 돌아간다
- 결과는 로컬에 저장돼 약한 챕터를 다시 짚을 수 있다
문항 작성 규약(정답 노출 금지 규칙 포함)은 docs/exam-authoring.md.
초안 생성기 scripts/seed_exam.py가 챕터에서 문항 뼈대를 뽑아 준다.
겪는다 — ./shoot
읽어서 아는 것과 새벽 3시에 고치는 것은 다르다. ./shoot은 로컬 Docker 랩에 진짜
장애를 주입하고, 플레이어가 그것을 진단·복구하는 과정을 판정한다.
./shoot doctor # 사전 점검 (docker / 포트 / 클라이언트 / 스테이지 정의)
./shoot up # 랩 기동 (--with-postgresql 로 PG 랩까지)
./shoot # DBMS → 월드 → 스테이지를 골라 플레이
./shoot 1-2-deadlock # 바로 그 스테이지로
./shoot replay # 마지막 판을 같은 시드로 다시
./shoot notes # 지난 포스트모템 노트 읽기
./shoot down # 랩 정리스테이지 14개
| 월드 | 스테이지 |
|---|---|
| 1 · 잠금과 대기 | 1-1 끝나지 않는 리포트(폭주 쿼리) · 1-2 서로를 기다리다(데드락) · 1-3 락 지옥 · 1-4 멈춘 배포(메타데이터 락) |
| 2 · 복제 | 2-1 리포팅 서버 붙이기(구축형) · 2-2 멈춘 리포트(복제 지연) |
| 3 · 자원 고갈 | 3-1 문이 닫혔다(커넥션 고갈) · 3-2 지워지지 않는 과거(롱 트랜잭션 undo) · 3-3 쌓아둔 것의 값(디스크 풀) · 3-4 있지도 않은 중복(AUTO_INCREMENT 상한) |
| 4 · 성능과 실행 계획 | 4-1 느린 화면(인덱스 부재) · 4-2 보이지 않는 느림(슬로우 로그 구성) · 4-3 있는데 쓰지 않는다(암묵적 형변환) |
| PostgreSQL | pg-1-1 아무 일도 하지 않는 범인(idle in transaction) |
랩은 MySQL primary/replica 2노드가 기본이고, PostgreSQL 랩은 compose 프로파일
뒤에 있어 ./shoot up --with-postgresql로만 뜬다. 포트는 루프백에만 바인딩된다.
이 게임을 게임으로 만드는 것들
- 판정은 사용자 분리 위에 선다 —
dba는 플레이어,app은 엔진이 만든 부하 세션,repl은 복제 계정,root@localhost는 엔진 자신이다. 플레이어 명령만 골라 읽으므로 엔진의 소음이 채점에 섞이지 않는다 - 판마다 숫자가 흔들린다 —
vars가 시드에서 파라미터를 변주해 답을 외워도 다시 봐야 한다../shoot replay는 같은 시드로 그 판을 그대로 되살린다 - 금지 명령을 감점한다 — 원인을 짚지 않고 재시작으로 뭉개는 지름길은
constraints가 잡는다 - 화면은 진짜 클라이언트다 — TUI 안에 SQL 콘솔을 만들지 않고
c키로 실제mysql/psql을 띄운다. 판정은 입력 경로가 아니라 로그에 남은 사용자로 하므로 영향받지 않는다 - 끝나면 포스트모템을 쓴다 — 초안에는 관측된 사실만(타임라인, 틀린 진단 문항, 위반 사항) 채워지고 근본 원인·5 Whys·액션 아이템은 비어 있다. 채우는 것이 훈련이다. 공식 해설은 편집기를 닫은 뒤에 붙어, 눈으로 보고 베끼는 일이 생기지 않는다
- 스테이지마다 읽어야 할 챕터가 연결돼 있어 게임에서 막히면 학습서로 돌아간다
스테이지는 전부 선언적 JSON(shooting/stages/*.json)이라 직접 만들 수 있다. 스키마와
작성 함정은 docs/shooting-game.md에 정리돼 있다.
시작하기
git clone https://github.com/Ahngbeom/dba-guide.git
cd dba-guide
# 읽기: README.md 의 로드맵부터
# 풀기:
./exam
# 겪기 (Docker 필요):
./shoot doctor && ./shoot up && ./shoot요구 사항 — Python 3(표준 라이브러리만), ./shoot에는 Docker와 mysql 클라이언트
(PostgreSQL 스테이지는 psql). ./shoot doctor가 빠진 것을 먼저 알려 준다.
알려진 한계
이 릴리스가 알고 감수하는 지점들이다. 감춰진 버그가 아니라 문서화된 경계다.
판정 (MySQL) — ① dba는 이후 튜닝 스테이지를 위해 SYSTEM_VARIABLES_ADMIN을
가지므로, 마음먹으면 엔진과 같은 방법(SET SESSION sql_log_off = 1)으로 자기 명령을
로그에서 숨길 수 있다. ② 명령 로그를 읽고 비우는 사이에 수 ms의 유실 창이 있다. 이
게임은 학습 도구이지 부정 방지 시스템이 아니며, 등급을 속여 얻는 것도 없다.
판정 (PostgreSQL 전용) — ① 실측 결과 파싱 오류는 감시 소스에 도달하지 않는다
(의미·권한 오류는 도달한다). ② SELECT pg_terminate_backend(pid) FROM pg_stat_activity
같은 일괄 종료는 pid를 명시하지 않아 kill_precision이 볼 수 없다 — 이런 스테이지는
forbidden_command로 잡는다.
커버리지 — PostgreSQL 스테이지는 아직 pg-1-1 하나뿐이다(월드 1만). Oracle은
브랜치 필터링까지만 지원하고 ./shoot 스테이지는 없다. 학습서 본문은 세 벤더 모두
동등하게 다룬다.
CI 없음 — 테스트 426개는 python3 -m unittest discover -s tests로 로컬에서 돈다.
v1.0.0 태그 시점 기준 전부 통과. 릴리스 전 점검이 사람 손에 달려 있다는 뜻이라,
그 목록과 절차는 docs/release-policy.md에 적어 두었다.
이 릴리스의 숫자
커밋 54개 · 머지된 PR 38건 · 2026-07-15 → 2026-08-05
챕터 23개 + 치트시트 3장 + 부록 2종
문제은행 23개 (전 챕터)
스테이지 14개 / 월드 4개 / DBMS 2종
테스트 426개 통과
외부 의존성 0개
전체 변경 이력: https://github.com/Ahngbeom/dba-guide/commits/v1.0.0