본문 바로가기
컴퓨터 활용(한글, 오피스 등)/기타

postgresql 설치 원복 백업, lc_collate=ko_KR.utf8 설정 문제

by 3604 2025. 11. 8.
728x90
postgresql에서 lc_collate=ko_KR.utf8로 설정한 후 연결이 안됨. 해결방법은?
 
 
 
로케일 설정 오류 해결
 

PostgreSQL에서 lc_collate=ko_KR.utf8 설정 후 연결 불가 문제는 주로 운영 체제에 해당 로케일이 설치되지 않았거나, 로케일 이름이 정확하지 않거나, 이미 생성된 DB의 로케일을 잘못 변경하려고 시도하는 경우 발생합니다.

원인 분석

  1. OS에 로케일 미설치: 리눅스 시스템에 ko_KR.utf8 로케일이 생성되지 않음
  2. 로케일 이름 불일치: ko_KR.utf8 vs ko_KR.UTF-8 (대소문자 및 하이픈 차이)
  3. 잘못된 변경 시도: 이미 생성된 데이터베이스의 lc_collate는 직접 변경할 수 없음
  4. 템플릿 DB 충돌: template1에 다른 로케일이 설정되어 있을 경우

해결 방법

1. 운영 체제에 로케일 설치 확인 및 생성

 
# 설치된 로케일 목록 확인
locale -a | grep ko

# ko_KR.utf8이 없을 경우 생성 (Ubuntu/Debian)
sudo locale-gen ko_KR.UTF-8
sudo update-locale

# CentOS/RHEL
sudo localedef -i ko_KR -f UTF-8 ko_KR.UTF-8

2. PostgreSQL에서 새 데이터베이스 생성

기존 DB 로케일은 변경 불가능하므로 새 데이터베이스를 생성해야 합니다:
 
-- 기존 DB 확인
SELECT datname, datcollate, datctype FROM pg_database;

-- template0을 사용해 신규 DB 생성 (가장 안전)
CREATE DATABASE new_db
    WITH 
    LC_COLLATE = 'ko_KR.utf8'
    LC_CTYPE = 'ko_KR.utf8'
    TEMPLATE = template0
    ENCODING = 'UTF8';
⚠️ 주의: template1 대신 template0을 사용해야 로케일 충돌을 방지할 수 있습니다.

3. 로케일 이름 정확히 사용

PostgreSQL에서 인식하는 정확한 이름을 확인하세요:
 
-- 지원하는 로케일 목록 확인
SELECT * FROM pg_collation WHERE collname LIKE 'ko%';
일반적으로 다음 중 하나가 정답입니다:
  • ko_KR.utf8
  • ko_KR.UTF-8

4. 이미 생성된 DB의 로케일을 변경해야 한다면

로케일은 변경 불가능하므로 덤프/복구 방식으로 마이그레이션:
 
# 기존 DB 백업
pg_dump old_db > backup.sql

# 신규 DB 생성 (위 2번 방법)
createdb -T template0 new_db --lc-collate=ko_KR.utf8 --lc-ctype=ko_KR.utf8

# 데이터 복원
psql new_db < backup.sql

요약 체크리스트

  • [ ] locale -a로 OS에 로케일 존재 확인
  • [ ] 없으면 locale-gen 또는 localedef로 생성
  • [ ] pg_collation 테이블로 PostgreSQL에서 인식하는 이름 확인
  • [ ] CREATE DATABASE 시 TEMPLATE = template0 필수 지정
  • [ ] 기존 DB는 변경 불가 → 새 DB 생성 후 마이그레이션
이 방법으로 해결되지 않으면 정확한 오류 메시지와 PostgreSQL 버전, OS 환경을 알려주시면 더 정확한 답변 드리겠습니다.
 
 
 
 
 
postgres 16과 widnows10(vdi) 환경임
 
 
 
postgresql 16 lc_collate=ko_KR.utf8 연결 오류
 
 
한국어 로케일 DB 생성 확인
 
 
 
 
 
검색 결과를 분석한 결과, PostgreSQL 16과 Windows 10 VDI 환경에서 lc_collate=ko_KR.utf8 설정 후 연결이 안 되는 문제는 Windows의 로케일 시스템이 리눅스와 완전히 다르기 때문입니다. Windows는 ko_KR.utf8과 같은 POSIX 스타일 로케일 이름을 사용하지 않습니다.

