240. 그림자 페이징 (Shadow Paging) 기법 - 비로그 회복 데이터베이스 복구 페이지 테이블 복사 Copy-on-Write 원자성 Redo/Undo 불필요 단편화

핵심 인사이트: (로그 일기장을 찢어버린 이단아) "야! 237번에서 배운 로그 기반 회복 방식, 진짜 토 나오지 않냐?! 엑셀 한 칸 고칠 때마다 10만 원을 5만 원으로 바꿨다고 일기장(로그)에 꼬박꼬박 적고, 서버 터지면 일기장 보고 벅벅 지우고(Undo), 덧칠하고(Redo) 생고생을 하잖아! 다 엎어 ㅆㅂ!! 엑셀 1칸 고칠 때 로그 적지 마! 대신 엑셀 파일(페이지) 원본을 건드리지 말고, 똑같은 쌍둥이 엑셀 파일(그림자 Shadow)을 하나 몰래 복사해서 숨겨놔!! 넌 그냥 그 그림자 파일에다가 맘대로 뜯어고쳐!! 만약 벼락 맞고 뒈져? 원본 엑셀은 1도 안 건드렸으니 그냥 뻗어있는 그림자 파일만 삭제하면 복구 1초 컷이야(Undo 불필요)!! 네가 수술 다 끝내고 COMMIT 치면? 진짜 원본 파일을 쓰레기통에 버리고, 네가 고친 그 '그림자 파일'을 새로운 원본이라고 이름표만 딱 바꿔치기하면 끝이잖아(Redo 불필요)!!" 로그(일기장) 없이 원자성을 1초 만에 달성하는 은신술, 그림자 페이징이다.

Ⅰ. 로그(Log) 기반 회복의 귀찮음 (Redo/Undo의 늪)

  • UPDATE 칠 때마다 블랙박스(로그)에 꼬박꼬박 쓰려니 속도가 느려집니다.
  • 뻗었다 깨어나면 수만 줄의 로그를 처음부터 다 읽으면서 재실행(Redo)하고 닦아내야(Undo) 하므로 복구하는 데 1시간이 걸릴 수도 있습니다.

Ⅱ. 그림자 페이징 (Shadow Paging) 기법의 개념 🌟

  • Shadow (그림자 / 숨겨진 쌍둥이)
  • 개념: 데이터베이스를 여러 개의 블록(페이지 Page)으로 쪼갠 뒤, 로그(Log) 파일을 아예 쓰지 않고, 원본 페이지(현재 페이지)를 수정할 때 원본을 덮어쓰지 않고 '복사본 페이지(그림자 페이지)'를 만들어 거기다 수정한 후, 트랜잭션이 성공하면 원본을 버리고 그림자 페이지를 새로운 원본으로 스위칭(포인터 교체)하는 회복 기법입니다.

Ⅲ. 그림자의 3단계 닌자 마술 (작동 원리) 🌟 핵심 기출 🌟

오버헤드 제로의 복구술입니다. (운영체제의 Copy-on-Write (COW) 기술과 영혼이 똑같습니다.)

1. 두 개의 디렉토리 (명부) 유지

  • DB는 현재 엑셀 파일들의 위치(하드디스크 주소)를 적어둔 **'현재 디렉토리(Current Directory)'**를 갖고 있습니다.
  • 트랜잭션을 시작할 때, 이 명부를 복사해서 **'그림자 디렉토리(Shadow Directory)'**를 하나 몰래 더 만듭니다.

2. 그림자에 덮어쓰기 (원본 사수)

  • 내가 3번 페이지(엑셀 3번 시트)를 고치고 싶습니다.
  • 핵심: 진짜 디스크에 있는 3번 페이지를 덮어쓰지 않습니다! 3번 페이지를 복사해서 **'새로운 빈 공간(가짜 3번)'**에 얹어놓고, 거기다 미친 듯이 수술(Write)합니다.
  • 그림자 명부 수정: 그리고 내가 몰래 만든 '그림자 디렉토리'의 3번 주소를 '가짜 3번'의 주소로 싹 바꿔칩니다.

