

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

新增 Hive 相容分割區之後，請使用 `MSCK REPAIR TABLE` 命令來更新目錄中的中繼資料。

`MSCK REPAIR TABLE` 命令會掃描檔案系統（例如 Amazon S3），以查找在建立資料表後新增到檔案系統的 Hive 相容分隔區。`MSCK REPAIR TABLE` 會比較資料表中繼資料中的分割區和 S3 中的分割區。如果您在建立資料表時指定的 S3 位置有新的分割區，它會將這些分割區新增至中繼資料和 Athena 資料表中。

當您新增實體分割區時，目錄中的中繼資料會變得與檔案系統中的資料配置不一致，而且需要將新分割區的相關資訊新增至目錄。若要更新中繼資料，請執行 `MSCK REPAIR TABLE`，如此可讓您從 Athena 查詢新分割區中的資料。

**注意**  
`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 中，當在包含的資料表上執行 `MSCK REPAIR TABLE` 查詢時，使用其他通訊協定的位置 (例如 `s3a://bucket/folder/`) 會導致查詢失敗。
+ 由於 `MSCK REPAIR TABLE` 會同時掃描資料夾及其子資料夾，以尋找相符的分割區配置，請務必將個別資料表的資料留在不同的資料夾階層中。例如，假設您在 `s3://amzn-s3-demo-bucket1` 中有資料表 1 的資料，在 `s3://amzn-s3-demo-bucket1/table-2-data` 中有資料表 2 的資料。如果兩個資料表都以字串分割，`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` 不會新增以底線 (\$1) 開頭的分割區資料欄名稱。若要解決此限制，請使用 [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`，則您可能會收到錯誤訊息檔案系統中遺失分割區。這是因為 `MSCK REPAIR TABLE` 不會從資料表中繼資料中移除過時的分割區。若要從資料表中繼資料移除已刪除的分割區，請改為執行 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。請注意，[SHOW PARTITIONS](show-partitions.md) 同樣地只會列出中繼資料中的分割區，而不會列出檔案系統中的分割區。
+ **"NullPointerException name is null" (NullPointerException 名稱為 null) 錯誤**

  如果您使用 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 中使用，而不指定 `TableType` 屬性，然後執行 DDL 查詢，例如 `SHOW CREATE TABLE`或 `MSCK REPAIR TABLE`，您可以收到錯誤訊息 FAILED：NullPointerException Name 為 null。

  若要解決錯誤，請在 API 呼叫或[CloudFormation 範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)中 AWS Glue `CreateTable`指定 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 屬性的值。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

  此要求僅適用於使用 `CreateTable` API AWS Glue 操作或 `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 政策。當您[AWS Glue Data Catalog 搭配 Athena 使用 ](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)。