핵심 원인

Windows 10은 POSIX 로케일 이름(ko_KR.utf8)을 지원하지 않습니다. 대신 Windows 고유의 로케일 이름 형식(예: Korean_Korea.65001)을 사용해야 합니다. VDI 환경에서는 이러한 로케일 데이터가 제대로 설치되지 않은 경우도 많습니다 .

즉시 해결 방법

1. 정확한 Windows 로케일 이름 확인

관리자 권한 PowerShell에서 실행:
 
# 시스템 로케일 확인
Get-WinSystemLocale

# 또는 PostgreSQL이 인식할 수 있는 이름 목록 확인
psql -U postgres -c "SELECT * FROM pg_collation WHERE collname ILIKE '%korea%';"
Windows 10에서 일반적으로 사용되는 한국어 로케일:
  • Korean_Korea.65001 (UTF-8, 권장)
  • Korean_Korea.949 (EUC-KR)
  • Korean_Korea (기본 시스템 로케일)

2. 새 데이터베이스 생성 (핵심)

기존 데이터베이스는 로케일 변경이 불가능하므로 , 반드시 새 DB를 생성해야 합니다. TEMPLATE = template0 필수 지정:
 
-- Windows에서 정확한 로케일 이름 사용
CREATE DATABASE korean_db
    WITH 
    ENCODING = 'UTF8'
    LC_COLLATE = 'Korean_Korea.65001'
    LC_CTYPE = 'Korean_Korea.65001'
    TEMPLATE = template0;
⚠️ VDI 환경 특수성: Korean_Korea.65001을 인식하지 못하면 C나 POSIX로 테스트:
 
CREATE DATABASE test_db WITH LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE = template0;

3. VDI 환경에 맞는 추가 설정

제어판 → 지역 → 관리자 옵션 탭에서:
  • "Unicode UTF-8을 전 세계 언어 지원에 사용" 체크박스 활성화
  • 시스템 재부팅 필요
또는 PowerShell로 활성화:
powershell
 
# UTF-8 시스템 로케일 활성화 (Windows 10 버전 1803 이상)
Set-WinSystemLocale -SystemLocale ko-KR -ErrorAction Stop

만약 initdb 시점에 설정하려면

PostgreSQL 16을 새로 설치하는 경우, 설치 마법사 대신 명령줄로:
cmd
 
:: PostgreSQL bin 디렉토리에서 (관리자 권한)
initdb -D "C:\Program Files\PostgreSQL\16\data" --encoding=UTF8 --locale=Korean_Korea.65001
하지만 이미 설치된 상태라면 데이터베이스 클러스터 전체를 재생성해야 하므로, 2번 방법이 훨씬 실용적입니다.

요약 체크리스트

  • [ ] PowerShell로 Get-WinSystemLocale 실행하여 실제 Windows 로케일 이름 확인
  • [ ] pg_collation 테이블에서 PostgreSQL이 인식하는 한국어 로케일명 확인
  • [ ] 반드시 TEMPLATE = template0 지정하여 새 DB 생성
  • [ ] 로케일 이름으로 Korean_Korea.65001 사용 (UTF-8 지원)
  • [ ] VDI 이미지의 Windows 로케일 설정에서 UTF-8 옵션 활성화

오류 메시지가 있다면

정확한 진단을 위해 연결 시 발생하는 오류 메시지 전체를 공유해 주세요. 특히 다음 정보가 도움이 됩니다:
  • FATAL: database locale is incompatible with operating system 같은 메시지
  • PostgreSQL 로그 파일의 상세 오류 내용
이 방법으로도 해결되지 않으면, VDI 이미지에 한국어 언어 팩이 미설치된 경우가 있으므로 IT 관리자에게 Windows 로케일 패키지 설치를 요청해야 할 수 있습니다.
 
 
 
 
 
 
Reference

 

postgre pslq 오류 데이터베이스 로케일이 운영체제오 호환되지 않는 경우 postgre 원복하는 방법
 
 
 

PostgreSQL 로케일 호환성 오류 원복 방법

"데이터베이스 로케일이 운영체제와 호환되지 않는다"는 오류는 PostgreSQL 16과 Windows 10 VDI 환경에서 lc_collate=ko_KR.utf8 설정 후 연결이 안 될 때 발생하는 문제입니다. 아래는 단계별 원복 및 해결 방법입니다.

