논리적 백업과 물리적 백업
pg_dump와 기본 백업을 알아봅니다.
논리적 백업과 물리적 백업은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
데이터베이스 백업이란 무엇인가요
백업은 데이터 손실, 손상 또는 재해가 발생한 후 시스템을 복원하는 데 사용할 수 있는 데이터베이스 데이터의 복사본입니다. 신뢰할 수 있는 백업이 없으면 단 한 번의 하드웨어 고장이나 실수로 실행한 DELETE만으로도 수개월 또는 수년간의 데이터가 영구적으로 사라질 수 있습니다.
PostgreSQL은 크게 두 가지 백업 전략을 제공합니다. 논리적 백업과 물리적 백업입니다. 각각 고유한 특성, 사용 사례 및 절충점이 있으므로 모든 DBA가 이를 이해해야 합니다.
논리적 백업 설명
논리적 백업은 데이터베이스를 사람이 읽을 수 있는 SQL 문으로 내보냅니다. 여기에는 CREATE TABLE, INSERT, COPY와 같은 명령이 포함됩니다. PostgreSQL에서 이를 수행하는 가장 일반적인 도구는 pg_dump입니다.
출력이 일반 SQL이므로 논리적 백업은 이식성이 높습니다. 다른 PostgreSQL 버전이나 다른 운영 체제로 복원할 수 있고, 개별 테이블이나 스키마만 선택적으로 복원할 수도 있습니다. 반면 대규모 데이터베이스는 내보내기와 복원에 시간이 오래 걸릴 수 있습니다.
논리적 백업에 pg_dump 사용
pg_dump 유틸리티는 SQL 내부가 아니라 명령줄에서 실행합니다. 실행 중인 PostgreSQL 서버에 연결하여 선택한 데이터베이스를 내보냅니다. 일반 SQL, 사용자 지정 압축 형식 또는 디렉터리 형식으로 출력할 수 있습니다.
아래 SQL은 논리적 백업에 포함되는 내용을 시뮬레이션합니다. 즉, 테이블의 구조와 데이터를 재현 가능한 문으로 나타냅니다.
-- Simulating what pg_dump produces for a table
-- (These statements are written by pg_dump into the backup file)
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer TEXT NOT NULL,
amount NUMERIC(10,2),
created_at TIMESTAMPTZ DEFAULT now()
);
INSERT INTO orders (customer, amount, created_at) VALUES
('Alice', 149.99, '2024-01-15 09:30:00+00'),
('Bob', 89.50, '2024-01-16 14:00:00+00'),
('Carol', 210.00, '2024-01-17 11:15:00+00');pg_dump 출력 형식
pg_dump는 네 가지 출력 형식을 지원하며, 각각 서로 다른 복원 작업에 적합합니다.
- 일반 — 모든 텍스트 편집기에서 읽을 수 있는 일반 SQL 스크립트입니다.
- 사용자 지정 — 압축된 이진 형식이며 가장 유연하고 병렬 복원을 지원합니다.
- 디렉터리 — 테이블마다 파일 하나를 만들며 병렬 내보내기와 복원을 지원합니다.
- tar — 디렉터리 형식의 tar 아카이브입니다.
대규모 데이터베이스에는 사용자 지정 형식을 권장합니다. pg_restore가 -j N 작업자를 사용하여 객체를 병렬로 복원할 수 있기 때문입니다.
-- Checking which databases exist before choosing what to back up
SELECT datname,
pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
WHERE datname NOT IN ('template0', 'template1')
ORDER BY pg_database_size(datname) DESC;논리적 백업 복원
일반 SQL 논리적 백업은 psql로 복원합니다. 사용자 지정 형식의 백업에는 pg_restore가 필요합니다. 두 도구 모두 SQL 문을 다시 실행하여 테이블, 인덱스, 제약 조건 및 데이터를 재생성합니다.
논리적 백업에는 SQL이 포함되어 있으므로 복원하기 전에 내용을 편집할 수 있습니다. 예를 들어 테이블 하나만 복원하거나 스키마 이름을 변경할 수 있습니다. 이러한 유연성은 논리적 접근 방식의 가장 큰 장점 중 하나입니다.
-- After restoring a backup, verify row counts match expectations
SELECT
schemaname,
relname AS table_name,
n_live_tup AS estimated_rows
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;물리적 백업 설명
물리적 백업(기본 백업이라고도 함)은 PostgreSQL이 디스크에서 사용하는 원시 데이터 파일, 즉 페이지, WAL(미리 쓰기 로그) 세그먼트 및 구성 파일을 복사합니다. 그 결과 특정 시점의 전체 클러스터를 담은 이진 스냅샷이 생성됩니다.
대규모 데이터베이스에서는 SQL을 다시 실행할 필요가 없으므로 물리적 백업을 훨씬 빠르게 복원할 수 있습니다. PostgreSQL이 파일을 원래 위치에 다시 읽어 들이고 WAL을 재생하여 일관된 상태에 도달하기 때문입니다.
pg_basebackup: 물리적 백업 수행
pg_basebackup은 물리적 백업을 위한 표준 PostgreSQL 도구입니다. 복제 연결을 통해 실행 중인 기본 서버에서 데이터 디렉터리를 스트리밍합니다. 복제 권한이 있는 사용자와 wal_level을 replica 이상으로 설정하는 작업이 필요합니다.
기본 백업을 시도하기 전에 데이터베이스에서 복제 설정을 질의하여 서버가 올바르게 구성되었는지 확인할 수 있습니다.
-- Verify WAL level and replication settings before a physical backup
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'wal_level',
'max_wal_senders',
'archive_mode',
'archive_command'
)
ORDER BY name;WAL 보관과 특정 시점 복구
기본 백업은 특정 시점의 상태를 저장합니다. 해당 백업 이후의 임의의 시점으로 복구하려면 PostgreSQL이 보관된 WAL 세그먼트를 재생해야 하며, 이를 특정 시점 복구(PITR)라고 합니다.
archive_mode = on으로 설정하고 archive_command를 구성하면 PostgreSQL은 완료된 WAL 세그먼트를 보관 위치로 복사합니다. 복구 중에는 restore_command가 해당 세그먼트를 다시 가져와 서버가 원하는 목표 시각까지 재생할 수 있도록 합니다.
-- Inspect current WAL position and archive status
SELECT
pg_current_wal_lsn() AS current_lsn,
pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file,
archived_count,
failed_count,
last_archived_wal,
last_archived_time
FROM pg_stat_archiver;논리적 백업과 물리적 백업 비교
논리적 백업과 물리적 백업 중 무엇을 선택할지는 요구 사항에 따라 달라집니다.
- 논리적(pg_dump): 버전 간 이식이 가능하고 부분 복원을 지원하며 사람이 읽을 수 있지만, 대규모 데이터베이스에서는 느리고 하위 트랜잭션 단위의 세밀한 복원을 지원하지 않습니다.
- 물리적(pg_basebackup + WAL): 대규모 클러스터를 빠르게 복원하고 PITR을 지원하지만 특정 버전에 종속됩니다. 동일한 주 버전으로 복원해야 하며 전체 클러스터를 복원하므로 단일 테이블만 복원할 수 없습니다.
운영 환경에서는 일반적으로 두 가지 모두 사용합니다. 매일 밤 물리적 기본 백업을 수행하고 WAL을 지속적으로 보관하며, 이식성과 필요한 부분만 정밀하게 복원하기 위해 주기적으로 논리적 백업을 내보냅니다.
백업 무결성 확인
한 번도 검증하지 않은 백업은 백업이 아니라 희망 사항일 뿐입니다. 항상 백업을 검증 환경에 복원하고 데이터를 확인하여 백업의 유효성을 검사해야 합니다.
논리적 백업의 빠른 무결성 확인 방법은 행 수를 세고 체크섬을 비교하는 것입니다. 물리적 백업의 경우 PostgreSQL 14 이상에서 pg_verifybackup이 도입되어 pg_basebackup이 작성한 매니페스트 파일을 확인할 수 있습니다.
-- After a test restore, compare row counts across critical tables
SELECT
relname AS table_name,
n_live_tup AS live_rows,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_stat_user_tables
WHERE schemaname = 'public'
ORDER BY n_live_tup DESC
LIMIT 20;백업 모니터링과 일정 관리
백업을 자동화하고 모니터링하는 일은 백업을 수행하는 것만큼 중요합니다. 백업이 마지막으로 실행된 시각, 걸린 시간 및 성공 여부를 추적해야 합니다. PostgreSQL은 이를 위해 유용한 메타데이터를 제공합니다.
물리적 백업의 경우 pg_stat_archiver에서 마지막으로 성공한 보관 작업과 모든 실패를 확인할 수 있습니다. 논리적 백업의 경우 pg_dump를 시작 시각, 종료 시각, 파일 크기 및 종료 코드를 모니터링 테이블이나 알림 시스템에 기록하는 스크립트로 감싸야 합니다.
-- Create a simple backup log table to track logical backup runs
CREATE TABLE IF NOT EXISTS backup_log (
id SERIAL PRIMARY KEY,
backup_type TEXT NOT NULL CHECK (backup_type IN ('logical', 'physical')),
started_at TIMESTAMPTZ NOT NULL DEFAULT now(),
finished_at TIMESTAMPTZ,
size_bytes BIGINT,
status TEXT NOT NULL DEFAULT 'running',
notes TEXT
);
-- Record the start of a logical backup job
INSERT INTO backup_log (backup_type, status)
VALUES ('logical', 'running')
RETURNING id, started_at;논리적 백업과 물리적 백업: 간단한 확인
PostgreSQL의 논리적 및 물리적 백업 전략에 대한 이해도를 확인해 보세요.
수업 요약: 논리적 백업과 물리적 백업
이 수업에서는 PostgreSQL의 두 가지 기본 백업 전략을 살펴보았습니다.
- 논리적 백업은
pg_dump를 사용하여 데이터베이스를 SQL 문으로 내보냅니다. 이식성이 높고 사람이 읽을 수 있으며 부분 복원을 지원하지만, 매우 큰 데이터베이스에서는 느릴 수 있습니다. - 물리적 백업은
pg_basebackup을 사용하여 원시 데이터 파일을 복사합니다. WAL 보관과 함께 사용하면 빠른 복원과 특정 시점 복구가 가능하지만, 버전에 종속되며 항상 전체 클러스터를 복원합니다. - 운영 시스템에서는 일반적으로 두 전략을 함께 사용합니다. 빠르고 세밀한 복구를 위해 WAL을 보관하는 물리적 기본 백업을 사용하고, 이식성을 위해 주기적으로 논리적 백업을 내보냅니다.
- 항상 복원을 검증해야 합니다. 검증하지 않은 백업은 실제 재해 상황에서 신뢰할 수 없습니다.
이 두 접근 방식을 이해하는 것은 모든 PostgreSQL 배포 환경에 견고한 재해 복구 계획을 설계하는 데 필수적입니다.
자주 묻는 질문
“논리적 백업과 물리적 백업” 강의는 무료인가요?
네 — “논리적 백업과 물리적 백업” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“논리적 백업과 물리적 백업”에서 뭘 배우나요?
pg_dump와 기본 백업을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“논리적 백업과 물리적 백업” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.