
DB 생성 시기와 운영체제(glibc/ICU)·PostgreSQL 바이너리(업그레이드/컨테이너 이미지 변경 등)이 달라졌을 때 발생할 수 있는 각 상황에 대한 영향·진단·우선순위별 대응(명령·스크립트·무중단 옵션 포함)과 운영·보안 관점의 체크리스트 예시입니다.
어떤 변화가 위험을 만드는가?
- OS(glibc/locale/ICU) 업그레이드 또는 변경 — DB가 만들어진 시점의 libc/ICU와 실행 환경이 달라지면 collation(문자열 정렬 규칙) 버전 불일치 경고가 발생할 수 있으며, 문자열 인덱스의 정렬 순서가 달라져 인덱스 불일치/쿼리 결과 변화 가능성이 있습니다.
- PostgreSQL 바이너리 업그레이드(버전 변경) 또는 재빌드 — 빌드 시 사용된 libc/ICU와 운영체제의 차이로 경고가 나타날 수 있습니다.
- 컨테이너 이미지(베이스 OS) 변경 / 이미지 태그 교체 — 컨테이너 내부 glibc 버전이 바뀌면 동일한 현상 발생 가능.
- 백업/복원 또는 데이터베이스를 다른 OS로 이동(예: 복제 → 새 호스트) — 복원된 DB는 로컬 OS collation과 차이가 날 수 있음.
영향 범위 (무엇이 깨질 수 있나?)
ORDER BY,GROUP BY결과(정렬 순서) 변경 가능.LIKE/ILIKE/ 문자열 비교 결과 변화. (특히 로케일 민감 비교)- ⚠️ B-tree 기반 문자열 인덱스(문자열 컬럼의 유니크 포함) — 인덱스가 잘못 정렬되어 성능 문제나 부정확한 결과(인덱스 스캔 실패)가 발생할 수 있음.
- 복제/스탠바이 환경: 경고는 복제에도 전파될 수 있음. (동일한 문제를 여러 DB에서 관찰)
우선 진단(무엇을 먼저 확인해야 하나?) — 빠르게 실행 가능한 체크리스트
- 현재 OS의 glibc / ICU 버전 확인
Linux 예시ldd --version # 보통 glibc 버전이 첫 줄에 표시됩니다. getconf GNU_LIBC_VERSION rpm -q glibc # RHEL 계열 apt-cache policy libc6 # Debian 계열 (간접 확인) - PostgreSQL에서 경고 메시지 및 영향을 받는 collation/객체 확인
psql에서 (문제 되는 collation과 의존 객체 확인)이 쿼리는 “카탈로그에 기록된 collversion”과 “시스템이 제공하는 실제 버전”이 다른 collation과 그에 의존하는 객체 목록(인덱스/테이블/제약 등)을 보여줍니다).SELECT pg_describe_object(refclassid, refobjid, refobjsubid) AS "Collation", pg_describe_object(classid, objid, objsubid) AS "Object" FROM pg_depend d JOIN pg_collation c ON refclassid = 'pg_collation'::regclass AND refobjid = c.oid WHERE c.collversion <> pg_collation_actual_version(c.oid) ORDER BY 1, 2; - 현재 DB의 collversion 상태 전체 확인(간단)
SELECT oid, collname, collversion, pg_collation_actual_version(oid) as actual_version FROM pg_collation WHERE collversion IS DISTINCT FROM pg_collation_actual_version(oid); - 애플리케이션 영향 범위 파악
- 정렬순서/검색결과가 사업적으로 중요한 쿼리 목록(예: 페이징/정렬 UI, 유니크 제약 검증 쿼리 등)을 수집 → 테스트 케이스 준비.
대응 원칙(우선순위와 위험도 기준)
- 운영(프로덕션) + 문자열 인덱스/정렬 결과 중요: 즉시 조치 권장 (REFRESH + 인덱스 재생성).
- 개발/스테이징: 로그 경고가 거슬려도 우선순위는 낮음. 다만 업그레이드 테스트 환경에서 재현·검증 필요.
- 대규모 DB / 하드 리얼타임 시스템: 무중단 전략(인덱스별 CONCURRENTLY 재생성 혹은 pg_repack 등 외부도구) 적용 권장.
구체적 조치(명령·스크립트·무중단 옵션) — 실전 Playbook
A. 안전하고 표준적인 조치 (권장)
- 전체 백업
sudo -u postgres pg_dump -Fc -f all_databases_pre_reindex.dump --dbname=postgres - DB 메타데이터 갱신 (경고 제거용):이 명령은 카탈로그의 collversion을 현재 시스템 버전으로 갱신(“표시 업데이트”)합니다.
ALTER DATABASE mydb REFRESH COLLATION VERSION; - 인덱스 재생성 (권장 — 전체):주의: REINDEX는 대상 인덱스에 대해 잠금을 발생시킬 수 있으므로 트래픽 낮은 시간대 권장.
REINDEX DATABASE mydb;
B. 다운타임 최소화(무중단에 가깝게) — 실무 패턴
- PostgreSQL 12+에서 일부
REINDEX CONCURRENTLY사용 가능(버전/제약 확인 필요).제약: 모든 인덱스 유형/상황에서 지원되는 것은 아님. 문서 확인 필수.REINDEX INDEX CONCURRENTLY idx_name; - 안전한 수동 절차 (널리 쓰이는 패턴, 가장 호환성이 좋음)
- 각 인덱스에 대해
장점: 테이블 잠금 최소화. 단점: 인덱스 생성 동안 추가 디스크/I/O 사용.-- 1) 새 인덱스 생성(기존과 동일한 정의, 다른 이름), CONCURRENTLY 권장 CREATE INDEX CONCURRENTLY idx_table_col_new ON schema.table (col); -- 2) 새 인덱스 생성 완료 여부 확인 (pg_stat_user_indexes 사용 등) -- 3) 기존 인덱스 삭제 DROP INDEX CONCURRENTLY schema.idx_table_col; -- 4) 필요하면 새 인덱스 이름을 기존 이름으로 변경 (옵션) ALTER INDEX schema.idx_table_col_new RENAME TO idx_table_col;
- 각 인덱스에 대해
pg_repack사용 (온라인 인덱스 재빌드 도구) — 장단점
장점: 온라인으로 인덱스 정리/재구성 가능.
단점: 추가 도구 설치, 약간의 설정/점검 필요. (대규모에서 편리)
C. 전체 복원(가장 깨끗하지만 시간/절차 필요)
- 기존 DB 덤프
pg_dump -Fc -f mydb.dump mydb - 새 OS/새 컨테이너(원하는 glibc 버전)에서 PostgreSQL 설치 → 데이터베이스 생성 후 복원:장점: 카탈로그가 현재 OS 환경 기준으로 재작성되어 가장 확실함.
createdb mydb pg_restore -d mydb mydb.dump
무중단/안정화 스크립트 예시 (여러 DB 순회하여 REFRESH + 인덱스 재생성 권장 대상만 표시)
아래 스크립트는 REFRESH만 자동으로 수행하고, 영향을 받는 인덱스는 목록화하여 운영자가 검토하도록 합니다. (인덱스 재생성은 수동 승인 권장)
#!/usr/bin/env bash
# sudo -u postgres ./refresh_collations.sh
DBS=$(psql -At -c "SELECT datname FROM pg_database WHERE datallowconn AND datname NOT IN ('template0','template1','postgres');")
for db in $DBS; do
echo ">>> Processing $db"
sudo -u postgres psql -d "$db" -c "ALTER DATABASE \"$db\" REFRESH COLLATION VERSION;"
echo "---- Collations mismatched in $db (collversion vs actual):"
sudo -u postgres psql -d "$db" -c "SELECT collname, collversion, pg_collation_actual_version(oid) AS actual FROM pg_collation WHERE collversion IS DISTINCT FROM pg_collation_actual_version(oid);"
echo
done
참고: 위 스크립트는 ALTER DATABASE ... REFRESH만 수행합니다. 인덱스 재생성은 DB별, 인덱스별로 운영자가 좁혀서 실행 권장.
PostgreSQL 버전별/환경별 주의점 요약
- PostgreSQL 10+:
pg_collation_actual_version(oid)함수가 있어 시스템 collation 실제 버전 비교 가능. - REINDEX CONCURRENTLY: PostgreSQL 버전과 인덱스 유형 제약이 있으므로 버전 문서 확인 필요.
- ICU 기반 collations: ICU 사용 시 ICU 버전 차이가 문제. ICU는 glibc와 별개로 동작하므로 ICU 변경 시 동일 절차 적용.
복제(Replication)·스탠바이 환경에서의 절차
- 스탠바이(physical standby)가 있을 때
- 스탠바이가 동일한 OS/glibc 버전을 사용하는지 확인.
- 스탠바이에서 경고가 보이면, 스탠바이에도 동일한 조치(REFRESH/REINDEX)를 적용해야 함.
- 물리적 복제 환경에서는 스탠바이를 중단하고 인덱스 재생성 → 다시 복구하는 방식이 필요할 수 있음.
- 논리 복제(logical replication) 또는 멀티 마스터
- 복제 파이프라인에서 문자열 정렬 결과 차이로 데이터 불일치가 발생할 가능성 있음 → 사전 테스트 필수.
- 권장 순서(복제 환경)
- 테스트 스탠바이에서 REFRESH + 인덱스 재생성 검증 → 본 스탠바이 적용 → 슬레이브 동기 확인 → 주 DB 적용.
모니터링·검증 체크리스트 (조치 후 확인해야 할 항목)
- 경고 로그 사라짐. (
postgresql로그 확인) pg_collation에서collversion과pg_collation_actual_version(oid)값이 일치하는지 확인.- 애플리케이션 중요 쿼리(정렬·검색·유니크 체크) 테스트 케이스 통과.
- 인덱스 스캔 계획(Explain)에서 인덱스 사용 여부 유지 및 성능(응답 시간) 비교.
- 롤백 계획 유효성 확인. (백업→복원 시나리오 점검)
보안 관점 가이드(점검포인트)
- 권한 통제:
ALTER DATABASE·REINDEX등 중대한 명령은 DBA 전용 계정에서만 실행, 작업 전 작업내역(백업 위치·버전) 기록. - 변경 이력(감사): 작업 시작/종료 시점, 수행자, 실행 명령 캡처(스크린샷/로그) 저장.
- 검증 절차 문서화: 테이블/인덱스 영향 목록, 테스트 시나리오(정렬/검색 쿼리 목록) 문서 공유.
- 긴급 롤백 계획: 작업 실패 시 복원 절차(덤프에서 복원 혹은 스냅샷 롤백)와 담당자 연락망 준비.
- 변경 공지: 사용자-facing 서비스에 영향 가능성이 있을 때 사전 공지(배치 시간·예상 영향) 및 모니터링 팀 알림.
운영 체크리스트(실행 전·중·후)
실행 전
- 전체/증분 백업 확보 및 백업 무결성 검증
- 영향 서비스·쿼리 목록 및 우선순위 정의
- 트래픽 낮은 시간대 예약 및 담당자 지정
- 모니터링(성능/로그/알람) 준비
실행 중
- REFRESH 명령 실행 및 결과(에러/경고) 기록
- 인덱스 재생성 진행(로그/진행률 모니터링)
- 애플리케이션 핵심 시나리오 자동 테스트 수행
실행 후
- 정렬·검색 결과 비교(레거시 vs 현재) — 자동화 테스트 통과 확인
- 성능 회귀(쿼리 응답시간) 확인
- 로그 경고 소거 확인
- 변경 이력 및 운영 메모 정리
예시 케이스별 권장 액션 요약
- OS만 업그레이드(같은 PostgreSQL 버전)
→ALTER DATABASE ... REFRESH COLLATION VERSION→ 영향 인덱스REINDEX또는 CONCURRENTLY. - 컨테이너 베이스 이미지(라이브러리) 변경
→ 테스트 환경에서 전체 절차(REFRESH→REINDEX) 검증 후 프로덕션 적용. - PostgreSQL 메이저 업그레이드(예: 12 → 15)
→ 업그레이드 가이드(버전 호환성) 확인, 테스트 복원 → collations 불일치 검사 → REFRESH + 인덱스 재생성. - 데이터베이스를 다른 OS에 이동(복원)
→ 복원 후pg_collation상태 확인 → 필요 시 REINDEX.
컨테이너(또는 OS) 변경 → ALTER DATABASE ... REFRESH COLLATION VERSION로 카탈로그를 갱신하고, 문자열 인덱스는 반드시 재생성해야 합니다. 무중단을 원하면 REINDEX CONCURRENTLY / CREATE INDEX CONCURRENTLY 패턴 또는 pg_repack 같은 온라인 도구를 사용하세요.
Docker / Kubernetes 환경 권장 절차 (순서 + 세부 명령)
- 목표: 컨테이너 이미지(또는 베이스 OS) 업데이트 후 발생하는 collation 불일치 경고를 제거하고 인덱스 정합성/성능 확보.
- 원칙: 먼저 검증 → 백업 → 카탈로그 갱신 → 안전하게 인덱스 재생성 → 검증 순.
1. 업데이트 전(테스트/준비)
- 테스트 클러스터/스테이징에서 동일 이미지(또는 glibc)로 재현 후 전체 절차 검증.
- 서비스 영향 쿼리(정렬·유니크·검색) 목록화 — 자동 테스트 케이스 준비.
- 백업 / 스냅샷 준비
# 예: pg_basebackup (파일 레벨 스냅샷) 또는 logical dump pg_dump -Fc -f /backup/mydb_pre_update.dump mydb
2. 컨테이너 이미지 교체(롤링 업데이트 패턴)
- StatefulSet 기반 PostgreSQL(권장)은 Pod 순서/볼륨 지속성 관리 필요. StatefulSet의 updateStrategy는 RollingUpdate로 설정 가능(삭제 후 재생성 방식). 각 Pod를 순차적으로 교체하면서 데이터 무결성 유지해야 함.
운영 권장 패턴(대표적)- 패턴 A — 스탠바이(읽기 전용) 우선 업그레이드: 복제(스탠바이)가 있으면 스탠바이를 먼저 교체, 기능검증 후 프라이머리 교체. (롤백이 용이)
- 패턴 B — Ferris-wheel(순환 업그레이드): Pod를 순차적으로 재시작/교체하면서 클러스터 전체를 회전시켜 영향 최소화.
예: StatefulSet 업데이트 (helm/manifest 변경 → kubectl apply)
# 1) 이미지 태그만 바꾸고 롤아웃
kubectl -n db set image sts/postgres postgres=myrepo/postgres:NEWTAG
# 2) 상태 확인 (각 Pod가 READY 될 때까지 대기)
kubectl rollout status statefulset/postgres -n db
주의: StatefulSet의 롤링업데이트는 각 Pod를 삭제·재생성하므로 순차적 재시작 중 스냅샷/복제 상태를 확인하세요.
3. 컨테이너(또는 호스트) 교체 후 DB 내 점검 (바로 실행)
- OS(glibc/ICU) 버전 확인(컨테이너 안에서)
docker exec -it postgres /bin/sh -c "ldd --version; getconf GNU_LIBC_VERSION" - PostgreSQL 로그에서 collation 경고 확인
(로그 메시지로collversion경고가 반복되는지 확인) - DB에서 영향 collation/객체 확인
→ 영향을 받는 인덱스/테이블 목록 확보.SELECT pg_describe_object(refclassid, refobjid, refobjsubid) AS "Collation", pg_describe_object(classid, objid, objsubid) AS "Object" FROM pg_depend d JOIN pg_collation c ON refclassid = 'pg_collation'::regclass AND refobjid = c.oid WHERE c.collversion <> pg_collation_actual_version(c.oid) ORDER BY 1, 2;-- psql에서 실행 SELECT oid, collname, collversion, pg_collation_actual_version(oid) AS actual FROM pg_collation WHERE collversion IS DISTINCT FROM pg_collation_actual_version(oid);
4. 카탈로그 갱신(경고 제거 표시)
ALTER DATABASE mydb REFRESH COLLATION VERSION;
- 이 단계는 “경고를 제거”하고 DB 메타데이터를 현재 OS 기준으로 갱신합니다. 인덱스는 그대로이므로 반드시 재생성 필요성 여부를 판단해야 합니다.
5. 인덱스 재생성(운영 환경 기준)
- 상황에 따라 선택
REINDEX DATABASE mydb;— 가장 확실하나 잠금과 다운타임 위험 존재.REINDEX CONCURRENTLY index/REINDEX CONCURRENTLY(인덱스 단위) — PostgreSQL 12+에서 사용 가능, 잠금 최소화. (단, 오래 걸림/트랜잭션 제약)CREATE INDEX CONCURRENTLY new_idx ...; DROP INDEX CONCURRENTLY old_idx;— 범용적이고 안전한 대체 패턴. (무중단에 가깝다)
권장 실무 플로우(프로덕션, 최소 영향)
- 영향 큰(사용 빈도가 높고 문자열 기반인) 인덱스 우선순위화
- 인덱스별로
CREATE INDEX CONCURRENTLY→DROP INDEX CONCURRENTLY반복(각 인덱스마다 모니터링) - 모든 주요 인덱스가 갱신되면
ALTER DATABASE ... REFRESH COLLATION VERSION(이미 했더라도 다시 확인) → 로그 모니터링
PostgreSQL 버전별 REINDEX / CONCURRENTLY 제약 사항 요약
- PostgreSQL 11 이하
REINDEX CONCURRENTLY미지원(전체 인덱스 재생성은 잠금 발생).- 온라인 재빌드가 필요한 경우
CREATE INDEX CONCURRENTLY후 기존 DROP 하는 수동 패턴 권장.
- PostgreSQL 12 이상
REINDEX CONCURRENTLY도입 — 인덱스 재구성 시 읽기/쓰기 차단을 최소화할 수 있음. 다만 내부적으로는 두 번의 테이블 스캔과 미종료 트랜잭션 대기 등으로 시간이 오래 걸릴 수 있음. 또한REINDEX CONCURRENTLY는 트랜잭션 블록 안에서 실행 불가 등 제약 존재.
- PostgreSQL 13/14/15+
REINDEX CONCURRENTLY기능 안정화, 인덱스 유형/파티셔닝 관련 제약 완화(버전별 세부 제약은 릴리스 노트 확인 필요). 일부 특수 인덱스(예: 특정 파티션/외부인덱스)에서는 동작 제약이 존재할 수 있음.
정리: 버전 12 이전이면 무중단 옵션이 제한적 → 수동 CREATE INDEX CONCURRENTLY 패턴 또는 외부 도구(pg_repack) 고려. 버전 12 이상이면 REINDEX CONCURRENTLY 사용 가능하지만 제약·성능 특성(두 번 스캔·대기)을 이해하고 사용해야 합니다.
무중단 재색인 실전 Playbook (인덱스별 순차 재생성 스크립트 + 모니터링)
- 작은 단위(인덱스별)로 순차 실행 → 각 인덱스가 안정화된 뒤 다음 인덱스 진행
- 병렬 작업 금지(동시 인덱스 빌드는 I/O 폭주 유발)
- 모니터링:
pg_stat_progress_create_index,pg_stat_activity, 디스크 I/O, CPU, 쿼리응답시간(외부 APM) 을 체크
예시 스크립트 (Bash + psql) — CREATE INDEX CONCURRENTLY 패턴
이 스크립트는 우선순위 목록 파일(indexes.txt)을 받아 인덱스를 새로 만들고 기존 이름을 교체(이름 충돌 방지 위해 접미사 사용). 실제로 사용하기 전에 스테이징에서 검증하세요.
#!/usr/bin/env bash
# usage: ./rebuild_indexes_concurrently.sh mydb /path/to/indexes.txt
DB=$1
INDEX_FILE=$2
TMP_SUFFIX="_rebuild_$(date +%s)"
if [ -z "$DB" ] || [ -z "$INDEX_FILE" ]; then
echo "Usage: $0 <db> <indexes.txt>"
exit 1
fi
while read -r line; do
# expected format per line: schema.index_name|CREATE INDEX ... ON schema.table (col1, col2)
# e.g. public.idx_users_name|CREATE INDEX CONCURRENTLY idx_users_name_tmp ON public.users (name);
IFS='|' read -r idxname create_stmt <<< "$line"
new_idx="${idxname}${TMP_SUFFIX}"
echo "Processing $idxname -> creating $new_idx"
# replace placeholder name in create_stmt if needed, or rely on the provided stmt
# Execute create (expect CONCURRENTLY in stmt)
echo "$create_stmt" | psql -d "$DB"
if [ $? -ne 0 ]; then
echo "Create index failed for $idxname. Skipping."
continue
fi
# wait until index is valid: check pg_class and pg_index
echo "Waiting for new index to become valid..."
# simple sleep or better: poll pg_index.indisvalid
sleep 5
# Drop old index concurrently and rename new to old name
echo "Dropping old index $idxname (CONCURRENTLY)..."
psql -d "$DB" -c "DROP INDEX CONCURRENTLY IF EXISTS $idxname;"
psql -d "$DB" -c "ALTER INDEX ${new_idx} RENAME TO ${idxname};"
echo "Replaced $idxname"
done < "$INDEX_FILE"
indexes.txt 예시 한 줄
public.idx_users_name|CREATE INDEX CONCURRENTLY idx_users_name_rebuild_123 ON public.users (name);
모니터링 포인트 (실행 중)
pg_stat_progress_create_index— 인덱스 생성 진행 상황(퍼센트) 확인.SELECT * FROM pg_stat_progress_create_index;pg_stat_activity— 장시간 대기 중인 트랜잭션 확인.SELECT pid, state, query, now() - query_start AS runtime FROM pg_stat_activity WHERE state <> 'idle' ORDER BY runtime DESC;- 인덱스 크기 확인(완료 전후 비교):(환경에 맞게 쿼리 조정)
SELECT relname, pg_size_pretty(pg_relation_size(relid)) FROM pg_stat_user_indexes JOIN pg_index ON indexrelid = indexrelid WHERE schemaname='public';
예상 소요시간 산정 방법(간단 가이드)
- 요인: 테이블 행수, 인덱스 컬럼 수, 테이블 넓이, 디스크 IO 성능, CPU, 동시 트래픽.
- 간단 추정
- 소형(수만 행, 인덱스 100MB 미만): 수분~10분
- 중형(수십만-수백만 행, 인덱스 수백 MB-수 GB): 수십 분~수 시간
- 대형(수천만 행, 인덱스 수십 GB 이상): 수시간~수십시간
- 실제로는 각 인덱스 처음 10% 진행 속도로 전체 시간을 예측(테스트에서 샘플 생성 후 선형 보간) 권장.
pg_repack 등 외부 도구를 이용한 온라인 인덱스 재구성(장단점 비교)
pg_repack 개요
pg_repack은 table/index bloat(공간 낭비)를 온라인으로 제거할 수 있는 확장 도구입니다. 기존 테이블/인덱스를 잠그지 않고 백그라운드로 재작성 후 교체하는 방식입니다. RDS/Aurora에서도 지원/문서화되어 있음. (버전/지원여부 확인 필요)
장점
- 온라인(서비스 중단 최소화)으로 테이블/인덱스 재구성 가능
- VACUUM FULL/REINDEX에 비해 잠금 영향이 적음
- 대규모 테이블에서 효율적으로 bloat 제거
단점 / 제약
- 서버에 확장 설치 필요(권한/환경 제약) — 매니지드 DB(RDS 등)에서 설치 제약이 있을 수 있음. (운영환경에서 제한될 수 있음)
- 내부 동작이 복잡하므로 스크립트/모니터링 준비 필요
- 매우 바쁜 테이블(높은 DML)에서는 pg_repack 작업 중 추가 I/O로 성능 영향 가능
언제 선택할지(권장 사용처)
- 대규모 온라인 서비스에서 무중단으로 인덱스/테이블 정리가 필요할 때
- PostgreSQL 버전이 낮아
REINDEX CONCURRENTLY같은 온라인 옵션이 제한적일 때 - 운영자가 확장 설치를 허용하고 설치/테스트를 거칠 수 있을 때
운영/보안 체크리스트
- 백업 & 복원 검증: 변경 전 반드시 전체 덤프/스냅샷 및 복원 검증
- 롤백 계획: 이미지 롤백·데이터베이스 스냅샷 복원 절차 문서화
- 권한 통제: ALTER/REINDEX/pg_repack 실행 권한 제한(감사/로그 기록)
- 모니터링 준비: CPU/IO/pg_stat_activity/pg_stat_progress_create_index 모니터링 대시보드
- 승인 절차: 대규모 인덱스 재생성은 Change Request/담당자 승인 후 실행
권장 순서 — 운영에서 바로 적용할 경우
- 스테이징에서 전체 절차(이미지 교체 → REFRESH → 인덱스 재생성) 테스트.
- 운영에서(트래픽 낮은 시간대) 백업 → 컨테이너 이미지 롤링 업데이트(스탠바이 우선 패턴) →
ALTER DATABASE ... REFRESH COLLATION VERSION실행 → 인덱스별로CREATE INDEX CONCURRENTLY→DROP INDEX CONCURRENTLY방식으로 순차 재생성(모니터링). - 필요한 경우
pg_repack을 도입(무중단 대규모 정리 필요 시).
댓글