즉시 조치: PostgreSQL 서비스 시작 및 연결 가능 상태로 만들기

1. 명령줄로 PostgreSQL 강제 시작

관리자 권한 **명령 프롬프트(CMD)**에서:
cmd
 
:: PostgreSQL 서비스 수동 시작
net start postgresql-16

:: 만약 서비스가 시작되지 않으면, 로케일 오류 무시하고 단일 사용자 모드로 시작
"C:\Program Files\PostgreSQL\16\bin\postgres.exe" -D "C:\Program Files\PostgreSQL\16\data" --single

2. 연결 가능하도록 임시 로케일 변경

PostgreSQL이 인식할 수 있는 Windows 로케일로 변경해야 합니다. PowerShell에서:
powershell
 
# 현재 시스템 로케일 확인
Get-WinSystemLocale

# 로케일을 영어(미국)로 임시 변경 (PostgreSQL 기본값)
Set-WinSystemLocale -SystemLocale en-US

# 또는 UTF-8 지원 활성화 (Windows 10 버전 1803 이상)
Set-WinSystemLocale -SystemLocale ko-KR
재부팅 필수 - Windows 로케일 변경은 재부팅 후 적용됩니다.

근본 해결: 데이터베이스 재생성 없이 원복

3. template1 로케일 갱신 (PostgreSQL 15+)

PostgreSQL 15부터는 ALTER DATABASE REFRESH COLLATION VERSION 명령어로 메타데이터만 갱신할 수 있습니다.
 
# PostgreSQL bin 디렉토리에서
psql -U postgres

-- template1에 연결 허용
UPDATE pg_database SET datallowconn = true WHERE datname = 'template1';

-- 로케일 버전 갱신
ALTER DATABASE template1 REFRESH COLLATION VERSION;

-- template1 다시 보호
UPDATE pg_database SET datallowconn = false WHERE datname = 'template1';

-- postgres DB도 갱신
ALTER DATABASE postgres REFRESH COLLATION VERSION;
Windows 환경 제한: 이 명령어는 로케일 이름 자체가 유효할 때만 작동합니다. ko_KR.utf8은 Windows에서 유효하지 않으므로 실패할 수 있습니다.

4. 모든 데이터베이스 로케일 갱신

sql
 
-- 갱신 가능한 모든 DB에 대해 명령어 생성
SELECT 'ALTER DATABASE ' || datname || ' REFRESH COLLATION VERSION;'
FROM pg_database
WHERE datname NOT IN ('template0');

-- 생성된 명령어를 직접 실행

완전 원복: 백업 및 재생성

5. 기존 데이터 백업 (로케일 오류 무용)

만약 PostgreSQL에 접속이 완전히 불가능하다면, 데이터 파일 수준 백업을 먼저 수행하세요:
cmd
 
:: PostgreSQL 서비스 중지
net stop postgresql-16

:: 데이터 디렉토리 통째로 백업
xcopy /E /I "C:\Program Files\PostgreSQL\16\data" "D:\backup\postgres_data_backup_%date:~0,4%%date:~5,2%%date:~8,2%"

6. 로케일 재설정 및 데이터베이스 재생성

단계 A: Windows 로케일 재설정

제어판 → 지역 → 관리자 옵션 탭:
  • "Unicode UTF-8을 전 세계 언어 지원에 사용" 체크박스 활성화
  • 시스템 재부팅

단계 B: 새 데이터베이스 클러스터 생성

기존 데이터를 보존하면서 새로운 로케일로 클러스터를 생성합니다. 이 작업은 기존 데이터가 모두 삭제되므로 주의하세요.
cmd
 
:: PostgreSQL bin 디렉토리에서 실행
"C:\Program Files\PostgreSQL\16\bin\initdb.exe" -D "C:\Program Files\PostgreSQL\16\data_new" --encoding=UTF8 --locale=Korean_Korea.65001

:: 서비스 중지
net stop postgresql-16

:: 기존 데이터 디렉토리 이름 변경
rename "C:\Program Files\PostgreSQL\16\data" "data_old"
rename "C:\Program Files\PostgreSQL\16\data_new" "data"

:: 서비스 시작
net start postgresql-16

단계 C: 데이터 복원

cmd
 
:: 기존 데이터베이스 백업 (이제 연결 가능해야 함)
pg_dumpall -U postgres > D:\backup\all_databases.sql

