

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# pg\_repack을 사용하여 팽창 제거
<a name="pg-repack"></a>

`pg_repack` 확장을 사용하여 데이터베이스 잠금을 최소화하면서 테이블 및 인덱스 팽창을 제거할 수 있습니다. 데이터베이스 인스턴스에서 이 확장을 생성하고 Amazon Elastic Compute Cloud(Amazon EC2) 또는 데이터베이스에 연결할 수 있는 컴퓨터에서 `pg_repack` 클라이언트(클라이언트 버전이 확장 버전과 일치하는 경우)를 실행할 수 있습니다.

`VACUUM FULL`과 달리 `pg_repack`에는 가동 중지 시간이나 유지 관리 기간이 필요하지 않으며 다른 세션을 차단하지 않습니다.

`pg_repack`은 `VACUUM FULL`, `CLUSTER` 또는 `REINDEX`가 작동하지 않는 상황에서 유용합니다. 팽창된 테이블의 데이터가 포함된 새 테이블을 만들고 원본 테이블의 변경 사항을 추적한 다음 원본 테이블을 새 테이블로 바꿉니다. 새 테이블을 빌드하는 동안 읽기 또는 쓰기 작업을 위해 원본 테이블을 잠그지 않습니다.

전체 테이블 또는 인덱스에 `pg_repack`을 사용할 수 있습니다. 태스크 목록을 보려면 [pg\_repack 설명서](https://reorg.github.io/pg_repack/)를 참조하세요.

제한:
+ `pg_repack`을 실행하려면 테이블에 프라이머리 키 또는 고유 인덱스가 있어야 합니다.
+ `pg_repack `은 임시 테이블에서 작동하지 않습니다.
+ `pg_repack`은 글로벌 인덱스가 있는 테이블에서 작동하지 않습니다.
+ `pg_repack`이 진행 중이면 테이블에서 DDL 작업을 수행할 수 없습니다.

다음 표에서는 `pg_repack` 및 `VACUUM FULL` 사이의 차이를 설명합니다.


|  |  | 
| --- |--- |
| `VACUUM FULL` | `pg_repack` | 
| 기본 제공 명령 | Amazon EC2 또는 로컬 컴퓨터에서 실행하는 확장 | 
| 테이블에서 작업하는 동안 `ACCESS EXCLUSIVE` 잠금 필요 | 짧은 시간 동안만 `ACCESS EXCLUSIVE` 잠금 필요 | 
| 모든 테이블에서 작동 | 프라이머리 키 및 고유 키만 있는 테이블에서 작동 | 
| 테이블 및 인덱스에서 소비하는 스토리지의 두 배 필요 | 테이블 및 인덱스에서 소비하는 스토리지의 두 배 필요 | 

테이블에서 `pg_repack`을 실행하려면 다음 명령을 사용합니다.

```
pg_repack -h <host> -d <dbname> --table <tablename> -k
```

인덱스에서 `pg_repack`을 실행하려면 다음 명령을 사용합니다.

```
pg_repack -h <host> -d <dbname> --index <index name>
```

자세한 내용은 AWS 블로그 게시물 [Remove bloat from Amazon Aurora and RDS for PostgreSQL with pg\_repack](https://aws.amazon.com/blogs/database/remove-bloat-from-amazon-aurora-and-rds-for-postgresql-with-pg_repack/)을 참조하세요.

**주의 사항**  
`pg_repack`의 `error-on-invalid-index` 오류는 일반적으로 테이블에서 하나 이상의 인덱스가 손상되었거나 유효하지 않음을 의미합니다. `pg_repack`은 재압축 프로세스 중 데이터 일관성을 위해 인덱스에 의존하기 때문에 유효하지 않은 인덱스가 있는 테이블에서 안전하게 작동할 수 없습니다.  
이 오류는 다음과 같은 경우에 발생합니다.  
인덱스가 유효하지 않은 항목으로 표시됩니다(예: 실패한 `CREATE INDEX CONCURRENTLY` 문이 원인임).
인덱스가 손상되었습니다(하드웨어 문제 또는 갑작스러운 종료가 원인일 수 있음).
다음 쿼리를 사용하여 유효하지 않은 인덱스를 식별하고 해당 인덱스를 찾으면 먼저 삭제합니다.  

```
SELECT indexrelid::regclass, indisvalid FROM pg_index WHERE indrelid = 'orders'::regclass AND NOT indisvalid; Drop the invalid index: DROP INDEX index_name;
```