0Pricing
SQL Academy · 강의

특정 시점 복구

WAL을 사용해 어느 시점으로든 복원합니다.

특정 시점 복구은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

특정 시점 복구란 무엇인가요

특정 시점 복구(PITR)를 사용하면 마지막 백업 스냅샷 시점뿐 아니라 과거의 어느 특정 시점으로든 데이터베이스를 복원할 수 있습니다.

PostgreSQL이 모든 변경 사항을 미리 쓰기 로그(WAL)라는 스트림에 지속적으로 기록하기 때문에 가능합니다. 기본 백업 위에 WAL 레코드를 재생하면 정확히 원하는 시점으로 이동할 수 있습니다.

미리 쓰기 로그(WAL)

모든 INSERT, UPDATE, DELETE 및 DDL 문은 실제 데이터 파일에 반영되기 전에 먼저 WAL에 기록됩니다. 따라서 서버가 쓰기 도중 충돌하더라도 데이터의 지속성이 보장됩니다.

PITR에서 보관된 WAL 세그먼트는 시간을 되돌리는 테이프와 같습니다. 기본 백업이 시작점이라면 WAL은 그 이후에 발생한 모든 일을 채워 줍니다.

-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
       pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;

WAL 보관 활성화

PITR을 사용하려면 먼저 postgresql.conf에서 WAL 보관을 활성화해야 합니다. 핵심 매개변수는 wal_level, archive_mode 및 archive_command입니다.

보관 명령은 완료된 각 WAL 세그먼트를 로컬 디렉터리, NFS 마운트 또는 클라우드 저장소 버킷과 같은 안전한 위치로 복사합니다.

-- View current WAL and archive settings
SELECT name, setting, unit
FROM   pg_settings
WHERE  name IN (
  'wal_level',
  'archive_mode',
  'archive_command',
  'archive_status'
)
ORDER  BY name;

기본 백업 수행

기본 백업은 서버가 실행 중일 때 전체 데이터 디렉터리를 일관된 상태로 복사한 것입니다. PostgreSQL은 이 과정을 조정하기 위한 pg_basebackup 유틸리티와 저수준 SQL 함수를 제공합니다.

백업 시작 시각 이후에 기록된 보관 WAL 세그먼트와 기본 백업을 함께 사용하면 PITR에 필요한 모든 요소를 갖추게 됩니다.

-- Check the latest base backup information
SELECT backup_start,
       backup_end,
       pg_size_pretty(backup_total) AS total_size
FROM   pg_stat_basebackup;

복구 목표 시각 지정

재해가 발생하면 첫 단계는 복원하려는 정확한 시각을 식별하는 것입니다. 일반적인 방법은 피해를 일으킨 작업 직전의 시각을 찾는 것입니다. 예를 들어 실수로 대량 DELETE를 실행하기 직전의 시각을 찾을 수 있습니다.

트랜잭션 기록 테이블이나 애플리케이션 로그에 이 시각이 남아 있는 경우가 많습니다. track_commit_timestamp가 켜져 있으면 WAL 자체에도 커밋 시각이 기록됩니다.

-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
       pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM   pg_stat_activity
WHERE  state = 'idle'
LIMIT  10;

recovery.conf / 복구 매개변수