:: 새 클러스터에 복원
psql -U postgres -f D:\backup\all_databases.sql
주의: pg_dumpall은 전역 객체(사용자, 롤 등)도 함께 백업합니다. Windows 환경에서는 백업 파일의 인코딩이 UTF-8인지 확인하세요.

VDI 환경 특수 대응

7. VDI 이미지 제약 극복

VDI 환경에서는 언어 팩 설치가 제한된 경우가 많습니다. 이럴 때는:
옵션 A: 가장 안전한 로케일 사용
sql
 
-- Windows에서 항상 지원되는 'C' 로케일로 생성
CREATE DATABASE safe_db
    WITH 
    ENCODING = 'UTF8'
    LC_COLLATE = 'C'
    LC_CTYPE = 'C'
    TEMPLATE = template0;
옵션 B: PostgreSQL 재설치
  • PostgreSQL 16 제어판 → 프로그램 제거로 완전 제거
  • 설치 프로그램 실행 시 "로케일 설정" 단계에서 "Default locale" 선택
  • "C" 또는 "English_United States.1252" 사용

최종 확인 및 검증

sql
 
-- 정상 연결 후 로케일 설정 확인
SELECT datname, datcollate, datctype FROM pg_database;

-- Windows에서 지원하는 로케일 목록 확인
SELECT pg_collation.collname, pg_collation.collcollate 
FROM pg_collation 
WHERE collname ILIKE '%korea%'
ORDER BY collname;

요약: 원복 체크리스트

  • [ ] 즉시: PostgreSQL 서비스 수동 시작 또는 단일 사용자 모드 시도
  • [ ] Windows 로케일: UTF-8 지원 활성화 및 재부팅
  • [ ] template1 수정: datallowconn = true로 변경 후 REFRESH COLLATION VERSION
  • [ ] 백업: pg_dumpall 또는 데이터 디렉토리 복사로 백업
  • [ ] 재생성: initdb로 새 클러스터 생성 (로케일: Korean_Korea.65001)
  • [ ] 복원: 백업 파일을 새 클러스터에 복원
  • [ ] 검증: 모든 DB의 로케일이 올바르게 설정되었는지 확인
이 방법으로도 해결되지 않으면, 정확한 오류 메시지PostgreSQL 로그 파일 내용을 공유해 주시면 더 정확한 진단이 가능합니다.
 
 
 
 
 
 
Reference
postgresql 에서 LC_COLLATE이 ko_KR.utf8로 초기화 되어 있어 호환 문제로 접속이 안되는 경우 postgresql LC_COLLATE를 설치 시 초기화 상태로 변경하는 방법은?
 
 
 
로케일 재설정 방법
 

PostgreSQL 로케일 원복: 설치 시 초기화 상태로 되돌리기

결론부터 말씀드리면, 이미 생성된 데이터베이스 클러스터의 LC_COLLATE는 변경이 불가능합니다. "설치 시 초기화 상태"로 돌리려면 백업 → 클러스터 재생성 → 복원 과정이 필수입니다.

원인: 왜 접속이 안 되나요?

PostgreSQL 16 + Windows 10 환경에서 LC_COLLATE=ko_KR.utf8은 잘못된 로케일 이름입니다. Windows는 POSIX 스타일(ko_KR.utf8)이 아닌 Windows 고유 형식을 사용해야 합니다.
Windows에서 유효한 한국어 로케일:
  • Korean_Korea.65001 (UTF-8, 권장)
  • Korean_Korea.949 (EUC-KR)
  • C (가장 안전하고 호환성 높음)
ko_KR.utf8로 초기화된 클러스터는 운영 체제와 로케일 호환성 불일치로 PostgreSQL 서비스가 시작되지 않거나 연결이 거부됩니다.

해결 방법: 단계별 원복 절차

1단계: 기존 데이터 백업 (가장 중요!)

옵션 A: pg_dumpall 사용 (서비스 실행 가능 시)

관리자 권한 명령 프롬프트에서:
cmd
 
:: PostgreSQL bin 디렉토리로 이동
cd "C:\Program Files\PostgreSQL\16\bin"

:: 모든 데이터베이스 백업 (UTF-8 인코딩 명시)
pg_dumpall -U postgres -f "D:\backup\postgresql_full_backup.sql" --encoding=UTF8

옵션 B: 데이터 디렉토리 복사 (서비스 실행 불가 시)

cmd
 
