본문 바로가기
서버구축 (WEB,DB)

컨테이너 이미지 변경 REFRESH·REINDEX 무중단 인덱스 재생성 Playbook

by 날으는물고기 2026. 1. 22.

컨테이너 이미지 변경 REFRESH·REINDEX 무중단 인덱스 재생성 Playbook

728x90

DB 생성 시기와 운영체제(glibc/ICU)·PostgreSQL 바이너리(업그레이드/컨테이너 이미지 변경 등)이 달라졌을 때 발생할 수 있는 각 상황에 대한 영향·진단·우선순위별 대응(명령·스크립트·무중단 옵션 포함)과 운영·보안 관점의 체크리스트 예시입니다.

어떤 변화가 위험을 만드는가?

  1. OS(glibc/locale/ICU) 업그레이드 또는 변경 — DB가 만들어진 시점의 libc/ICU와 실행 환경이 달라지면 collation(문자열 정렬 규칙) 버전 불일치 경고가 발생할 수 있으며, 문자열 인덱스의 정렬 순서가 달라져 인덱스 불일치/쿼리 결과 변화 가능성이 있습니다.
  2. PostgreSQL 바이너리 업그레이드(버전 변경) 또는 재빌드 — 빌드 시 사용된 libc/ICU와 운영체제의 차이로 경고가 나타날 수 있습니다.
  3. 컨테이너 이미지(베이스 OS) 변경 / 이미지 태그 교체 — 컨테이너 내부 glibc 버전이 바뀌면 동일한 현상 발생 가능.
  4. 백업/복원 또는 데이터베이스를 다른 OS로 이동(예: 복제 → 새 호스트) — 복원된 DB는 로컬 OS collation과 차이가 날 수 있음.

영향 범위 (무엇이 깨질 수 있나?)

  1. ORDER BY, GROUP BY 결과(정렬 순서) 변경 가능.
  2. LIKE / ILIKE / 문자열 비교 결과 변화. (특히 로케일 민감 비교)
  3. ⚠️ B-tree 기반 문자열 인덱스(문자열 컬럼의 유니크 포함) — 인덱스가 잘못 정렬되어 성능 문제나 부정확한 결과(인덱스 스캔 실패)가 발생할 수 있음.
  4. 복제/스탠바이 환경: 경고는 복제에도 전파될 수 있음. (동일한 문제를 여러 DB에서 관찰)

우선 진단(무엇을 먼저 확인해야 하나?) — 빠르게 실행 가능한 체크리스트

  1. 현재 OS의 glibc / ICU 버전 확인
    Linux 예시
    ldd --version       # 보통 glibc 버전이 첫 줄에 표시됩니다.
    getconf GNU_LIBC_VERSION
    rpm -q glibc        # RHEL 계열
    apt-cache policy libc6  # Debian 계열 (간접 확인)
  2. 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;
  3. 현재 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);
  4. 애플리케이션 영향 범위 파악
    • 정렬순서/검색결과가 사업적으로 중요한 쿼리 목록(예: 페이징/정렬 UI, 유니크 제약 검증 쿼리 등)을 수집 → 테스트 케이스 준비.

대응 원칙(우선순위와 위험도 기준)

  1. 운영(프로덕션) + 문자열 인덱스/정렬 결과 중요: 즉시 조치 권장 (REFRESH + 인덱스 재생성).
  2. 개발/스테이징: 로그 경고가 거슬려도 우선순위는 낮음. 다만 업그레이드 테스트 환경에서 재현·검증 필요.
  3. 대규모 DB / 하드 리얼타임 시스템: 무중단 전략(인덱스별 CONCURRENTLY 재생성 혹은 pg_repack 등 외부도구) 적용 권장.

구체적 조치(명령·스크립트·무중단 옵션) — 실전 Playbook

A. 안전하고 표준적인 조치 (권장)

  1. 전체 백업
    sudo -u postgres pg_dump -Fc -f all_databases_pre_reindex.dump --dbname=postgres
  2. DB 메타데이터 갱신 (경고 제거용):이 명령은 카탈로그의 collversion을 현재 시스템 버전으로 갱신(“표시 업데이트”)합니다.
    ALTER DATABASE mydb REFRESH COLLATION VERSION;
  3. 인덱스 재생성 (권장 — 전체):주의: REINDEX는 대상 인덱스에 대해 잠금을 발생시킬 수 있으므로 트래픽 낮은 시간대 권장.
    REINDEX DATABASE mydb;

