

# MSCK REPAIR TABLE
<a name="msck-repair-table"></a>

Hive 호환 파티션을 추가한 후 `MSCK REPAIR TABLE` 명령을 사용하여 카탈로그의 메타데이터를 업데이트합니다.

`MSCK REPAIR TABLE` 명령은 테이블을 생성한 후 파일 시스템에 추가된 Hive 호환 파티션을 위해 Amazon S3 등의 파일 시스템을 스캔합니다. `MSCK REPAIR TABLE`은 테이블 메타데이터의 파티션과 S3의 파티션을 비교합니다. 테이블을 생성할 때 지정한 S3 위치에 새 파티션이 있으면 메타데이터와 Athena 테이블에 해당 파티션이 추가됩니다.

물리적 파티션을 추가하면 카탈로그의 메타데이터가 파일 시스템의 데이터 레이아웃과 일치하지 않게 되므로 새 파티션에 대한 정보를 카탈로그에 추가해야 합니다. 메타데이터를 업데이트하려면 Athena에서 새 파티션의 데이터를 쿼리할 수 있도록 `MSCK REPAIR TABLE`을 실행합니다.

**참고**  
`MSCK REPAIR TABLE`은 메타데이터에 파티션을 추가하기만 합니다. 파티션을 제거하지는 않습니다. Amazon S3에서 파티션을 수동으로 삭제한 후 메타데이터에서 파티션을 제거하려면 `ALTER TABLE {{table-name}} DROP PARTITION` 명령을 실행합니다. 자세한 내용은 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) 단원을 참조하세요.

## 고려 사항 및 제한 사항
<a name="msck-repair-table-considerations"></a>

`MSCK REPAIR TABLE`을 사용할 때는 다음 사항에 유의하세요.
+ 모든 파티션을 추가하려면 다소 시간이 걸릴 수 있습니다. 이 작업의 시간이 초과되면 카탈로그에 몇 개의 파티션만 추가되는 불완전한 상태가 됩니다. 모든 파티션이 추가될 때까지 동일한 테이블에서 `MSCK REPAIR TABLE`을 실행해야 합니다. 자세한 내용은 [데이터 파티셔닝](partitions.md) 섹션을 참조하세요.
+ Hive와 호환되지 않는 파티션의 경우 데이터를 쿼리할 수 있도록 파티션을 로드하려면 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.
+ Athena에 사용될 파티션 위치는 `s3` 프로토콜(예: `s3://amzn-s3-demo-bucket/{{folder}}/`)을 사용해야 합니다. Athena에서, 다른 프로토콜(예: `s3a://{{bucket}}/{{folder}}/`)을 사용하는 위치는 포함 테이블에서 `MSCK REPAIR TABLE` 쿼리를 실행할 때 쿼리 실패를 초래하게 됩니다.
+ `MSCK REPAIR TABLE`은 일치하는 파티션 스키마를 찾기 위해 폴더와 하위 폴더를 모두 스캔하기 때문에 별도의 폴더 계층 구조에 있는 별도의 테이블에 데이터를 보관해야 합니다. 예를 들어 테이블 1의 데이터를 `s3://amzn-s3-demo-bucket1`에 두고 테이블 2에 대한 데이터을 `s3://amzn-s3-demo-bucket1/table-2-data`에 두었다고 가정합시다. 두 테이블이 모두 문자열로 분할된 경우 `MSCK REPAIR TABLE`은 테이블 2의 파티션을 테이블 1에 추가합니다. 이를 방지하려면 대신에 `s3://amzn-s3-demo-bucket1` 및 `s3://amzn-s3-demo-bucket2`와 같은 별도의 폴더 구조를 사용하세요. 이 동작은 Amazon EMR과 Apache Hive에서도 동일합니다.
+ 알려진 문제로 인해 파티션 값에 콜론(`MSCK REPAIR TABLE`)이 포함된 경우(예: 파티션 값이 타임스탬프인 경우) `:`이 자동으로 실패합니다. 임시 해결책으로 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.
+ `MSCK REPAIR TABLE`에서는 밑줄(\_)로 시작하는 파티션 열 이름을 추가하지 않습니다. 이 제한을 해결하려면 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용합니다.

## 시놉시스
<a name="synopsis"></a>

```
MSCK REPAIR TABLE table_name
```

## 예제
<a name="examples"></a>

```
MSCK REPAIR TABLE orders;
```

## 문제 해결
<a name="msck-repair-table-troubleshooting"></a>