:: PostgreSQL 서비스 중지
net stop postgresql-16

:: 데이터 디렉토리 통째로 백업
xcopy /E /V /I "C:\Program Files\PostgreSQL\16\data" "D:\backup\postgres_data_old"

2단계: PostgreSQL 클러스터 재생성

2-A. 기존 클러스터 삭제

cmd
 
:: PostgreSQL 서비스 중지
net stop postgresql-16

:: 데이터 디렉토리 이름 변경 (삭제 대신 안전하게 보관)
rename "C:\Program Files\PostgreSQL\16\data" "data_kokr_utf8_error"

2-B. 새 클러스터 초기화 (올바른 로케일)

관리자 권한 명령 프롬프트에서 initdb 실행:
cmd
 
:: PostgreSQL bin 디렉토리에서
cd "C:\Program Files\PostgreSQL\16\bin"

:: 올바른 Windows 로케일로 새 클러스터 생성
initdb -D "C:\Program Files\PostgreSQL\16\data" --encoding=UTF8 --locale=C --lc-ctype=C --lc-collate=C
중요: --locale=C는 가장 안전하고 호환성이 높은 설정입니다. Korean_Korea.65001을 사용하고 싶다면, 먼저 locale -a 명령어로 시스템에 해당 로케일이 설치되어 있는지 확인해야 합니다.

3단계: 서비스 시작 및 검증

cmd
 
:: PostgreSQL 서비스 시작
net start postgresql-16

:: 로케일 설정 확인
psql -U postgres -c "SELECT datname, datcollate, datctype FROM pg_database;"
기대 결과:
 
  datname  | datcollate | datctype
-----------+------------+----------
 postgres  | C          | C
 template0 | C          | C
 template1 | C          | C

4단계: 데이터 복원

cmd
 
:: 백업 파일로 데이터 복원
psql -U postgres -f "D:\backup\postgresql_full_backup.sql"

:: 또는 특정 DB만 복원
createdb -U postgres mydb
psql -U postgres -d mydb -f "D:\backup\mydb_backup.sql"

VDI 환경 특수 대응

VDI 환경에서는 Windows 로케일 패키지 설치가 제한될 수 있습니다. 이 경우:

옵션: 'C' 로케일 강제 사용

cmd
 
:: initdb 시 C 로케일로 생성 (가장 안전)
initdb -D "C:\Program Files\PostgreSQL\16\data" --encoding=UTF8 --locale=C

:: 모든 새 데이터베이스도 C 로케일로 생성
CREATE DATABASE new_db WITH LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0;
장점: 운영 체제 로케일 의존성이 완전히 제거됩니다. 단점: 한국어 특정 정렬(ㄱ, ㄴ, ㄷ 순)이 작동하지 않습니다.

설치 프로그램을 통한 원복 방법

PostgreSQL 설치 프로그램을 재실행하여 설정 초기화도 가능합니다:
  1. 제어판 → 프로그램 제거에서 PostgreSQL 16 제거
  2. 데이터 디렉토리는 삭제하지 않도록 유의 (백업 완료 확인)
  3. PostgreSQL 16 설치 프로그램 재실행
  4. "Locale" 설정 단계에서:
    • "Default locale" 선택
    • 또는 "C" 선택
  5. 설치 완료 후 4단계(데이터 복원) 실행

긴급 복구: 단일 사용자 모드

서비스가 전혀 시작되지 않을 때 단일 사용자 모드로 접속:
cmd
 
:: PostgreSQL 바이너리 직접 실행
"C:\Program Files\PostgreSQL\16\bin\postgres.exe" -D "C:\Program Files\PostgreSQL\16\data" --single -P

:: 안전 모드로 시작 (로케일 검사 무시)
"C:\Program Files\PostgreSQL\16\bin\postgres.exe" -D "C:\Program Files\PostgreSQL\16\data" --single -P -c lc_messages=C
단일 사용자 모드에서 pg_dumpall 실행하여 백업 가능합니다.

체크리스트: 원복 완료 확인

  • [ ] pg_dumpall로 완전 백업 완료
  • [ ] 기존 data 디렉토리 이름 변경 (data_old 등)
  • [ ] initdb --locale=C로 새 클러스터 생성
  • [ ] net start postgresql-16로 서비스 정상 시작
  • [ ] psql로 연결 성공
  • [ ] SELECT datcollate FROM pg_database; 결과가 C로 표시
  • [ ] 백업 파일로 데이터 복원 완료

