2026년 09월 16일 | DBMS Error 가이드
이 글에서 다루는 내용
42P12 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
42P12 invalid database definition 는?
PostgreSQL 에러 코드 42P12는 invalid_database_definition으로, 데이터베이스를 생성(CREATE DATABASE)하거나 변경(ALTER DATABASE)할 때 잘못된 옵션이나 정의가 사용된 경우 발생합니다. 주로 존재하지 않는 테이블스페이스를 지정하거나, 허용되지 않는 인코딩 조합, 또는 잘못된 구문이 사용될 때 트리거됩니다. 이 에러는 데이터베이스 레벨의 정의 오류이므로 테이블이나 스키마 레벨과는 다르게 처리해야 합니다.
주요 발생 원인
1. 존재하지 않는 테이블스페이스(Tablespace) 지정
가장 빈번하게 발생하는 원인입니다. CREATE DATABASE 또는 ALTER DATABASE 구문에서 TABLESPACE 옵션에 실제로 존재하지 않는 테이블스페이스 이름을 지정하면 PostgreSQL은 즉시 42P12 에러를 반환합니다. 운영 환경에서 스토리지 경로가 변경되거나 테이블스페이스 이름이 오타로 잘못 입력되는 경우 자주 발생합니다.
2. 잘못된 인코딩(Encoding) 또는 로케일(Locale) 조합
CREATE DATABASE 시 ENCODING, LC_COLLATE, LC_CTYPE 옵션 간의 조합이 맞지 않으면 이 에러가 발생할 수 있습니다. 예를 들어 운영체제에서 지원하지 않는 로케일을 지정하거나, 템플릿 데이터베이스와 호환되지 않는 인코딩을 설정하려 할 때 오류가 발생합니다. 특히 template1의 인코딩과 다른 인코딩으로 데이터베이스를 생성하려 할 때 주의해야 합니다.
3. 잘못된 연결 제한(Connection Limit) 또는 허용되지 않는 파라미터 값
CONNECTION LIMIT 값으로 음수(-1 제외)를 입력하거나, ALTER DATABASE에서 허용되지 않는 파라미터를 설정하려 할 때도 42P12가 발생할 수 있습니다. -1은 무제한을 의미하는 유효한 값이지만, 그 외의 음수 값은 허용되지 않으며 잘못된 데이터베이스 정의로 간주됩니다. SET 절에서 잘못된 GUC(Grand Unified Configuration) 파라미터를 지정하는 경우도 포함됩니다.
해결 방법
원인 1 해결: 테이블스페이스 확인 및 생성
먼저 현재 존재하는 테이블스페이스 목록을 확인합니다.
-- 현재 존재하는 테이블스페이스 전체 조회
SELECT spcname, pg_tablespace_location(oid) AS location
FROM pg_tablespace;
테이블스페이스가 없다면 먼저 생성한 후 데이터베이스를 만들어야 합니다.
-- 테이블스페이스 생성 (OS 레벨에서 디렉토리가 미리 존재해야 함)
-- 먼저 쉘에서: mkdir -p /data/pg_tablespace/myspace && chown postgres:postgres /data/pg_tablespace/myspace
CREATE TABLESPACE myspace LOCATION '/data/pg_tablespace/myspace';
-- 이후 데이터베이스 생성 시 테이블스페이스 지정
CREATE DATABASE mydb
OWNER = myuser
TABLESPACE = myspace
ENCODING = 'UTF8'
LC_COLLATE = 'ko_KR.UTF-8'
LC_CTYPE = 'ko_KR.UTF-8'
TEMPLATE = template0;
잘못 입력한 테이블스페이스 이름을 수정하는 경우:
-- 에러 발생 예시 (존재하지 않는 테이블스페이스)
-- CREATE DATABASE testdb TABLESPACE = nonexistent_space; -- 42P12 에러 발생
-- 올바른 방법: 존재 여부 확인 후 진행
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_tablespace WHERE spcname = 'myspace'
) THEN
RAISE EXCEPTION 'Tablespace myspace does not exist. Please create it first.';
END IF;
END;
$$;
CREATE DATABASE testdb TABLESPACE = myspace;
원인 2 해결: 인코딩 및 로케일 설정 교정
템플릿 데이터베이스와 인코딩이 충돌하는 경우 template0를 사용해야 합니다.
-- 잘못된 예 (template1과 인코딩이 다를 경우 에러 발생 가능)
-- CREATE DATABASE koreandb ENCODING 'UTF8' LC_COLLATE 'ko_KR.UTF-8';
-- 올바른 방법: template0 명시적으로 사용
CREATE DATABASE koreandb
ENCODING = 'UTF8'
LC_COLLATE = 'ko_KR.UTF-8'
LC_CTYPE = 'ko_KR.UTF-8'
TEMPLATE = template0;
-- OS에서 지원하는 로케일 확인 방법 (psql 외부 명령)
-- locale -a | grep ko
-- 현재 데이터베이스의 인코딩 및 로케일 확인
SELECT datname, pg_encoding_to_char(encoding) AS encoding,
datcollate, datctype
FROM pg_database
WHERE datname = current_database();
원인 3 해결: 연결 제한 및 파라미터 교정
-- 잘못된 연결 제한 값 예시
-- ALTER DATABASE mydb CONNECTION LIMIT -5; -- 42P12 에러 발생
-- 올바른 연결 제한 설정 (-1은 무제한, 양수는 최대 연결 수)
ALTER DATABASE mydb CONNECTION LIMIT 100;
-- 무제한으로 설정
ALTER DATABASE mydb CONNECTION LIMIT -1;
-- ALTER DATABASE로 GUC 파라미터 올바르게 설정
ALTER DATABASE mydb SET work_mem = '64MB';
ALTER DATABASE mydb SET maintenance_work_mem = '256MB';
ALTER DATABASE mydb SET log_min_duration_statement = 1000;
-- 잘못된 파라미터 확인 방법
SHOW ALL; -- 전체 GUC 파라미터 목록 출력
-- 데이터베이스별 설정 확인
SELECT datname, setconfig
FROM pg_db_role_setting drs
JOIN pg_database d ON d.oid = drs.setdatabase
WHERE datname = 'mydb';
예방 방법
1. 데이터베이스 생성 전 사전 검증 스크립트 운영
데이터베이스를 생성하기 전에 필수 요소(테이블스페이스, 로케일, 인코딩 등)가 모두 준비되어 있는지 검증하는 스크립트를 CI/CD 파이프라인 또는 운영 절차에 포함시키세요.
-- 사전 검증 스크립트 예시
DO $$
DECLARE
v_tablespace_name TEXT := 'myspace';
v_encoding TEXT := 'UTF8';
BEGIN
-- 테이블스페이스 존재 여부 확인
IF NOT EXISTS (
SELECT 1 FROM pg_tablespace WHERE spcname = v_tablespace_name
) THEN
RAISE EXCEPTION '[PREFLIGHT] Tablespace "%" not found. Aborting.', v_tablespace_name;
END IF;
-- pg_encoding_to_char로 유효한 인코딩인지 확인
IF pg_char_to_encoding(v_encoding) = -1 THEN
RAISE EXCEPTION '[PREFLIGHT] Encoding "%" is invalid.', v_encoding;
END IF;
RAISE NOTICE '[PREFLIGHT] All checks passed. Safe to proceed.';
END;
$$;
2. Infrastructure as Code(IaC)로 데이터베이스 정의 관리
데이터베이스 생성 구문을 직접 수동으로 실행하는 대신, Terraform(terraform-provider-postgresql), Ansible 또는 사내 표준 SQL 스크립트 파일로 관리하세요. 버전 관리 시스템(Git)에 모든 데이터베이스 정의 스크립트를 저장하고 코드 리뷰를 통해 오타나 잘못된 파라미터가 배포 전에 걸러지도록 하는 것이 Best Practice입니다.
관련 에러
42P01(undefined_table): 존재하지 않는 테이블을 참조할 때 발생하며, 42P12와 마찬가지로 객체 정의 관련 에러입니다.42710(duplicate_object): 이미 동일한 이름의 데이터베이스나 테이블스페이스가 존재할 때 발생합니다.CREATE DATABASE IF NOT EXISTS패턴을 사용하면 예방할 수 있습니다.42501(insufficient_privilege):CREATE DATABASE또는ALTER DATABASE권한이 없는 사용자가 실행할 때 발생하며, 사전 권한 확인이 필요합니다.53100(disk_full): 테이블스페이스 위치의 디스크가 가득 찬 경우로, 테이블스페이스 관련 작업 시 함께 점검해야 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.