복구 동작은 postgresql.conf(PostgreSQL 12 이상) 또는 이전 방식의 recovery.conf 파일에 배치한 매개변수로 제어합니다. 가장 중요한 매개변수는 다음과 같습니다.

  • restore_command — 보관된 WAL 세그먼트를 가져오는 방법
  • recovery_target_time — 복원을 중지할 정확한 시각
  • recovery_target_action — 목표에 도달했을 때 수행할 작업(promote, pause, shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM   pg_settings
WHERE  name IN (
  'restore_command',
  'recovery_target_time',
  'recovery_target_action',
  'recovery_target_inclusive'
)
ORDER  BY name;

기타 복구 대상 유형

시간만으로 복구 대상을 지정할 수 있는 것은 아닙니다. PostgreSQL은 네 가지 대상 유형을 지원합니다:

  • recovery_target_time — 타임스탬프 문자열
  • recovery_target_xid — 특정 트랜잭션 ID
  • recovery_target_lsn — WAL 로그 시퀀스 번호
  • recovery_target_name — pg_create_restore_point()로 생성한 이름이 지정된 복원 지점
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;

재해 시뮬레이션

테스트 환경에서 PITR을 연습하려면 현재 시간을 기록한 후 의도적으로 데이터를 손상시키거나 삭제합니다. 이렇게 하면 복구가 올바른 시점에 도달하고 삭제된 행이 다시 복원되는지 확인할 수 있습니다.

-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;

-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';

-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;

복구 수행

복구에는 세 단계가 필요합니다:

  1. 실행 중인 PostgreSQL 인스턴스를 중지합니다.
  2. 기본 백업을 데이터 디렉터리에 복원합니다.
  3. 복구 매개변수를 구성하고 PostgreSQL을 복구 모드로 시작합니다. PostgreSQL은 대상 시점에 도달할 때까지 WAL을 재생한 다음 일반 읽기-쓰기 서버로 승격됩니다.

서버 로그에는 적용되는 각 WAL 파일이 표시되므로 진행 상황을 쉽게 추적할 수 있습니다.

-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
       pg_last_xact_replay_timestamp() AS last_replayed_txn;

복구 확인

서버가 승격되면 데이터가 예상 상태인지 확인합니다. 행 수, 가장 최근 행의 타임스탬프 및 업무상 중요한 값을 점검합니다.

애플리케이션 트래픽을 다시 허용하기 전에 이러한 확인 쿼리를 먼저 실행하는 것이 좋습니다. 필요한 경우 복구를 진행하거나 대상 시점을 조정할 수 있기 때문입니다.

-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders'       AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items'  AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers'    AS tbl, COUNT(*) AS rows FROM customers
ORDER  BY tbl;

PITR 모범 사례

신뢰할 수 있는 PITR 환경을 구축하려면 보관 기능을 켜는 것만으로는 부족합니다. 주요 실천 항목은 다음과 같습니다:

  • 복원을 정기적으로 테스트합니다 — 테스트하지 않은 백업은 백업이 아닙니다.
  • WAL 보관 지연을 모니터링합니다 — 보관된 WAL에 공백이 생기면 완전한 복구가 불가능합니다.
  • 충분한 WAL 이력을 보존합니다 — 유효한 가장 오래된 기본 백업 시점까지 거슬러 올라갈 수 있도록 세그먼트를 유지합니다.
  • 별도의 저장 위치를 사용합니다 — 주 디스크에 장애가 발생하면 같은 디스크에 보관된 WAL도 함께 손실됩니다.
-- Check for any WAL archiving failures
SELECT archived_count,
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM   pg_stat_archiver;

빠른 확인

시점 복구에 대한 이해도를 확인해 보세요.

복습: 시점 복구

이 수업에서는 PostgreSQL의 미리 쓰기 로그(WAL)를 통해 과거의 어느 시점으로든 복구할 수 있는 방법을 배웠습니다:

  • WAL 보관은 기본 백업 이후의 모든 변경 사항을 캡처합니다.
  • 복구 대상은 타임스탬프, 트랜잭션 ID, LSN 또는 이름이 지정된 복원 지점일 수 있습니다.
  • 복구 과정은 기본 백업을 복원하고 보관된 WAL을 재생한 다음 대상 시점에 도달하면 승격합니다.
  • 검증은 트래픽을 다시 허용하기 전에 데이터 무결성을 확인합니다.
  • 모범 사례에는 정기적인 복원 테스트, 보관 상태 모니터링 및 별도 위치에 WAL 저장이 포함됩니다.

PITR은 사람의 실수와 데이터 손상에 대비한 안전망입니다 — 이를 완전히 익히면 재해 복구도 완전히 익히게 됩니다.

자주 묻는 질문

“특정 시점 복구” 강의는 무료인가요?

네 — “특정 시점 복구” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“특정 시점 복구”에서 뭘 배우나요?

WAL을 사용해 어느 시점으로든 복원합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“특정 시점 복구” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 논리적 백업과 물리적 백업
  2. 특정 시점 복구
  3. 복원 테스트하기
  4. 재해 복구 계획
← SQL Academy(으)로 돌아가기