245. Compensation Log Record (CLR) - Undo 보상 로그 중복 Undo 방지 ARIES 복구 데이터베이스 회복 멱등성 롤백
핵심 인사이트: (Undo의 영원한 저주를 부수는 최후의 마법) "야! 243번에서 ARIES 복구할 때, 덜 끝난 찌끄러기(미커밋) 놈들을 찾아내서 로그를 뒤져가며 벅벅 닦아내는(Undo 롤백) 청소를 한다고 했지? 근데 네가 청소(Undo)를 50%쯤 신나게 하다가, 재수 없게 서버에 벼락이 또 쳐서 또 기절해 버렸어!! 재부팅 후 DB가 눈을 떴다. '어라? 아까 롤백 치다 말았네? 처음부터 다시 Undo(취소) 벅벅 지워야지~' 하고 이미 지웠던 걸 두 번 세 번 또 지워버리면(중복 Undo) 엑셀 원본 값이 우주로 튕겨나가 썩어버린다!! '야 이 멍청한 엔진아!! 네가 Undo(취소) 청소를 한 번 때릴 때마다, 그냥 입 싹 닦지 말고 무조건 블랙박스 로그에다가 [나 방금 이거 Undo(취소) 완료했음!! (CLR)] 이라고 보상 로그(영수증)를 추가로 쾅 박아두라고!!' 그럼 벼락을 10번 연속 쳐맞고 10번 재부팅 돼도, CLR 영수증이 있으니까 이미 청소(Undo)한 건 건너뛰고 완벽하게 100% 멱등성(안전빵)으로 롤백을 끝낼 수 있잖아!!" 끝없는 재앙(반복 장애) 속에서도 롤백을 완수하는 ARIES의 불사조 기술, CLR이다.
Ⅰ. Undo(취소) 도중에 죽어버리는 악몽
- 트랜잭션
T1이 100만 원, 200만 원, 300만 원을 입금하다가(Write) 뻗었습니다. - DB 엔진이 재부팅 되어 **Undo(롤백)**를 시작합니다.
- 거꾸로 뒤지면서 300만 원 취소! 200만 원 취소! 성공적으로 과거로 돌려놨습니다.
- 재앙의 순간: 이제 100만 원을 취소하려는 찰나에 정전으로 서버가 두 번째로 또 뻗었습니다!
- 재부팅 된 서버는 기억이 없습니다. "어?
T1뻗었네? 300만 원, 200만 원 취소해야지!" 하고 이미 취소해서 0원이 된 계좌에서 300, 200을 또 빼버려(중복 Undo) 계좌가 마이너스 500만 원이 되는 논리적 파탄(일관성 붕괴)이 터집니다.
Ⅱ. CLR (Compensation Log Record)의 개념 🌟
- Compensation (보상, 만회하는) + Log Record (로그 기록)
- 개념: 243번 ARIES 알고리즘의 Undo(취소) 페이즈에서, DB가 시스템 장애를 복구하기 위해 기존의 변경 사항을 닦아내는 'Undo 연산'을 1건 수행할 때마다, "나 이 작업 롤백(Undo) 성공적으로 끝마쳤다!"라는 흔적을 새로운 로그 레코드(CLR) 형태로 로그 파일에 꼬박꼬박 추가로 기록해 두는 특수 보상 로그입니다.
Ⅲ. CLR이 멱살 잡고 하드캐리하는 기적의 메커니즘 🌟 핵심 🌟
1. Redo Only 속성 (절대 다시 지워지지 않는 영수증)
- CLR도 로그 파일에 기록되는 로그입니다. 하지만 **"CLR은 오직 Redo(재실행)만 가능하고, 절대 다시 Undo(취소) 될 수 없다"**는 무적의 속성을 가집니다.
- 즉, 내가 지운 짓(Undo)을 '확정된 사실'로 영원히 블랙박스에 봉인해 버립니다.
2. 멱등성 (Idempotence)의 100% 달성 🌟 기출 단골 🌟
벼락을 10번 맞아도 복구가 꼬이지 않는 비밀입니다.
- 아까처럼
300만 취소,200만 취소를 때릴 때마다, 엔진은 로그 파일 끝에[CLR: 300만 취소 완료],[CLR: 200만 취소 완료]라고 영수증을 적어뒀습니다. 그리고 정전으로 뻗었습니다. - 재부팅 후 엔진이 2단계 Redo 페이즈로 밀고 나갈 때 이 CLR 영수증들을 보게 됩니다.
- "오, 아까 죽기 전에 이놈들이 300만, 200만을 지우는(Undo) 짓거리를 성공적으로 해놨었구나? 그럼 나는 이 CLR 영수증에 적힌 대로 지웠던 짓거리를 똑같이 Redo(재실행)해서 살려놓을게!"
- 3단계 Undo 페이즈로 넘어옵니다. "아, 이미 300만, 200만은 완벽하게 취소 처리(CLR) 되어 있네? 나는 중복해서 또 지울(Undo) 필요 없이 스킵하고, 아직 CLR 영수증이 없는 마지막 '100만 원'만 딱 취소(Undo)하면 완벽하군!!"
- 복구 도중 100번이 뻗어도 이미 지운 건 절대 다시 지우지 않는(중복 Undo 방지) 무적의 방패입니다.
Ⅳ. 왜 일반 Undo에는 안 쓰고 ARIES에서만 쓸까?
- 과거의 멍청한 회복 기법들은 복구 중에 뻗으면 답이 없어서 그냥 처음부터 싹 다 롤백을 처음부터 다시 돌렸습니다(성능 개박살).
- IBM 천재들이 고안한 **ARIES(243번)**는 "복구하다 죽어도, 내가 복구한 데까진 인정해 주고 거기서부터 이어서 복구하자!"라는 미친 효율성을 추구했기에, 이 '내가 어디까지 지웠는지 기록해 두는 북마크(CLR)'가 절대적으로 필요했던 것입니다.
📢 섹션 요약 비유: **CLR(보상 로그 레코드)**은 폭설로 뒤덮인 고속도로에서 제설차(Undo 롤백 엔진)가 눈을 치울 때 바닥에 박아두는 **'눈 치움 완료 깃발(영수증)'**입니다. 제설차(트랜잭션)가 10km 도로에 쌓인 눈(미확정 쓰레기 데이터)을 뒤에서부터 1km씩 벅벅 치우고(Undo 취소) 있습니다. 바보 제설차는 그냥 치우기만 하다가 3km쯤 치웠을 때 기름이 떨어져 퍼졌습니다(복구 중 2차 시스템 장애). 다음 날 새 제설차가 오면? 어디까지 치웠는지 몰라 다시 0km 지점부터 헛발질하며 눈을 또 긁습니다(중복 Undo 폭발). 하지만 **ARIES 제설차(CLR 도입)**는 1km를 치울 때마다 갓길에 "1km 눈 치움 완료!(CLR 로그)"라는 빨간 깃발을 쾅쾅 박아두며 전진합니다. 중간에 기름이 떨어져 3km에서 퍼져버려도, 내일 온 새 제설차는 빨간 깃발이 꽂힌 3km 구간까지는 쿨하게 악셀 밟고 스킵(중복 롤백 방지)한 뒤, 깃발이 없는 4km 지점부터만 정확하게 눈을 긁기(남은 Undo 이어서 실행) 시작합니다. 복구(청소) 작업 도중에 수백 번 벼락을 맞고 시스템이 죽어 자빠져도, 내가 지워둔 땀방울의 흔적(CLR)을 절대 잃어버리지 않고 이어달리기를 완성하게 해주는 DB 회복의 불로장생 세이브 마커입니다.