결론

"설치 시 초기화 상태"로 돌리는 유일한 방법은 클러스터 재생성입니다. ko_KR.utf8은 Windows에서 잘못된 설정이므로 데이터 백업 → initdb 재실행 → 데이터 복원 과정을 반드시 거쳐야 합니다. VDI 환경에서는 항상 C 로케일을 사용하는 것이 가장 안전합니다.
 
 
 
 
 
 
 
 
 
 
 
COLLATE 불가 백업 재생
 
 
 

PostgreSQL 10 로케일 원복: 설치 초기화 상태로 되돌리기

PostgreSQL 10에서 LC_COLLATE=ko_KR.utf8로 초기화되어 접속이 안 되는 경우, 설치 시 초기 상태로 복원하는 유일한 방법은 클러스터 재생성입니다. PostgreSQL 10 역시 한 번 생성된 DB의 로케일은 변경할 수 없습니다.

핵심 원인: PostgreSQL 10 + Windows 10 불일치

PostgreSQL 10에서 ko_KR.utf8은 잘못된 로케일 이름입니다. Windows는 POSIX 스타일(ko_KR.utf8)이 아닌 Windows 고유 형식을 사용해야 합니다. PostgreSQL 10도 동일한 제약이 적용됩니다.

원복 절차: 백업 → 재생성 → 복원

1단계: 기존 데이터 백업 (접속 불가 시 우회)

옵션 A: pg_dumpall 사용 (단일 사용자 모드)

서비스가 시작되지 않을 때, 단일 사용자 모드로 백업:
cmd
 
:: PostgreSQL bin 디렉토리에서
cd "C:\Program Files\PostgreSQL\10\bin"

:: PostgreSQL 10 단일 사용자 모드로 실행
postgres.exe -D "C:\Program Files\PostgreSQL\10\data" --single -P postgres > D:\backup\pg10_backup.sql

옵션 B: 데이터 디렉토리 복사 (서비스 완전 중단 시)

cmd
 
:: PostgreSQL 서비스 중지
net stop postgresql-10

:: 데이터 디렉토리 통째로 백업
xcopy /E /V /I "C:\Program Files\PostgreSQL\10\data" "D:\backup\pg10_data_old_%date:~0,4%%date:~5,2%%date:~8,2%"

2단계: PostgreSQL 10 클러스터 재생성

2-A. 기존 클러스터 제거

cmd
 
:: PostgreSQL 10 서비스 중지
net stop postgresql-10

:: 데이터 디렉토리 이름 변경 (삭제보다 안전)
rename "C:\Program Files\PostgreSQL\10\data" "data_kokr_utf8_error"

2-B. 새 클러스터 초기화 (PostgreSQL 10용)

관리자 권한 명령 프롬프트에서 initdb 실행:
cmd
 
:: PostgreSQL 10 bin 디렉토리에서
cd "C:\Program Files\PostgreSQL\10\bin"

:: PostgreSQL 10에서 권장되는 'C' 로케일로 새 클러스터 생성
initdb.exe -D "C:\Program Files\PostgreSQL\10\data" --encoding=UTF8 --locale=C --lc-collate=C --lc-ctype=C
⚠️ PostgreSQL 10 특이사항:
  • --locale=C는 모든 운영 체제에서 호환되는 가장 안전한 설정
  • Windows 10에서는 Korean_Korea.65001 사용 가능하지만, C가 더 안정적
  • PostgreSQL 10은 ICU 로케일 제공자를 지원하지 않으므로 libc만 사용 가능

3단계: PostgreSQL 10 서비스 시작 및 검증

cmd
 
:: PostgreSQL 10 서비스 시작
net start postgresql-10

:: 로케일 설정 확인 (PostgreSQL 10용 쿼리)
psql -U postgres -c "SELECT datname, datcollate, datctype FROM pg_database;"

:: PostgreSQL 10 버전 확인
psql -U postgres -c "SELECT version();"
기대 결과:
 
  datname  | datcollate | datctype
-----------+------------+----------
 postgres  | C          | C
 template0 | C          | C
 template1 | C          | C

4단계: PostgreSQL 10 데이터 복원

전체 데이터베이스 복원

cmd
 
:: 백업 파일로 모든 데이터 복원 (인코딩 문제 방지)
psql -U postgres -f "D:\backup\pg10_backup.sql"