`MSCK REPAIR TABLE`을 실행한 후 Athena가 AWS Glue Data Catalog의 테이블에 파티션을 추가하지 않으면 다음을 확인하세요.
+ **AWS Glue 액세스** – AWS Identity and Access Management(IAM) 역할에 `glue:BatchCreatePartition` 작업을 허용하는 정책이 있는지 확인합니다. 자세한 내용은 이 문서의 후반부에서 [IAM 정책에서 glue:BatchCreatePartition 허용](#msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy) 단원을 참조하세요.
+ **Amazon S3 액세스** - 역할에 Amazon S3에 액세스할 수 있는 충분한 권한([https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) 작업 포함)이 있는 정책이 있는지 확인합니다. 허용할 Amazon S3 작업에 대한 예는 [Athena에서 Amazon S3 버킷에 대한 크로스 계정 액세스 구성](cross-account-permissions.md)의 버킷 정책 예시를 참조하세요.
+ **Amazon S3 객체 키 대소문자 표기 방식** – Amazon S3 경로가 카멜 표기법이 아닌 소문자인지 확인합니다(예: `userId` 대신 `userid`). 또는 `ALTER TABLE ADD PARTITION`을 사용하여 객체 키 이름을 지정합니다. 자세한 내용은 이 문서의 후반부에서 [Amazon S3 경로 변경 또는 재정의](#msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path) 단원을 참조하세요.
+ **쿼리 시간 제한** – `MSCK REPAIR TABLE`은 처음으로 테이블을 만들거나 데이터와 파티션 메타 데이터 간의 패리티에 대한 불확실성이 있을 때 가장 적합합니다. `MSCK REPAIR TABLE`을 사용해 새 파티션을 자주 추가하는데(예: 날마다) 쿼리 시간 제한이 발생하는 경우 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 사용을 고려하는 것이 좋습니다.
+ **파일 시스템에서 파티션 누락** - Amazon S3에서 파티션을 수동으로 삭제한 다음 `MSCK REPAIR TABLE`을 실행하면 Partitions missing from filesystem 오류 메시지가 나타날 수 있습니다. 이는 `MSCK REPAIR TABLE`이 기한 경과된 파티션을 테이블 메타데이터를 제거하지 않았기 때문입니다. 테이블 메타데이터에서 삭제된 파티션을 제거하려면 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)을 대신 실행합니다. [SHOW PARTITIONS](show-partitions.md)는 비슷하게 파티션을 나열하지만 파일 시스템의 파티션을 제외하고 메타데이터의 파티션만 나열합니다. 
+ **"NullPointerException name is null" 오류**

  `TableType` 속성을 지정하지 않고 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 작업 또는 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 템플릿을 사용하여 Athena에서 사용할 테이블을 만든 다음 `SHOW CREATE TABLE` 또는 `MSCK REPAIR TABLE` 같은 DDL 쿼리를 실행하면, 실패: NullPointerException Name이 null임(FAILED: NullPointerException Name is null)이라는 오류 메시지가 표시될 수 있습니다.

  이 오류를 해결하려면 AWS Glue `CreateTable` API 호출 또는 [CloudFormation 템플릿](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)의 일부로 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 속성의 값을 지정하세요. `TableType`의 가능한 값은 `EXTERNAL_TABLE` 또는 `VIRTUAL_VIEW`입니다.

  이 요구 사항은 AWS Glue `CreateTable` API 작업 또는 `AWS::Glue::Table` 템플릿을 사용하여 테이블을 만들 때만 적용됩니다. DDL 문이나 AWS Glue 크롤러를 사용하여 Athena용 테이블을 생성할 경우 `TableType` 속성이 자동으로 정의됩니다.

다음 섹션에서 여러 세부 정보를 추가로 제공합니다.

### IAM 정책에서 glue:BatchCreatePartition 허용
<a name="msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy"></a>

`MSCK REPAIR TABLE` 실행을 위해 사용 중인 역할에 연결된 IAM 정책을 검토합니다. [Athena와 함께 AWS Glue Data Catalog를 사용](data-sources-glue.md)하는 경우 IAM 정책에서 `glue:BatchCreatePartition` 작업을 허용해야 합니다. `glue:BatchCreatePartition` 작업을 허용하는 IAM 정책의 예는 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 단원을 참조하세요.

### Amazon S3 경로 변경 또는 재정의
<a name="msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path"></a>

Amazon S3 경로에 있는 하나 이상의 객체 키가 소문자가 아닌 카멜 표기법으로 표시된 경우 `MSCK REPAIR TABLE`에서는 AWS Glue Data Catalog에 파티션을 추가하지 않을 수도 있습니다. 예를 들어 Amazon S3 경로에 객체 키 이름 `userId`가 포함되어 있는 경우 다음 파티션은 AWS Glue Data Catalog에 추가되지 않을 수 있습니다.

```
s3://amzn-s3-demo-bucket/path/userId=1/

s3://amzn-s3-demo-bucket/path/userId=2/

s3://amzn-s3-demo-bucket/path/userId=3/
```

이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.
+ Amazon S3 객체 키를 생성하는 경우 카멜 표기법 대신 소문자를 사용합니다.

  ```
  s3://amzn-s3-demo-bucket/path/userid=1/
  
  s3://amzn-s3-demo-bucket/path/userid=2/
  
  s3://amzn-s3-demo-bucket/path/userid=3/
  ```
+ 다음 예제와 같이 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)을 사용하여 위치를 재정의합니다.

  ```
  ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION (userId=1)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/'
  PARTITION (userId=2)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/'
  PARTITION (userId=3)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
  ```

Amazon S3 객체 키 이름은 대문자를 사용할 수 있지만 Amazon S3 버킷 이름 자체는 항상 소문자여야 합니다. 자세한 내용은 *Amazon S3 사용 설명서*의 [객체 키 명명 지침](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines) 및 [버킷 이름 지정 규칙](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)을 참조하세요.