B. 다운타임 최소화(무중단에 가깝게) — 실무 패턴

  1. PostgreSQL 12+에서 일부 REINDEX CONCURRENTLY 사용 가능(버전/제약 확인 필요).제약: 모든 인덱스 유형/상황에서 지원되는 것은 아님. 문서 확인 필수.
    REINDEX INDEX CONCURRENTLY idx_name;
  2. 안전한 수동 절차 (널리 쓰이는 패턴, 가장 호환성이 좋음)
    • 각 인덱스에 대해
      -- 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;
      장점: 테이블 잠금 최소화. 단점: 인덱스 생성 동안 추가 디스크/I/O 사용.
  3. pg_repack 사용 (온라인 인덱스 재빌드 도구) — 장단점
    장점: 온라인으로 인덱스 정리/재구성 가능.
    단점: 추가 도구 설치, 약간의 설정/점검 필요. (대규모에서 편리)

C. 전체 복원(가장 깨끗하지만 시간/절차 필요)

  1. 기존 DB 덤프
    pg_dump -Fc -f mydb.dump mydb
  2. 새 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 버전별/환경별 주의점 요약

  1. PostgreSQL 10+: pg_collation_actual_version(oid) 함수가 있어 시스템 collation 실제 버전 비교 가능.
  2. REINDEX CONCURRENTLY: PostgreSQL 버전과 인덱스 유형 제약이 있으므로 버전 문서 확인 필요.
  3. ICU 기반 collations: ICU 사용 시 ICU 버전 차이가 문제. ICU는 glibc와 별개로 동작하므로 ICU 변경 시 동일 절차 적용.

복제(Replication)·스탠바이 환경에서의 절차

  1. 스탠바이(physical standby)가 있을 때
    • 스탠바이가 동일한 OS/glibc 버전을 사용하는지 확인.
    • 스탠바이에서 경고가 보이면, 스탠바이에도 동일한 조치(REFRESH/REINDEX)를 적용해야 함.
    • 물리적 복제 환경에서는 스탠바이를 중단하고 인덱스 재생성 → 다시 복구하는 방식이 필요할 수 있음.
  2. 논리 복제(logical replication) 또는 멀티 마스터
    • 복제 파이프라인에서 문자열 정렬 결과 차이로 데이터 불일치가 발생할 가능성 있음 → 사전 테스트 필수.
  3. 권장 순서(복제 환경)
    • 테스트 스탠바이에서 REFRESH + 인덱스 재생성 검증 → 본 스탠바이 적용 → 슬레이브 동기 확인 → 주 DB 적용.

모니터링·검증 체크리스트 (조치 후 확인해야 할 항목)

  1. 경고 로그 사라짐. (postgresql 로그 확인)
  2. pg_collation에서 collversionpg_collation_actual_version(oid) 값이 일치하는지 확인.
  3. 애플리케이션 중요 쿼리(정렬·검색·유니크 체크) 테스트 케이스 통과.
  4. 인덱스 스캔 계획(Explain)에서 인덱스 사용 여부 유지 및 성능(응답 시간) 비교.
  5. 롤백 계획 유효성 확인. (백업→복원 시나리오 점검)

보안 관점 가이드(점검포인트)

  1. 권한 통제: ALTER DATABASE·REINDEX 등 중대한 명령은 DBA 전용 계정에서만 실행, 작업 전 작업내역(백업 위치·버전) 기록.
  2. 변경 이력(감사): 작업 시작/종료 시점, 수행자, 실행 명령 캡처(스크린샷/로그) 저장.
  3. 검증 절차 문서화: 테이블/인덱스 영향 목록, 테스트 시나리오(정렬/검색 쿼리 목록) 문서 공유.
  4. 긴급 롤백 계획: 작업 실패 시 복원 절차(덤프에서 복원 혹은 스냅샷 롤백)와 담당자 연락망 준비.
  5. 변경 공지: 사용자-facing 서비스에 영향 가능성이 있을 때 사전 공지(배치 시간·예상 영향) 및 모니터링 팀 알림.

운영 체크리스트(실행 전·중·후)

실행 전

  • 전체/증분 백업 확보 및 백업 무결성 검증
  • 영향 서비스·쿼리 목록 및 우선순위 정의
  • 트래픽 낮은 시간대 예약 및 담당자 지정
  • 모니터링(성능/로그/알람) 준비

실행 중

  • REFRESH 명령 실행 및 결과(에러/경고) 기록
  • 인덱스 재생성 진행(로그/진행률 모니터링)
  • 애플리케이션 핵심 시나리오 자동 테스트 수행

실행 후

  • 정렬·검색 결과 비교(레거시 vs 현재) — 자동화 테스트 통과 확인
  • 성능 회귀(쿼리 응답시간) 확인
  • 로그 경고 소거 확인
  • 변경 이력 및 운영 메모 정리