특정 데이터베이스만 복원

cmd
 
:: DB 생성 (template0 사용 필수)
createdb -U postgres --template=template0 --lc-collate=C --lc-ctype=C mydb

:: 데이터 복원
psql -U postgres -d mydb -f "D:\backup\mydb_backup.sql"
⚠️ PostgreSQL 10 특이사항:
  • pg_dumpall 시 --encoding=UTF8 명시 필수
  • 백업 파일이 2GB 이상이면 split 명령어로 분할 필요

PostgreSQL 10 VDI 환경 특수 대응

VDI 환경에서는 Windows 로케일 패키지가 제한될 수 있습니다. PostgreSQL 10의 경우:

옵션 A: 'C' 로케일 강제 사용 (권장)

sql
 
-- PostgreSQL 10에서 가장 안전한 방법
CREATE DATABASE vdi_db WITH LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0;

옵션 B: SQL_ASCII 문자셋 사용 (PostgreSQL 10 한정)

PostgreSQL 10에서는 SQL_ASCII도 고려할 수 있지만, UTF-8이 권장됩니다:
cmd
 
initdb.exe -D "C:\Program Files\PostgreSQL\10\data" --encoding=SQL_ASCII --locale=C
단점: 현대적 애플리케이션에서는 문자 손상 위험이 있습니다.

PostgreSQL 10에서 template0 사용 필수 이유

PostgreSQL 10은 template1에 로케일 설정이 미리 저장되어 있습니다. LC_COLLATE를 변경하려면 반드시 template0 사용해야 합니다:
sql
 
-- PostgreSQL 10에서 올바른 DB 생성
CREATE DATABASE new_db 
    TEMPLATE template0  -- 필수
    LC_COLLATE = 'C' 
    LC_CTYPE = 'C'
    ENCODING = 'UTF8';

설치 프로그램을 통한 PostgreSQL 10 원복

  1. 제어판 → 프로그램 제거에서 PostgreSQL 10 제거
  2. 데이터 디렉토리는 보존 (백업 확인)
  3. PostgreSQL 10 설치 프로그램 재실행
  4. "Locale" 설정 단계에서:
    • "Default locale" 또는 "C" 선택
  5. 설치 후 psql로 연결 확인
  6. 백업 파일로 데이터 복원

긴급 복구: PostgreSQL 10 단일 사용자 모드

서비스가 전혀 시작되지 않을 때:
cmd
 
:: PostgreSQL 10 단일 사용자 모드 (로케일 검사 무시)
"C:\Program Files\PostgreSQL\10\bin\postgres.exe" -D "C:\Program Files\PostgreSQL\10\data" --single -P

:: 백업 실행
postgres=# \! pg_dumpall -U postgres > D:\backup\emergency_backup.sql

체크리스트: PostgreSQL 10 원복 완료

  • [ ] pg_dumpall 또는 디렉토리 복사로 완전 백업 완료
  • [ ] PostgreSQL 10 서비스 중지 및 data 디렉토리 이름 변경
  • [ ] initdb --locale=C --lc-collate=C --lc-ctype=C로 새 클러스터 생성
  • [ ] net start postgresql-10으로 서비스 정상 시작
  • [ ] psql로 연결 성공 및 SELECT datcollate FROM pg_database; 결과가 C
  • [ ] 백업 파일로 데이터 정상 복원

결론

PostgreSQL 10에서 LC_COLLATE=ko_KR.utf8로 인한 접속 불가 문제는 클러스터 재생성만이 유일한 해결책입니다. PostgreSQL 10은 ICU 로케일을 지원하지 않고 libc만 사용하므로, Windows 10 VDI 환경에서는 C 로케일이 가장 안정적입니다. 반드시 백업 → initdb → 복원 절차를 따르세요.
 
 
 
 
 
postgresql에서 fatal role "postgres" does not exist 가 표시되고 있는데 postgres role 추가하는 방법은?
 
 
 
 

PostgreSQL에서 "fatal: role 'postgres' does not exist" 오류 해결

이 오류는 PostgreSQL 데이터베이스 클러스터에 postgres 역할(관리자 계정)이 존재하지 않을 때 발생합니다. 주로 잘못된 초기화, 실수로 역할을 삭제했을 때, 또는 PostgreSQL 10/16 설치 시 특정 옵션으로 인해 생성되지 않았을 때 발생합니다.

