> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ClickHouse Cloud를 사용한 Managed Postgres로의 마이그레이션

> ClickHouse Cloud에 기본으로 제공되는 데이터 소스 가져오기 마법사를 사용해 PostgreSQL 데이터베이스를 ClickHouse Managed Postgres로 마이그레이션하는 방법을 알아봅니다.

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

export const galaxyOnClick = eventName => () => {
  try {
    if (typeof window !== "undefined" && window.galaxy && eventName) {
      window.galaxy.track(eventName, {
        interaction: "click"
      });
    }
  } catch (e) {}
};

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <Icon />
                <span>Beta</span>
            </a>;
  }
  return <div className="betaBadge">
            <Icon />
            <span>
                Beta feature. 
                <u>
                    <a href="/docs/beta-and-experimental-features#beta-features">
                        Learn more.
                    </a>
                </u>
            </span>
        </div>;
};

ClickHouse Cloud에는 외부 PostgreSQL 데이터베이스를 Managed Postgres 서비스로 마이그레이션하는 기본 제공 가져오기 마법사가 포함되어 있습니다. 이 마법사는 5개의 안내 단계에 걸쳐 소스 연결, 스키마 내보내기 및 가져오기, 복제 설정, 테이블 선택을 처리합니다.

<div id="prerequisites">
  ## 사전 요구 사항
</div>

* 복제 권한이 있는 사용자 계정으로 원본 PostgreSQL 데이터베이스에 접근할 수 있어야 합니다.
* 마이그레이션 대상이 될 ClickHouse Managed Postgres 서비스가 있어야 합니다. 아직 없다면 [quickstart](/ko/products/managed-postgres/quickstart)를 참조하세요.
* 로컬 머신에 `pg_dump` 및 `psql`이 설치되어 있어야 합니다. 둘 다 표준 PostgreSQL 클라이언트 도구에 포함되어 있습니다.

<div id="considerations">
  ## 마이그레이션 전에 고려할 사항
</div>

* **DDL 전파**: 지속적 복제(CDC)는 DML 작업과 `ADD COLUMN`을 포착합니다. `DROP COLUMN` 및 `ALTER COLUMN`과 같은 다른 DDL 변경 사항은 전파되지 않으므로 대상 시스템에 수동으로 적용해야 합니다.

<div id="step-1-connect">
  ## 1단계: 원본 데이터베이스에 연결
</div>

