2026년 09월 23일 | DBMS Error 가이드
이 글에서 다루는 내용
58030 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
58030 io error 는?
PostgreSQL 에러 코드 58030 (io error)은 데이터베이스가 디스크 또는 파일 시스템과의 입출력(I/O) 작업 중 예기치 않은 오류가 발생했을 때 반환되는 에러입니다. 이 에러는 PostgreSQL이 데이터 파일, WAL(Write-Ahead Log) 파일, 또는 임시 파일을 읽거나 쓰는 과정에서 운영체제 수준의 I/O 실패가 감지되면 발생합니다. 심각한 경우 데이터 손실이나 데이터베이스 크래시로 이어질 수 있어 즉각적인 조치가 필요한 위험한 에러입니다.
주요 발생 원인
- 디스크 공간 부족 (Disk Full)
PostgreSQL 데이터 디렉터리가 위치한 파티션의 디스크 공간이 가득 찼을 때 가장 빈번하게 발생합니다. 데이터 쓰기, WAL 파일 생성, 또는 VACUUM 작업 중 여유 공간이 없으면 I/O 에러가 즉시 발생하며, 이 경우 트랜잭션이 롤백되고 데이터베이스가 불안정한 상태에 빠질 수 있습니다. 특히 pg_wal 디렉터리가 별도 마운트 포인트에 있지 않으면 WAL 로그가 급격히 증가하여 전체 디스크를 잠식하는 경우가 많습니다.
- 하드웨어 결함 또는 스토리지 장애
HDD/SSD의 배드 섹터, RAID 컨트롤러 오류, SAN/NAS 네트워크 스토리지의 불안정한 연결 등 하드웨어 수준의 문제가 원인이 될 수 있습니다. 운영체제 커널이 디스크 읽기/쓰기 요청에 실패 응답을 반환하면, PostgreSQL은 이를 58030 에러로 상위 레이어에 전달합니다. 이 경우 /var/log/syslog 또는 /var/log/messages에 I/O error, sector read error, medium error 같은 커널 메시지가 함께 기록되는 것이 일반적입니다.
- 파일 시스템 권한 문제 또는 파일 손상
PostgreSQL 프로세스(보통 postgres 유저)가 데이터 파일에 대한 읽기/쓰기 권한을 잃거나, 파일 시스템이 read-only 모드로 전환된 경우에도 이 에러가 발생합니다. 또한 비정상적인 서버 종료(강제 재부팅, 전원 차단 등) 이후 파일 시스템이 일관성을 잃어 fsck가 필요한 상태가 되면, 일부 파일에 대한 접근이 실패하여 58030 에러로 나타납니다.
해결 방법
원인 1: 디스크 공간 부족 해결
먼저 현재 디스크 사용량과 PostgreSQL 데이터 크기를 확인합니다.
-- 데이터베이스별 크기 확인
SELECT
datname AS database_name,
pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
-- 테이블별 크기 확인 (bloat가 심한 테이블 식별)
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total_size,
pg_size_pretty(pg_relation_size(schemaname || '.' || tablename)) AS table_size,
pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)
- pg_relation_size(schemaname || '.' || tablename)) AS index_size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC
LIMIT 20;
-- WAL 파일 크기 확인
SELECT pg_size_pretty(sum(size)) AS wal_size
FROM pg_ls_waldir();
불필요한 데이터를 정리하고 VACUUM을 실행합니다.
-- 테이블 bloat 제거 (공간 회수)
VACUUM FULL ANALYZE large_table_name;
-- 오래된 파티션 테이블 삭제 예시
DROP TABLE IF EXISTS logs_2022_01;
-- 불필요한 인덱스 제거
DROP INDEX CONCURRENTLY idx_old_unused_index;
-- autovacuum 설정 확인
SHOW autovacuum;
SHOW autovacuum_vacuum_scale_factor;
원인 2: 하드웨어 결함 진단 및 해결
PostgreSQL 로그와 시스템 로그를 동시에 확인합니다.
-- PostgreSQL 로그에서 io error 관련 기록 확인
-- (pg_log 또는 log_directory 설정 위치에서 직접 확인)
-- 현재 백그라운드 프로세스 및 대기 이벤트 확인
SELECT
pid,
usename,
application_name,
wait_event_type,
wait_event,
state,
query
FROM pg_stat_activity
WHERE wait_event_type = 'IO'
ORDER BY pid;
-- 체크포인트 및 bgwriter 통계로 I/O 부하 확인
SELECT
checkpoints_timed,
checkpoints_req,
checkpoint_write_time,
checkpoint_sync_time,
buffers_checkpoint,
buffers_clean,
buffers_backend,
buffers_alloc
FROM pg_stat_bgwriter;
하드웨어 문제가 확인된 경우, 즉시 백업 후 복구 절차를 진행합니다.
-- 데이터베이스 논리 백업 (pg_dump 사용 전 연결 가능 여부 확인)
-- 아래는 psql 내에서 실행 가능한 백업 상태 점검 쿼리
-- 현재 WAL 위치 확인 (복구 기준점 설정용)
SELECT pg_current_wal_lsn(), pg_walfile_name(pg_current_wal_lsn());
-- 복제본(Standby) 상태 확인
SELECT
client_addr,
state,
sent_lsn,
write_lsn,
flush_lsn,
replay_lsn,
sync_state
FROM pg_stat_replication;
원인 3: 파일 시스템 권한 및 손상 해결
-- PostgreSQL 데이터 디렉터리 경로 확인
SHOW data_directory;
-- 임시 파일 디렉터리 확인
SHOW temp_tablespaces;
-- 테이블스페이스 목록 및 경로 확인
SELECT
spcname AS tablespace_name,
pg_tablespace_location(oid) AS location,
pg_size_pretty(pg_tablespace_size(spcname)) AS size
FROM pg_tablespace;
파일 시스템 수준에서는 아래 OS 명령어를 통해 점검합니다 (psql 외부에서 실행):
-- 파일 시스템 마운트 상태 확인 후 PostgreSQL 재시작 예시
-- OS 레벨: mount | grep /var/lib/postgresql
-- OS 레벨: df -h /var/lib/postgresql
-- 파일 권한 복구 후 클러스터 정합성 검사
-- pg_resetwal 은 최후 수단으로만 사용 (데이터 손실 위험)
-- 복구 후 클러스터 상태 확인
SELECT pg_is_in_recovery();
-- 인덱스 손상 여부 점검
SELECT schemaname, tablename, indexname
FROM pg_indexes
WHERE schemaname = 'public';
-- amcheck 확장 모듈로 인덱스 무결성 검사 (PostgreSQL 10+)
CREATE EXTENSION IF NOT EXISTS amcheck;
SELECT bt_index_check(index => 'idx_your_index_name'::regclass, heapalloc => true);
예방 방법
- 디스크 모니터링 자동화 및 알림 설정
PostgreSQL 데이터 디렉터리, pg_wal, pg_log 등 주요 경로의 디스크 사용률을 주기적으로 모니터링하는 시스템을 구축해야 합니다. Prometheus + pg_exporter 또는 Zabbix 같은 모니터링 도구를 사용하여 디스크 사용률 80% 이상 시 즉시 알림을 받도록 설정하고, postgresql.conf에서 log_temp_files와 log_checkpoints를 활성화하여 비정상적인 I/O 패턴을 사전에 감지하는 것이 Best Practice입니다.
“`sql
— 모니터링을 위한 주요 설정 확인
SHOW log_checkpoints;
SHOW log_temp_files;
SHOW checkpoint_completion_target;
SHOW max_wal_size;
“`
- 정기적인 백업 및 WAL 아카이빙 구성
archive_mode = on과 archive_command를 설정하여 WAL 파일을 외부 스토리지로 지속적으로 아카이빙하고, pg_basebackup을 이용한 정기 베이스 백업을 자동화해야 합니다. 또한 pg_wal 디렉터리를 별도의 고성능 스토리지 마운트 포인트에 위치시켜 WAL 급증으로 인한 디스크 풀 상황을 원천 차단하고, PITR(Point-In-Time Recovery) 복구 테스트를 분기별로 수행하여 실제 장애 상황에서의 복구 가능성을 검증해야 합니다.
“`sql
— WAL 아카이빙 설정 확인
SHOW archive_mode;
SHOW archive_command;
SHOW wal_level;
— 아카이빙 실패 여부 확인
SELECT archived_count, last_archived_wal,
last_archived_time, failed_count,
last_failed_wal, last_failed_time
FROM pg_stat_archiver;
“`
관련 에러
- 58000 (system_error): 운영체제 수준의 일반적인 시스템 콜 실패를 나타내며, 58030과 함께 발생하는 경우가 많습니다.
- 57P03 (cannot_connect_now): 디스크 풀로 인해 PostgreSQL이 시작 자체를 거부할 때 클라이언트가 수신하는 에러입니다.
- XX000 (internal_error): 파일 I/O 실패가 PostgreSQL 내부 코드까지 전파되었을 때 나타나는 에러로, 58030과 함께 스택 트레이스에서 자주 목격됩니다.
- 53100 (disk_full): 58030보다 더 구체적으로 디스크 풀 상황을 나타내는 에러 코드로, 동일한 원인에서 상황에 따라 다르게 보고될 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.