해결 방법: 단계별 복구 절차

방법 1: 단일 사용자 모드로 직접 생성 (가장 빠름)

PostgreSQL 서비스를 중지하고 단일 사용자 모드로 접속하여 postgres 역할을 생성합니다. PostgreSQL 10과 16 모두 동일한 방법으로 작동합니다.

단계 1: PostgreSQL 서비스 중지

cmd
Copy
:: Windows 명령 프롬프트 (관리자 권한)
net stop postgresql-16  # PostgreSQL 16
:: 또는
net stop postgresql-10  # PostgreSQL 10

단계 2: 단일 사용자 모드 실행

cmd
 
:: PostgreSQL bin 디렉토리로 이동
cd "C:\Program Files\PostgreSQL\16\bin"  # PostgreSQL 16
:: 또는 PostgreSQL 10
cd "C:\Program Files\PostgreSQL\10\bin"

:: 단일 사용자 모드로 PostgreSQL 시작 (--single 옵션)
postgres.exe -D "C:\Program Files\PostgreSQL\16\data" --single -P

:: 또는 
postgres.exe --single -D "C:\Program Files\PostgreSQL\16\data" 데이터베이스명(예시:postgres)
(예시) postgres.exe --single -D "C:\Program Files\PostgreSQL\16\data" postgres

단계 3: SQL 명령 실행

단일 사용자 모드 프롬프트에서 아래 SQL을 입력:
sql
 
CREATE USER postgres WITH SUPERUSER LOGIN CREATEDB CREATEROLE;
💡 참고: PostgreSQL 10 이상에서 CREATE USER는 LOGIN 권한이 포함된 CREATE ROLE의 별칭입니다.

방법 2: pg_hba.conf 임시 수정 (Windows 권장)

인증 설정을 임시로 **신뢰 모드(trust)**로 변경하여 접속 후 역할을 생성합니다.

단계 1: pg_hba.conf 편집

cmd
 
:: 메모장으로 파일 열기
notepad "C:\Program Files\PostgreSQL\16\data\pg_hba.conf"

단계 2: 인증 방법 변경

파일 맨 위에 아래 라인을 추가 또는 수정:
ini
 
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust

# IPv6 local connections:
host    all             all             ::1/128                 trust

단계 3: PostgreSQL 서비스 재시작

cmd
 
net start postgresql-16

단계 4: postgres 역할 생성

cmd
 
psql -U postgres -c "CREATE USER postgres WITH SUPERUSER LOGIN CREATEDB CREATEROLE;"

단계 5: pg_hba.conf 원상 복구

반드시 원래 인증 방법(md5, scram-sha-256 등)으로 되돌리고 서비스 재시작:
cmd
 
net stop postgresql-16
net start postgresql-16

방법 3: 재설치 (최후의 수단)

위 방법이 모두 실패하면 PostgreSQL을 제거 후 재설치합니다:
  1. 제어판 → 프로그램 제거에서 PostgreSQL 제거
  2. 데이터 디렉토리를 삭제하지 않도록 유의 (백업 확인)
  3. PostgreSQL 설치 프로그램 재실행
  4. 설치 과정에서 postgres 사용자 비밀번호 설정 단계 진행
  5. 설치 완료 후 접속 확인

검증: 생성된 postgres 역할 확인

cmd
 
:: 역할 목록 확인
psql -U postgres -c "\du"

:: 또는 SQL 쿼리
psql -U postgres -c "SELECT rolname, rolsuper, rolcanlogin FROM pg_roles WHERE rolname = 'postgres';"
정상 출력 예시:
Copy
   Role name   |                         Attributes
---------------+--------------------------------------------------------------
 postgres      | Superuser, Create role, Create DB, Replication, Bypass RLS

주의사항

  • 단일 사용자 모드는 Windows에서도 정상 작동합니다.
  • pg_hba.conf 수정 후 반드시 원상 복구하세요. 보안 위험이 있습니다.
  • PostgreSQL 10과 16의 차이점: 서비스 이름(postgresql-10 vs postgresql-16)과 경로만 다릅니다.
  • VDI 환경에서는 관리자 권한으로 모든 작업을 실행해야 합니다.

결론

**가장 추천하는 방법은 단일 사용자 모드(방법 1)**입니다. 이 방법이 가장 빠르고 안전하게 postgres 역할을 복구할 수 있습니다.
728x90