[ClickHouse Cloud 콘솔](https://clickhouse.cloud)을 열고 Managed Postgres 서비스를 선택합니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/servicecard.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=9489a06a98d75e91348b5da294525e76" alt="ClickHouse Cloud 서비스 목록의 Managed Postgres 서비스 카드" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/servicecard.png" />

왼쪽 사이드바에서 **데이터 소스**를 클릭합니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/overview.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=9e1cb6b5a839a052819244c60a9ee17d" alt="Managed Postgres 서비스 사이드바의 데이터 소스 항목" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/overview.png" />

**Start import**를 클릭합니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/startimport.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=b92bd9233ee8a30016d92213e4d78dd9" alt="Start import 버튼이 있는 데이터 소스 페이지" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/startimport.png" />

원본 PostgreSQL 데이터베이스의 연결 정보를 입력합니다: 호스트, 포트, 사용자 이름, 비밀번호, 데이터베이스 이름. 원본 데이터베이스에서 요구하는 경우 **TLS**를 활성화합니다.

원본 데이터베이스에 대한 비공개 연결이 필요하다면 **SSH tunneling**을 선택하고 필요한 SSH 정보를 입력할 수 있습니다. 이렇게 하면 공개적으로 접근할 수 없는 데이터베이스에도 마이그레이션이 안전하게 연결할 수 있습니다.

수집 방법을 선택합니다:

* **Initial load + CDC** — 기존 데이터를 복사한 다음, 이후 변경 사항도 계속 대상에 동기화합니다.
* **Initial load only** — 1회성 복사이며, 이후 복제는 수행하지 않습니다.
* **CDC only** — 초기 복사를 건너뛰고 이 시점부터 발생하는 새 변경 사항만 복제합니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/migrationform.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=ff63743500aeb934937d695cf5354173" alt="1단계: 수집 방법 옵션이 있는 원본 데이터베이스 연결 양식" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/migrationform.png" />

**다음**을 클릭합니다.

<div id="step-2-export-schema">
  ## 2단계: 데이터베이스 스키마(schema) 내보내기
</div>

마법사에 소스 연결 정보가 미리 입력된 `pg_dump` 명령이 표시됩니다. 터미널에서 실행하세요:

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/nextexport.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=0d1901993cfa84d0a6befde992db8f14" alt="2단계: 스키마 내보내기를 위한 pg_dump 명령" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/nextexport.png" />

```shell theme={null}
pg_dump \
  -h <source_host> \
  -U <source_user> \
  -d <source_database> \
  --schema-only \
  -f pg.sql
```

이렇게 하면 현재 디렉터리에 `pg.sql` 파일이 생성됩니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/psqlexport.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=cb98d175bc0c906e051554bf795ed0fc" alt="pg_dump 실행 후 터미널 출력" size="lg" border width="1452" height="422" data-path="images/managed-postgres/pgpg/psqlexport.png" />

**다음**을 클릭하세요.

<div id="step-3-import-schema">
  ## 3단계: 스키마를 Managed Postgres 서비스로 가져오기
</div>

드롭다운에서 대상 데이터베이스를 선택하거나 **Create a new database**를 클릭해 새 데이터베이스를 프로비저닝합니다.

마법사에 스키마 dump를 Managed Postgres 서비스에 적용하는 `psql` 명령이 표시됩니다. 터미널에서 실행하세요:

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/nextimport.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=49633961f0514ab7c0f1a8f59840faa4" alt="3단계: 스키마 가져오기를 위한 psql 명령" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/nextimport.png" />

```shell theme={null}
psql \
  -h <target_host> \
  -p 5432 \
  -U <target_user> \
  -d <target_database> \
  -f pg.sql
```

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/psqlimport.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=fb12c7401ae28d74b5e41ef6f5edf672" alt="psql로 스키마를 가져온 후의 터미널 출력" size="lg" border width="2362" height="762" data-path="images/managed-postgres/pgpg/psqlimport.png" />

**다음**을 클릭하세요.

<div id="step-4-ingestion-settings">
  ## Step 4: 수집 설정 구성
</div>

논리적 복제에 사용할 publication을 지정합니다. 이 값을 비워 두면 publication이 자동으로 생성됩니다.

처리량을 조정하려면 **고급 복제 설정**을 펼치세요:

| 설정              | 기본값     | 설명                        |
| --------------- | ------- | ------------------------- |
| 동기화 간격(초)       | 10      | replication slot을 폴링하는 주기 |
| 초기 적재용 병렬 스레드 수 | 4       | 대량 복사 단계에 사용할 스레드 수       |
| Pull 배치 크기      | 100,000 | 복제 배치마다 가져오는 행 수          |
| 스냅샷 파티션당 행 수    | 100000  | 대용량 테이블 스냅샷의 파티션 크기       |
| 병렬 스냅샷 테이블 수    | 1       | 동시에 스냅샷되는 테이블 수           |

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/advancedsettings.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=1a4ef969ee9e5407ba3552aa71cf9b2a" alt="4단계: publication 및 고급 복제 옵션이 포함된 수집 설정 양식" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/advancedsettings.png" />

**다음**을 클릭하세요.

<div id="step-5-select-tables">
  ## 5단계: 테이블 선택
</div>

복제할 테이블을 선택합니다. 테이블은 스키마(schema)별로 그룹화되어 있습니다. 개별 테이블을 선택하거나 스키마를 펼쳐 모두 선택합니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/tablepicker.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=f5e0d473a2121f18a235d90f044bb245" alt="5단계: Create migration 버튼이 있는 스키마별 그룹화 테이블 선택기" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/tablepicker.png" />

**Create migration** 버튼을 클릭합니다.

<div id="monitor">
  ## 마이그레이션 모니터링
</div>

마이그레이션을 생성하면 **데이터 소스**에 **실행 중** 상태로 표시됩니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/migrationlist.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=2a80626d8c0b4790cc19900b6cdc1f67" alt="실행 중인 마이그레이션이 표시된 데이터 소스 목록" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/migrationlist.png" />

마이그레이션을 클릭하면 세부 정보 화면이 열립니다. **테이블** 탭에는 각 테이블의 초기 적재 진행 상황이 표시되며, 처리된 행 수, 파티션, 파티션당 평균 소요 시간이 포함됩니다. **메트릭** 탭에는 CDC가 시작되면 복제 지연과 처리량이 표시됩니다.

<Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/qT0j4CNmQubVqREl/images/managed-postgres/pgpg/initialload.png?fit=max&auto=format&n=qT0j4CNmQubVqREl&q=85&s=147ea41c4664e2fefd47342eb3cfebbd" alt="테이블별 초기 적재 통계가 표시된 마이그레이션 세부 정보 화면" size="lg" border width="3680" height="2392" data-path="images/managed-postgres/pgpg/initialload.png" />

<div id="post-migration">
  ## 마이그레이션 후 작업
</div>

초기 적재가 완료되고, CDC를 사용하는 경우 복제 지연이 거의 0이 되면 다음을 수행하십시오:

**행 수를 검증합니다.** 트래픽을 전환하기 전에 원본과 대상의 주요 테이블을 표본 점검하십시오:

```sql theme={null}
SELECT COUNT(*) FROM public.orders;
```

**소스 시스템에 대한 쓰기를 중지합니다.** 애플리케이션의 쓰기 작업을 일시 중지하세요. 컷오버 중 읽기 전용 모드를 적용하려면:

```sql theme={null}
ALTER DATABASE <source_db> SET default_transaction_read_only = on;
```

**복제가 최신 상태까지 반영되었는지 확인합니다.** 원본과 대상의 가장 최근 행을 비교합니다:

```sql theme={null}
-- 소스와 대상 모두에서 실행
SELECT MAX(id), MAX(updated_at) FROM public.orders;
```

**시퀀스를 재설정합니다.** 각 테이블의 현재 최댓값에 맞게 시퀀스를 조정합니다:

```sql theme={null}
DO $$
DECLARE r RECORD;
BEGIN
    FOR r IN
        SELECT
            n.nspname AS schema_name,
            c.relname AS table_name,
            a.attname AS column_name,
            pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS seq_name
        FROM pg_class c
        JOIN pg_namespace n ON n.oid = c.relnamespace
        JOIN pg_attribute a ON a.attrelid = c.oid
        WHERE c.relkind = 'r'
            AND a.attnum > 0
            AND NOT a.attisdropped
            AND n.nspname NOT IN ('pg_catalog', 'information_schema')
    LOOP
        IF r.seq_name IS NOT NULL THEN
            EXECUTE format(
                'SELECT setval(%L, COALESCE((SELECT MAX(%I) FROM %I.%I), 0) + 1, false)',
                r.seq_name, r.column_name, r.schema_name, r.table_name
            );
        END IF;
    END LOOP;
END $$;
```

**애플리케이션 트래픽을 전환합니다.** 읽기 및 쓰기 트래픽이 Managed Postgres 서비스로 향하도록 전환하고, 오류, 제약 조건 위반, 복제 상태를 모니터링하십시오.

**정리합니다.**  전환을 완료하고 새 서비스가 정상적으로 작동하는 것을 확인했다면 **데이터 소스**에서 마이그레이션을 삭제하십시오. CDC를 사용한 경우 리소스를 확보할 수 있도록 원본에서 replication slot을 삭제하십시오:

```sql theme={null}
SELECT pg_drop_replication_slot('<slot_name>');
```

<div id="next-steps">
  ## 다음 단계
</div>

* [Managed Postgres 빠른 시작](/ko/products/managed-postgres/quickstart)
* [Managed Postgres 연결 정보](/ko/products/managed-postgres/connection)
* [ClickPipes Postgres FAQ](/ko/integrations/clickpipes/postgres/faq)
