2026년 07월 27일 | DBMS Error 가이드
이 글에서 다루는 내용
HV00P 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
HV00P fdw no schemas 는?
PostgreSQL 에러 코드 HV00P (fdw_no_schemas)는 Foreign Data Wrapper(FDW)를 사용하는 환경에서 외부 서버로부터 스키마 정보를 가져오려 했으나 이용 가능한 스키마가 존재하지 않을 때 발생하는 에러입니다. 주로 IMPORT FOREIGN SCHEMA 명령 또는 FDW 관련 메타데이터 조회 시 외부 데이터 소스에서 반환되는 스키마 목록이 비어 있거나 접근 불가능한 상태일 때 트리거됩니다. 이 에러는 외부 DB 연결 자체는 성공했지만 실제 스키마 레벨의 객체를 탐색하는 단계에서 실패하는 경우로, 네트워크 문제보다는 권한 또는 구성 설정 문제인 경우가 대부분입니다.
주요 발생 원인
- 외부 서버의 스키마 접근 권한 부재 (가장 흔한 원인)
FDW를 통해 연결된 외부 PostgreSQL 또는 타 DB에서 매핑된 사용자 계정이 해당 스키마에 대한 USAGE 권한을 갖고 있지 않은 경우입니다. IMPORT FOREIGN SCHEMA 명령을 실행할 때 외부 서버의 사용자 매핑(USER MAPPING)에 설정된 계정이 충분한 권한 없이 구성되어 있으면, FDW 드라이버는 스키마 목록 자체를 반환받지 못해 이 에러를 발생시킵니다. 특히 보안 정책이 강화된 운영 환경에서 최소 권한 원칙(Principle of Least Privilege)을 적용하다 보면 실수로 스키마 접근 권한을 누락하는 경우가 빈번합니다.
- 존재하지 않거나 잘못 지정된 스키마 이름
IMPORT FOREIGN SCHEMA 명령에 지정한 스키마 이름이 외부 서버에 실제로 존재하지 않거나 오타가 있는 경우에도 이 에러가 발생할 수 있습니다. 외부 서버에서 스키마가 삭제되었거나, 대소문자를 혼용하여 스키마 이름을 잘못 입력한 경우 FDW 레이어는 해당 스키마를 찾지 못하고 “no schemas” 상태로 인식합니다. 특히 Oracle, MySQL 등 이기종 DB와 연동할 때는 스키마와 데이터베이스 개념이 혼용되는 경우가 있어 더욱 주의가 필요합니다.
- FDW 드라이버 자체의 스키마 지원 미흡 또는 버전 불일치
사용 중인 FDW 드라이버(예: postgres_fdw, mysql_fdw, oracle_fdw 등)의 버전이 외부 서버의 버전과 호환되지 않거나, 해당 FDW가 스키마 열거(schema enumeration) 기능을 제대로 구현하지 않은 경우에도 이 에러가 발생합니다. 일부 서드파티 FDW는 IMPORT FOREIGN SCHEMA를 완전히 지원하지 않아 스키마 목록 반환 시 빈 결과를 돌려주는데, 이를 PostgreSQL 코어가 HV00P 에러로 처리하게 됩니다. FDW 버전 업그레이드 후에도 캐시된 연결 정보로 인해 버전 불일치가 일시적으로 발생할 수 있습니다.
해결 방법
원인 1 해결: 외부 서버 스키마 권한 부여
먼저 현재 USER MAPPING 설정을 확인하고, 외부 서버에서 적절한 권한을 부여합니다.
-- 현재 USER MAPPING 확인
SELECT um.srvname, um.umuser::regrole, um.umoptions
FROM pg_user_mappings um;
-- 외부 서버(remote)에서 실행: 스키마 USAGE 권한 부여
-- (외부 서버 psql 세션에서 실행)
GRANT USAGE ON SCHEMA target_schema TO fdw_user;
GRANT SELECT ON ALL TABLES IN SCHEMA target_schema TO fdw_user;
-- 향후 생성될 테이블에도 권한 적용
ALTER DEFAULT PRIVILEGES IN SCHEMA target_schema
GRANT SELECT ON TABLES TO fdw_user;
-- 로컬에서 USER MAPPING 재설정 (필요 시)
DROP USER MAPPING IF EXISTS FOR current_user SERVER my_foreign_server;
CREATE USER MAPPING FOR current_user
SERVER my_foreign_server
OPTIONS (user 'fdw_user', password 'secure_password');
원인 2 해결: 스키마 이름 확인 및 수정
외부 서버에 실제 존재하는 스키마 목록을 먼저 확인한 후 명령을 재실행합니다.
-- 외부 서버에서 사용 가능한 스키마 목록 직접 확인 (postgres_fdw 사용 시)
-- 로컬에서 dblink를 활용하여 원격 스키마 조회
SELECT *
FROM dblink(
'host=remote_host port=5432 dbname=remote_db user=fdw_user password=secure_password',
'SELECT schema_name FROM information_schema.schemata'
) AS t(schema_name TEXT);
-- 올바른 스키마 이름으로 IMPORT FOREIGN SCHEMA 실행
IMPORT FOREIGN SCHEMA "correct_schema_name"
FROM SERVER my_foreign_server
INTO local_schema;
-- 와일드카드 방식으로 여러 스키마 임포트 (스키마 이름 불확실 시)
IMPORT FOREIGN SCHEMA "public"
LIMIT TO (table1, table2)
FROM SERVER my_foreign_server
INTO local_schema;
-- EXCEPT 구문으로 특정 테이블만 제외하고 임포트
IMPORT FOREIGN SCHEMA "public"
EXCEPT (internal_table, audit_log)
FROM SERVER my_foreign_server
INTO local_schema;
원인 3 해결: FDW 버전 및 설정 점검
-- 현재 설치된 FDW 익스텐션 버전 확인
SELECT extname, extversion
FROM pg_extension
WHERE extname LIKE '%fdw%';
-- FDW 서버 옵션 확인
SELECT srvname, srvtype, srvversion, srvoptions
FROM pg_foreign_server;
-- FDW 재생성 (버전 업그레이드 후)
ALTER EXTENSION postgres_fdw UPDATE;
-- 기존 FOREIGN SERVER 삭제 후 재생성
DROP SERVER IF EXISTS my_foreign_server CASCADE;
CREATE SERVER my_foreign_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (
host 'remote_host',
port '5432',
dbname 'remote_db',
fetch_size '1000',
use_remote_estimate 'true'
);
-- 연결 테스트
SELECT * FROM pg_foreign_server WHERE srvname = 'my_foreign_server';
예방 방법
- FDW 배포 전 권한 체크리스트 자동화
FDW 구성을 배포하기 전에 외부 서버의 스키마 접근 권한을 자동으로 검증하는 스크립트를 CI/CD 파이프라인에 포함시키는 것이 좋습니다. 아래와 같은 쿼리를 모니터링 자동화에 포함하면 권한 누락을 사전에 탐지할 수 있습니다.
“`sql
— FDW 관련 권한 현황 정기 점검 쿼리
SELECT
fs.srvname AS foreign_server,
um.umuser::regrole AS local_user,
um.umoptions AS connection_options,
fs.srvoptions AS server_options
FROM pg_foreign_server fs
JOIN pg_user_mappings um ON fs.oid = um.umserver
ORDER BY fs.srvname;
“`
- 스키마 존재 여부 사전 검증 프로시저 운영
IMPORT FOREIGN SCHEMA를 실행하기 전에 반드시 외부 스키마의 존재 여부를 검증하는 래퍼 함수를 만들어 사용하면 에러를 사전에 방지할 수 있습니다.
“`sql
— 안전한 FDW 스키마 임포트 래퍼 함수
CREATE OR REPLACE FUNCTION safe_import_foreign_schema(
p_remote_schema TEXT,
p_server_name TEXT,
p_local_schema TEXT
)
RETURNS BOOLEAN AS $$
DECLARE
v_schema_exists BOOLEAN := FALSE;
BEGIN
— 원격 스키마 존재 여부 확인 로직 (서버별 맞춤화 필요)
BEGIN
EXECUTE format(
‘IMPORT FOREIGN SCHEMA %I FROM SERVER %I INTO %I’,
p_remote_schema, p_server_name, p_local_schema
);
v_schema_exists := TRUE;
EXCEPTION
WHEN fdw_no_schemas THEN
RAISE WARNING ‘Schema “%” not found on server “%”. Check schema name and permissions.’,
p_remote_schema, p_server_name;
v_schema_exists := FALSE;
END;
RETURN v_schema_exists;
END;
$$ LANGUAGE plpgsql;
— 사용 예시
SELECT safe_import_foreign_schema(‘public’, ‘my_foreign_server’, ‘local_fdw_schema’);
“`
관련 에러
- HV000 (fdw_error): FDW 관련 일반 에러의 부모 클래스로, HV00P가 특정되지 않을 때 이 코드로 표시됩니다.
- HV00B (fdw_invalid_handle): FDW 연결 핸들이 유효하지 않을 때 발생하며, 외부 서버 연결 자체가 끊어진 경우에 나타납니다.
- HV00C (fdw_invalid_option_index): FDW 서버 옵션 인덱스가 잘못 설정되었을 때 발생하며,
CREATE SERVER또는ALTER SERVER시 옵션 오타와 관련됩니다. - HV00R (fdw_unable_to_create_reply): 외부 서버로부터 응답을 생성하지 못할 때 발생하며, HV00P와 유사하게 연결은 되었지만 데이터 반환에 실패한 경우입니다.
- HV009 (fdw_invalid_use_of_null_pointer): FDW 내부 처리 중 NULL 포인터 참조가 발생할 때 나타나며, 드라이버 버그 또는 버전 불일치 시 HV00P와 함께 나타날 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.