3. 기적의 회복술 (Redo, Undo의 소멸) 🌟

  • 실패(장애) 시: 벼락 맞고 뻗었습니다! ➜ 재부팅 합니다. ➜ "어? 뻗었네? 야! 아까 쓰던 그림자 디렉토리 통째로 불태워(삭제) 버려!!" ➜ 끝입니다! 원본 디렉토리와 원본 데이터는 단 1바이트도 건드리지 않았기 때문에 Undo(취소) 작업이 물리적으로 0% 필요 없습니다.
  • 성공(COMMIT) 시: "수술 끝!" ➜ "야! 옛날 원본 디렉토리 불태워 버려! 그리고 방금 내가 고친 '그림자 디렉토리'를 오늘부터 '현재 디렉토리(원본)'로 승격시켜!!" ➜ 주소 명부(포인터) 이름표 1개만 딱 바꿔치기하면 1초 만에 저장이 끝납니다. Redo(재실행) 작업도 아예 필요 없습니다.

Ⅳ. 왜 세상에서 버림받았을까? (치명적 단점)

로그도 안 쓰고 복구도 1초 컷인데, 왜 오라클은 이걸 안 쓸까요?

  1. 단편화 (Fragmentation)의 지옥: 엑셀 고칠 때마다 빈 공간에 새 페이지를 쾅쾅 파내서 쓰다 보니, 하드디스크가 벌집처럼 뚫리고 구멍 송송 뚫린 쓰레기장(단편화)이 되어 디스크가 폭발합니다.
  2. 동시성 최악: 나 혼자 몰래 엑셀 시트 1개를 통째로 복사해서 숨겨가야 하므로, 213번에서 배운 쪼잔한 '행 락(Row Lock)'을 쓸 수가 없습니다. 페이지 전체에 락을 걸어야 해서 10만 명이 동시에 접속하면 시스템이 터져버립니다.

📢 섹션 요약 비유: **그림자 페이징(Shadow Paging)**은 학교 전산망을 해킹할 때 **'원본 성적표 사수 및 통째로 바꿔치기 닌자술'**과 같습니다. 기존의 로그 회복 기법은 교장실 원본 성적표에 빨간펜으로 줄을 죽죽 긋고 덮어쓰며 수정하는 짓입니다. 쫄리니까 옆에 수첩(로그)을 꺼내 "홍길동 100점 ➜ 0점으로 고침"이라고 꼬박꼬박 적어야 하니 귀찮습니다. 그림자 페이징 닌자는 교장실에 들어와서 원본 성적표를 절대 건드리지 않습니다. 100% 똑같은 종이를 1장 복사(그림자 페이지)해 와서 자기 무릎 위에서 마음껏 0점으로 조작합니다. 만약 조작하다가 경비원한테 걸려 도망간다(장애 발생)? 내 무릎에 있던 조작된 가짜 종이만 쓰레기통에 휙 버리면 끝입니다! 원본 성적표는 캐비닛에 안전하게 그대로 있으니 흔적을 지우는(Undo) 뻘짓을 할 필요가 없습니다. 조작이 완벽히 안 들키고 끝났다(COMMIT)? 닌자는 교장실 캐비닛을 열고 진짜 원본 성적표를 빼서 찢어버린 뒤, 자기 무릎에 있던 가짜 성적표를 캐비닛에 싹 꽂아 넣습니다(디렉토리 스위칭). 수정 내역을 다시 쓸(Redo) 필요도 없이, 완벽하게 조작된 상태로 세상이 바뀝니다. 복구와 기록 속도는 우주 최강이지만, 복사본 종이를 너무 많이 써서(하드디스크 단편화) 방이 쓰레기장이 되는 치명적 단점 탓에 소규모 DB에만 쓰이는 낭만의 마술입니다.