PostgreSQL의 경우, MariaDB와는 다르게 데이터 복구를 위한 여러 가지 옵션이 있지만, 여전히 백업과 로그의 중요성이 매우 큽니다. PostgreSQL은 복구를 위한 강력한 기능을 제공하고 있으며, 여러 방법으로 삭제된 데이터를 복구할 수 있습니다.
PostgreSQL 데이터 복구 방안
1. WAL (Write-Ahead Logging) 사용
PostgreSQL은 **WAL(Write-Ahead Log)**을 사용하여 트랜잭션을 기록합니다. 이 기능을 통해 온라인 복구가 가능하며, 데이터베이스에서 수행된 모든 트랜잭션을 추적할 수 있습니다. WAL은 PostgreSQL의 강력한 복구 메커니즘으로, 데이터베이스의 완전한 복구와 장애 복구를 지원합니다.
1.1. WAL 로그를 이용한 PITR(Point In Time Recovery)
Point In Time Recovery(PITR)는 특정 시점으로 데이터베이스를 복구하는 방법입니다. 이 기능을 사용하면, 특정 시간에 발생한 문제를 해결하고 그 시점으로 복구할 수 있습니다.
- WAL 아카이브 설정: PostgreSQL에서 WAL을 아카이브하려면, postgresql.conf 파일에서 WAL 아카이브를 활성화해야 합니다.
archive_mode = on
archive_command = 'cp %p /path_to_archive/%f'
- WAL 로그 아카이브 사용: 데이터베이스가 백업된 후, 트랜잭션 로그(WAL 로그)가 아카이브됩니다. 이 로그를 사용하여 특정 시점으로 데이터베이스를 복구할 수 있습니다.
- PITR 복구:
- 데이터를 백업한 후, WAL 로그를 사용해 특정 시점으로 복구할 수 있습니다. 예를 들어, 데이터베이스에서 삭제된 데이터를 복구하려면 WAL 로그가 삭제 작업 이전 시점까지 포함되어 있어야 합니다.
- PITR 복구를 설정하려면 restore_command와 recovery_target_time 등을 설정하여 복구 대상 시점을 지정합니다. 예를 들어:
restore_command = 'cp /path_to_archive/%f %p'
recovery_target_time = '2025-07-10 10:00:00'
1.2. WAL 파일 덤프 사용
pg_waldump와 같은 도구를 사용하여 WAL 로그에서 발생한 쿼리를 추출하고, 이를 기반으로 복구를 시도할 수 있습니다. 이 방법은 삭제된 데이터를 복구하려는 시점 이후의 WAL 로그가 있어야 합니다.
pg_waldump /path_to_wal_log
1.3. pg_restore로 복구
백업이 있거나, WAL 로그 아카이브를 통해 복구를 시도할 수 있습니다. pg_restore 명령어를 사용하여 덤프된 데이터베이스를 복구할 수 있습니다.
pg_restore -U postgres -d mydb /path_to_backup/backup_file.dump
2. PostgreSQL 로그를 통한 복구
2.1. PostgreSQL의 Error Log / General Log
PostgreSQL의 General Query Log나 Error Log를 통해 실행된 쿼리를 확인하고, 삭제된 데이터를 추적할 수 있습니다. 일반적으로 PostgreSQL에서는 log_statement와 log_duration을 설정하여 로그에 쿼리 및 실행 시간을 기록할 수 있습니다.
- 로그 설정: postgresql.conf 파일에서 로그 설정을 조정할 수 있습니다.
log_statement = 'all' # 모든 쿼리 로그 기록
log_duration = on # 쿼리 실행 시간 기록
- 로그 확인: 로그 파일을 통해 삭제된 데이터를 찾을 수 있는 쿼리를 추적할 수 있습니다.
shared_preload_libraries = 'pg_stat_statements'
2.2. pg_stat_statements 사용
pg_stat_statements는 PostgreSQL에서 쿼리 실행 통계를 기록하는 뷰입니다. 특정 쿼리가 실행된 후 데이터베이스에서 어떤 변화를 일으켰는지 추적할 수 있습니다.
- pg_stat_statements 활성화:
shared_preload_libraries = 'pg_stat_statements'
- 쿼리 통계 확인:
SELECT * FROM pg_stat_statements WHERE query LIKE '%DELETE%';
2.3. 복구된 쿼리 적용
로그에서 삭제된 데이터를 복구할 수 있는 쿼리를 찾았다면, 해당 쿼리를 다시 실행하여 데이터 복구를 시도할 수 있습니다. 예를 들어, 삭제된 데이터를 INSERT INTO 형태로 복구할 수 있습니다.
3. 트리거와 외부 툴 사용
3.1. 트리거 기반 복구
PostgreSQL에서 트리거(Trigger)는 데이터의 변화를 추적하는 데 유용할 수 있습니다. 예를 들어, 데이터를 삭제할 때마다 삭제된 데이터를 별도의 테이블에 백업하는 트리거를 설정할 수 있습니다.
예시 트리거:
CREATE OR REPLACE FUNCTION backup_deleted_data() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO deleted_data_log (old_data)
VALUES (ROW(OLD.*));
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER track_deletions
BEFORE DELETE ON my_table
FOR EACH ROW EXECUTE FUNCTION backup_deleted_data();
위와 같이 트리거를 사용하면, 이후 데이터를 삭제하는 작업이 있을 때마다 삭제된 데이터가 deleted_data_log 테이블에 백업됩니다. 이 데이터를 이용해 복구할 수 있습니다.
3.2. 외부 복구 툴
PostgreSQL의 경우, 여러 외부 툴을 통해 데이터 복구를 시도할 수 있습니다. 예를 들어, pg_rewind를 사용하여 마스터와 리플리카 간에 데이터 동기화 및 복구를 할 수 있습니다.
4. PostgreSQL 데이터 복구 도구
일부 서드파티 도구나 서비스는 PostgreSQL 데이터를 복구할 수 있도록 지원합니다. 예를 들어, Stellar Data Recovery for PostgreSQL과 같은 도구는 삭제된 데이터를 복구하는 데 사용할 수 있습니다.
결론
PostgreSQL에서 데이터가 삭제된 경우에도, WAL 로그, PITR(Point-In-Time Recovery), 로그 파일 등을 활용하여 데이터를 복구할 수 있습니다. 중요한 점은 WAL 아카이브나 백업이 설정되어 있어야만 효과적인 복구가 가능하다는 점입니다.
'DataBase' 카테고리의 다른 글
MariaDB 데이터베이스가 삭제된 경우, 복구 (1) | 2025.07.15 |
---|---|
RoutingDatasource (동적 선택) 구현 예제 (0) | 2025.06.18 |
Row Lock vs Table Lock의 개념 비교 (0) | 2025.05.14 |
Toad for MySQL를 효율적으로 사용하는 꿀팁! (0) | 2025.03.24 |