예시 케이스별 권장 액션 요약

  1. OS만 업그레이드(같은 PostgreSQL 버전)
    ALTER DATABASE ... REFRESH COLLATION VERSION → 영향 인덱스 REINDEX 또는 CONCURRENTLY.
  2. 컨테이너 베이스 이미지(라이브러리) 변경
    → 테스트 환경에서 전체 절차(REFRESH→REINDEX) 검증 후 프로덕션 적용.
  3. PostgreSQL 메이저 업그레이드(예: 12 → 15)
    → 업그레이드 가이드(버전 호환성) 확인, 테스트 복원 → collations 불일치 검사 → REFRESH + 인덱스 재생성.
  4. 데이터베이스를 다른 OS에 이동(복원)
    → 복원 후 pg_collation 상태 확인 → 필요 시 REINDEX.

컨테이너(또는 OS) 변경 → ALTER DATABASE ... REFRESH COLLATION VERSION로 카탈로그를 갱신하고, 문자열 인덱스는 반드시 재생성해야 합니다. 무중단을 원하면 REINDEX CONCURRENTLY / CREATE INDEX CONCURRENTLY 패턴 또는 pg_repack 같은 온라인 도구를 사용하세요.

Docker / Kubernetes 환경 권장 절차 (순서 + 세부 명령)

  • 목표: 컨테이너 이미지(또는 베이스 OS) 업데이트 후 발생하는 collation 불일치 경고를 제거하고 인덱스 정합성/성능 확보.
  • 원칙: 먼저 검증 → 백업 → 카탈로그 갱신 → 안전하게 인덱스 재생성 → 검증 순.

1. 업데이트 전(테스트/준비)

  1. 테스트 클러스터/스테이징에서 동일 이미지(또는 glibc)로 재현 후 전체 절차 검증.
  2. 서비스 영향 쿼리(정렬·유니크·검색) 목록화 — 자동 테스트 케이스 준비.
  3. 백업 / 스냅샷 준비
    # 예: 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를 순차적으로 재시작/교체하면서 클러스터 전체를 회전시켜 영향 최소화.
300x250

예: 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 내 점검 (바로 실행)

  1. OS(glibc/ICU) 버전 확인(컨테이너 안에서)
    docker exec -it postgres /bin/sh -c "ldd --version; getconf GNU_LIBC_VERSION"
  2. PostgreSQL 로그에서 collation 경고 확인
    (로그 메시지로 collversion 경고가 반복되는지 확인)
  3. 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; — 범용적이고 안전한 대체 패턴. (무중단에 가깝다)

권장 실무 플로우(프로덕션, 최소 영향)

  1. 영향 큰(사용 빈도가 높고 문자열 기반인) 인덱스 우선순위화
  2. 인덱스별로 CREATE INDEX CONCURRENTLYDROP INDEX CONCURRENTLY 반복(각 인덱스마다 모니터링)
  3. 모든 주요 인덱스가 갱신되면 ALTER DATABASE ... REFRESH COLLATION VERSION(이미 했더라도 다시 확인) → 로그 모니터링

PostgreSQL 버전별 REINDEX / CONCURRENTLY 제약 사항 요약

  1. PostgreSQL 11 이하
    • REINDEX CONCURRENTLY 미지원(전체 인덱스 재생성은 잠금 발생).
    • 온라인 재빌드가 필요한 경우 CREATE INDEX CONCURRENTLY 후 기존 DROP 하는 수동 패턴 권장.
  2. PostgreSQL 12 이상
    • REINDEX CONCURRENTLY 도입 — 인덱스 재구성 시 읽기/쓰기 차단을 최소화할 수 있음. 다만 내부적으로는 두 번의 테이블 스캔과 미종료 트랜잭션 대기 등으로 시간이 오래 걸릴 수 있음. 또한 REINDEX CONCURRENTLY는 트랜잭션 블록 안에서 실행 불가 등 제약 존재.
  3. 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/담당자 승인 후 실행

권장 순서 — 운영에서 바로 적용할 경우

  1. 스테이징에서 전체 절차(이미지 교체 → REFRESH → 인덱스 재생성) 테스트.
  2. 운영에서(트래픽 낮은 시간대) 백업 → 컨테이너 이미지 롤링 업데이트(스탠바이 우선 패턴) → ALTER DATABASE ... REFRESH COLLATION VERSION 실행 → 인덱스별로 CREATE INDEX CONCURRENTLYDROP INDEX CONCURRENTLY 방식으로 순차 재생성(모니터링).
  3. 필요한 경우 pg_repack을 도입(무중단 대규모 정리 필요 시).
728x90
그리드형(광고전용)

댓글