すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:データメンテナンス

最終更新日:Sep 23, 2026

OSS Tables は、クエリパフォーマンスの最適化とストレージコストの削減のため、コンパクション、スナップショット管理、参照されていないファイルのクリーンアップを自動的に実行します。外部コンピューティングリソースは不要です。

自動メンテナンスは、異なるリソースレベルで 3 つのタスクを実行します。

  • 参照されていないファイルのクリーンアップ :バケットレベルで設定します。テーブルスナップショットによって参照されなくなったオブジェクトを自動的に特定し、削除します。

  • コンパクション :テーブルレベルで設定します。小さなファイルを大きなファイルにマージすることで、クエリパフォーマンスを向上させます。

  • スナップショット管理 :テーブルレベルで設定します。期限切れのスナップショットを自動的にクリーンアップし、メタデータファイルとストレージオーバーヘッドを削減します。

バケットまたはテーブルを作成する際には、以下のデフォルト設定が適用されます。

メンテナンス機能

設定レベル

パラメーター

デフォルト

参照されていないファイルのクリーンアップ

バケットレベル

ステータス

有効

unreferencedDays

3

nonCurrentDays

10

コンパクション

テーブルレベル

ステータス

有効

targetFileSizeMB

512

strategy

auto

スナップショット管理

テーブルレベル

ステータス

有効

maxSnapshotAgeHours

120

minSnapshotsToKeep

1

サービスリンクロール

バックグラウンドサービスが、OSS Tables の自動メンテナンス (コンパクション、参照されていないファイルのクリーンアップ、スナップショット管理) を実行します。このサービスは、サービスリンクロール AliyunServiceRoleForOssTableMaintenance を使用してテーブルバケットにアクセスします。

権限付与

初めて OSS コンソールの テーブルバケット ページを開いたときに、サービスリンクロールが作成されていない場合は、Insufficient permission: AliyunServiceRoleForOssTableMaintenance という通知が表示されます。[今すぐ作成] をクリックしてロールを作成します。ロールが作成されると、バックグラウンドメンテナンスサービスが自動的に開始されます。

説明

RAM ユーザーの場合、サービスリンクロールを作成する権限があることを確認してください。RAM ユーザーに次のポリシーをアタッチしてください:

{
  "Version": "1",
  "Statement": [
    {
      "Action": "ram:CreateServiceLinkedRole",
      "Resource": "*",
      "Effect": "Allow",
      "Condition": {
        "StringEquals": {
          "ram:ServiceName": "tablemaintenance.oss.aliyuncs.com"
        }
      }
    }
  ]
}

権限

権限ポリシー (AliyunServiceRolePolicyForOssTableMaintenance) は、次の権限を付与します:

アクション

説明

oss:GetTableBucketMaintenanceConfiguration

バケットレベルのメンテナンス設定の読み取り

oss:GetTableMaintenanceConfiguration

テーブルレベルのメンテナンス設定の読み取り

oss:ListTableBuckets

テーブルバケットの一覧表示

oss:GetTableBucket

テーブルバケット情報の取得

oss:ListTables

テーブルの一覧表示

oss:GetTable

テーブル情報の取得

oss:GetTableData

テーブルデータファイルの読み取り (コンパクションとクリーンアップを実行するために)

oss:PutTableData

テーブルデータファイルの書き込み (コンパクション後に新しいファイルを生成するために)

oss:GetTableMetadataLocation

メタデータファイルの場所の取得

oss:UpdateTableMetadataLocation

メタデータファイルの場所の更新 (メンテナンス後の変更をコミットするために)

未参照ファイルのクリーンアップ

未参照ファイルのクリーンアップは、テーブルバケット内のすべてのテーブルに適用される バケットレベル の最適化です。テーブルスナップショットによって参照されなくなったデータファイル (Parquet、Avro、または ORC) を削除します。このような孤立したファイルは、失敗した書き込みジョブや期限切れのスナップショットから蓄積され、不要なストレージを消費する可能性があります。

重要

有効にすると、未参照ファイルのクリーンアップは、テーブルバケット内のどのテーブルにも属していない Parquet、Avro、または ORC ファイルも削除します。

クリーンアップは 2 段階のプロセスを使用します。ファイルはまず非現行としてマークされ (unreferencedDays によって制御)、その後、指定された期間非現行のままである場合に削除されます (nonCurrentDays によって制御)。

設定パラメーター:

パラメーター

説明

値

デフォルト

status

未参照ファイルのクリーンアップを有効または無効にします。

enabled または disabled。

enabled

unreferencedDays

未参照ファイルを非現行としてマークするまでの日数。

1 ~ 2147483647。

3

nonCurrentDays

非現行ファイルを削除するまでの日数。

1 ~ 2147483647。

10

コンソール

OSS コンソールでテーブルバケットのメンテナンス設定を表示および変更します。

次の手順に従ってください。

  1. OSS コンソール にログオンします。左側のナビゲーションペインで、Table Bucket 一覧 を選択します。

  2. テーブルバケットの名前をクリックして、詳細ページを開きます。

  3. [データメンテナンス] タブを選択します。

  4. [未参照ファイルのクリーンアップ] セクションで、現在の設定を表示します。

    • [ステータス]:機能が有効かどうか。

    • [未参照日数]:未参照ファイルを非現行としてマークするまでの日数。デフォルト: 3。

    • 非現行バージョンの経過日数:非現行ファイルを削除するまでの日数。デフォルト: 10。

  5. [編集] をクリックし、未参照ファイルのクリーンアップのパラメーターを変更してから、[OK] をクリックします。

ossutil

ossutil を使用して、未参照ファイルのクリーンアップ設定を変更します。

ossutil tables-api put-table-bucket-maintenance-configuration \
  --table-bucket-arn {ARN} \
  --type icebergUnreferencedFileRemoval \
  --value '{"status":"enabled","settings":{"icebergUnreferencedFileRemoval":{"unreferencedDays":5,"nonCurrentDays":15}}}'

SDK

SDK を使用して、未参照ファイルのクリーンアップ設定を照会または変更します。

Python

未参照ファイルのクリーンアップ設定を照会します。

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="テーブルバケットメンテナンス設定取得サンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables へのアクセスに使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    result = client.get_table_bucket_maintenance_configuration(
        oss_tables.models.GetTableBucketMaintenanceConfigurationRequest(
            table_bucket_arn=args.table_bucket_arn,
        )
    )

    print(f'ステータスコード: {result.status_code}, '
          f'リクエスト ID: {result.request_id}, '
          f'テーブルバケット ARN: {result.table_bucket_arn}, '
          f'設定: {result.configuration}')


if __name__ == "__main__":
    main()

未参照ファイルのクリーンアップ設定を変更します。

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="テーブルバケットメンテナンス設定更新サンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables へのアクセスに使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--type', help='メンテナンスタイプ (例: icebergUnreferencedFileRemoval)。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    value = {
        'status': 'enabled',
        'settings': {
            'icebergUnreferencedFileRemoval': {
                'unreferencedDays': 7,
                'nonCurrentDays': 30
            }
        }
    }

    result = client.put_table_bucket_maintenance_configuration(
        oss_tables.models.PutTableBucketMaintenanceConfigurationRequest(
            table_bucket_arn=args.table_bucket_arn,
            type=args.type,
            value=value,
        )
    )

    print(f'ステータスコード: {result.status_code}, '
          f'リクエスト ID: {result.request_id}')
    print(f'メンテナンス設定が正常に更新されました: {args.table_bucket_arn}')


if __name__ == "__main__":
    main()

Go

未参照ファイルのクリーンアップ設定を照会します。

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
)

func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}

func main() {
	flag.Parse()
	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター。テーブルバケット ARN が必要です")
	}

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター。リージョンが必要です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)

	result, err := client.GetTableBucketMaintenanceConfiguration(context.TODO(), &tables.GetTableBucketMaintenanceConfigurationRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
	})

	if err != nil {
		log.Fatalf("テーブルバケットメンテナンス設定の取得に失敗しました %v", err)
	}

	log.Printf("テーブルバケットメンテナンス設定取得結果: %#v\n", result)
}

未参照ファイルのクリーンアップ設定を変更します。

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
)

func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}

func main() {
	flag.Parse()
	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター。テーブルバケット ARN が必要です")
	}

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター。リージョンが必要です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)

	result, err := client.PutTableBucketMaintenanceConfiguration(context.TODO(), &tables.PutTableBucketMaintenanceConfigurationRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
		Type:           oss.Ptr("icebergUnreferencedFileRemoval"),
		Value: &tables.MaintenanceValue{
			Settings: &tables.MaintenanceSettings{
				IcebergUnreferencedFileRemoval: &tables.SettingsDetail{
					UnreferencedDays: oss.Ptr(4),
					NonCurrentDays:   oss.Ptr(10),
				},
			},
			Status: oss.Ptr("enabled"),
		},
	})

	if err != nil {
		log.Fatalf("テーブルバケットメンテナンス設定の更新に失敗しました %v", err)
	}

	log.Printf("テーブルバケットメンテナンス設定更新結果: %#v\n", result)
}

Java

未参照ファイルのクリーンアップ設定を照会します。

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class GetTableBucketMaintenanceConfigurationSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            GetTableBucketMaintenanceConfigurationRequest request = GetTableBucketMaintenanceConfigurationRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .build();

            GetTableBucketMaintenanceConfigurationResult result = client.getTableBucketMaintenanceConfiguration(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブルバケットのメンテナンス設定を正常に取得しました: %s%n", tableBucketARN);
            System.out.printf("テーブルバケット ARN: %s%n", result.tableBucketARN());

            result.configuration().forEach((key, value) -> {
                System.out.printf("設定タイプ: %s、ステータス: %s%n", key, value.status());
            });
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

未参照ファイルのクリーンアップ設定を変更します。

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class PutTableBucketMaintenanceConfigurationSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
        String type = "icebergUnreferencedFileRemoval";
        String status = "enabled";
        int unreferencedDays = 3;
        int nonCurrentDays = 3;

        IcebergUnreferencedFileRemovalSettings removalSettings = IcebergUnreferencedFileRemovalSettings.newBuilder()
                .unreferencedDays(unreferencedDays)
                .nonCurrentDays(nonCurrentDays)
                .build();

        TableBucketMaintenanceSettings settings = TableBucketMaintenanceSettings.newBuilder()
                .icebergUnreferencedFileRemoval(removalSettings)
                .build();

        TableBucketMaintenanceConfigurationValue value = TableBucketMaintenanceConfigurationValue.newBuilder()
                .status(status)
                .settings(settings)
                .build();

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            PutTableBucketMaintenanceConfigurationRequest request = PutTableBucketMaintenanceConfigurationRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .type(type)
                    .value(value)
                    .build();

            PutTableBucketMaintenanceConfigurationResult result = client.putTableBucketMaintenanceConfiguration(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブルバケットのメンテナンスを正常に設定しました: %s%n", tableBucketARN);
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

API

次の API を使用します。

コンパクション

コンパクションは、テーブルレベルの最適化です。 Apache Iceberg テーブルへの頻繁なストリーミングや小バッチ書き込みは、多数の小さなファイルを生成する可能性があり、クエリパフォーマンスを低下させます。コンパクションは、小さなファイルをターゲットサイズに近い大きなファイルにマージすることで、ファイル数とメタデータのオーバーヘッドを削減します。

設定パラメーター:

パラメーター

説明

値

デフォルト

status

自動コンパクションを有効または無効にします。

enabled または disabled

enabled

targetFileSizeMB

コンパクション後のターゲットファイルサイズ (MB) です。この値より小さいファイルがマージされます。

1 から 2147483647。

512

strategy

ファイルの結合方法とソート方法を決定するコンパクション戦略です。

auto、binpack、sort、または z-order。このパラメーターを sort または z-order に設定する場合、テーブルのメタデータでソート順を定義する必要があります。

auto

利用可能な戦略:

  • auto:システムが最適なコンパクション戦略を自動的に選択します。ソート順が定義されているテーブルには sort 戦略を適用し、定義されていないテーブルには binpack 戦略を適用します。

  • binpack:データの順序を変更せずに、ファイルサイズのみに基づいてファイルをマージします。これは最も高速な戦略であり、データのソートが不要な場合に適しています。

  • sort:テーブルで定義されたソート順に基づいてデータをソートおよびマージします。この戦略は、範囲クエリのシナリオに適しています。テーブルのメタデータでソート順を定義する必要があります。

  • z-order:Z オーダー曲線を使用して、複数の列にまたがるデータを同時にソートおよびマージします。この戦略は、多次元クエリのシナリオに適しています。テーブルのメタデータでソート順を定義する必要があります。

コンパクションの表示と設定:

コンソール

[データメンテナンス] タブでコンパクション設定を表示および変更します。

  1. OSS コンソールにログインします。左側メニューで、Table Bucket 一覧 を選択します。

  2. ターゲットのテーブルバケットの名前をクリックします。[テーブル一覧] で、ターゲットテーブルの名前をクリックしてテーブル詳細ページを開きます。

  3. [データメンテナンス] タブを選択します。

  4. [コンパクション] セクションで、現在の設定を表示します:

    • ステータス:自動コンパクションが有効かどうか。

    • ターゲットファイルサイズ:コンパクション後の各ファイルのターゲットサイズ。デフォルト:512 MB。

    • [コンパクション戦略]:アクティブなコンパクション戦略。デフォルト:auto。

    • ジョブステータス:最後のコンパクションジョブのステータスとタイムスタンプ。

  5. [編集] をクリックし、コンパクションのパラメーターを変更してから、[OK] をクリックします。

ossutil

ossutil を使用してコンパクション設定を変更します:

ossutil tables-api put-table-maintenance-configuration \
  --table-bucket-arn {ARN} \
  --namespace mynamespace \
  --name mytable \
  --type icebergCompaction \
  --value '{"status":"enabled","settings":{"icebergCompaction":{"targetFileSizeMB":256,"strategy":"binpack"}}}'

SDK

SDK を使用してコンパクション設定をクエリおよび変更します。

Python

コンパクション設定をクエリします:

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="get table maintenance configuration sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    result = client.get_table_maintenance_configuration(
        oss_tables.models.GetTableMaintenanceConfigurationRequest(
            table_bucket_arn=args.table_bucket_arn,
            namespace=args.namespace,
            name=args.name,
        )
    )

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' table arn: {result.table_arn},'
          f' configuration: {result.configuration}')


if __name__ == "__main__":
    main()

コンパクション設定を変更します:

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="put table maintenance configuration sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)
parser.add_argument('--type', help='メンテナンスタイプ。例: icebergCompaction。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    value = {
        'status': 'enabled',
        'settings': {
            'icebergCompaction': {
                'targetFileSizeMB': 512,
                'strategy': 'auto'
            }
        }
    }

    result = client.put_table_maintenance_configuration(
        oss_tables.models.PutTableMaintenanceConfigurationRequest(
            table_bucket_arn=args.table_bucket_arn,
            namespace=args.namespace,
            name=args.name,
            type=args.type,
            value=value,
        )
    )

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id}')
    print(f'successfully updated maintenance configuration for: {args.namespace}/{args.name}')


if __name__ == "__main__":
    main()

Go

コンパクション設定をクエリします:

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
	namespace      string
	name           string
)

func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
	flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
	flag.StringVar(&name, "name", "", "テーブルの名前。")
}

func main() {
	flag.Parse()

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンが必要です")
	}

	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
	}

	if len(namespace) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。名前空間名が必要です")
	}

	if len(name) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブル名が必要です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)

	result, err := client.GetTableMaintenanceConfiguration(context.TODO(), &tables.GetTableMaintenanceConfigurationRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
		Namespace:      oss.Ptr(namespace),
		Name:           oss.Ptr(name),
	})

	if err != nil {
		log.Fatalf("テーブルメンテナンス設定の取得に失敗しました %v", err)
	}

	log.Printf("テーブルメンテナンス設定の取得結果: %#v\n", result)
}

コンパクション設定を変更します:

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
	namespace      string
	name           string
)

func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
	flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
	flag.StringVar(&name, "name", "", "テーブルの名前。")
}

func main() {
	flag.Parse()

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンが必要です")
	}

	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
	}

	if len(namespace) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。名前空間名が必要です")
	}

	if len(name) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブル名が必要です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)

	// icebergCompaction タイプ
	result, err := client.PutTableMaintenanceConfiguration(context.TODO(), &tables.PutTableMaintenanceConfigurationRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
		Namespace:      oss.Ptr(namespace),
		Name:           oss.Ptr(name),
		Type:           oss.Ptr("icebergCompaction"),
		Value: &tables.TableMaintenanceValue{
			Status: oss.Ptr("enabled"),
			Settings: &tables.TableMaintenanceSettings{
				IcebergCompaction: &tables.IcebergCompactionSettingsDetail{
					TargetFileSizeMB: oss.Ptr(400),
					Strategy:         oss.Ptr("auto"),
				},
			},
		},
	})

	// icebergSnapshotManagement タイプ
	//result, err := client.PutTableMaintenanceConfiguration(context.TODO(), &tables.PutTableMaintenanceConfigurationRequest{
	//	TableBucketARN: oss.Ptr(tableBucketArn),
	//	Namespace:      oss.Ptr(namespace),
	//	Name:           oss.Ptr(name),
	//	Type:           oss.Ptr("icebergSnapshotManagement"),
	//	Value: &tables.TableMaintenanceValue{
	//		Status: oss.Ptr("enabled"),
	//		Settings: &tables.TableMaintenanceSettings{
	//			IcebergSnapshotManagement: &tables.IcebergSnapshotManagementSettingsDetail{
	//				MaxSnapshotAgeHours: oss.Ptr(350),
	//				MinSnapshotsToKeep:  oss.Ptr(1),
	//			},
	//		},
	//	},
	//})

	if err != nil {
		log.Fatalf("テーブルメンテナンス設定の適用に失敗しました %v", err)
	}

	log.Printf("テーブルメンテナンス設定の適用結果: %#v\n", result)
}

Java

コンパクション設定をクエリします:

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class GetTableMaintenanceConfigurationSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
        String namespace = "mynamespace";
        String name = "mytable";

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            GetTableMaintenanceConfigurationRequest request = GetTableMaintenanceConfigurationRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .namespace(namespace)
                    .name(name)
                    .build();

            GetTableMaintenanceConfigurationResult result = client.getTableMaintenanceConfiguration(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブル ARN: %s%n", result.tableARN());

            if (result.configuration() != null && !result.configuration().isEmpty()) {
                System.out.println("メンテナンス設定:");
                result.configuration().forEach((type, config) -> {
                    System.out.printf("  タイプ: %s, ステータス: %s%n", type, config.status());
                    if (config.settings() != null) {
                        if (config.settings().icebergCompaction() != null) {
                            System.out.printf("    コンパクション - TargetFileSizeMB: %d, 戦略: %s%n",
                                    config.settings().icebergCompaction().targetFileSizeMB(),
                                    config.settings().icebergCompaction().strategy());
                        }
                        if (config.settings().icebergSnapshotManagement() != null) {
                            System.out.printf("    スナップショット管理 - MinSnapshotsToKeep: %d, MaxSnapshotAgeHours: %d%n",
                                    config.settings().icebergSnapshotManagement().minSnapshotsToKeep(),
                                    config.settings().icebergSnapshotManagement().maxSnapshotAgeHours());
                        }
                    }
                });
            } else {
                System.out.println("メンテナンス設定が見つかりません。");
            }
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

コンパクション設定を変更します:

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class PutTableMaintenanceConfigurationSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
        String namespace = "mynamespace";
        String name = "mytable";
        String type = "icebergCompaction";
        String status = "enabled";
        int targetFileSizeMB = 256;
        String strategy = "auto";

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            IcebergCompactionSettings compactionSettings = IcebergCompactionSettings.newBuilder()
                    .targetFileSizeMB(targetFileSizeMB)
                    .strategy(strategy)
                    .build();
            TableMaintenanceSettings settings = TableMaintenanceSettings.newBuilder()
                    .icebergCompaction(compactionSettings)
                    .build();

            TableMaintenanceConfigurationValue value = TableMaintenanceConfigurationValue.newBuilder()
                    .status(status)
                    .settings(settings)
                    .build();

            PutTableMaintenanceConfigurationRequest request = PutTableMaintenanceConfigurationRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .namespace(namespace)
                    .name(name)
                    .type(type)
                    .value(value)
                    .build();

            PutTableMaintenanceConfigurationResult result = client.putTableMaintenanceConfiguration(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブル %s/%s のメンテナンス設定 (タイプ: %s) を正常に設定しました%n", namespace, name, type);
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

API

API 操作:

スナップショット管理

スナップショット管理は、テーブルレベルの最適化です。Apache Iceberg テーブルへの各書き込みでスナップショットが作成されます。時間が経つにつれて、蓄積されたスナップショットはストレージを消費し、メタデータオーバーヘッドを増加させます。スナップショット管理は、データの安全性を維持しながら、期限切れのスナップショットを自動的にクリーンアップしてコストを削減します。

minSnapshotsToKeep と maxSnapshotAgeHours が競合する場合、システムはデータ復旧機能を維持するために、最小数のスナップショットの保持を優先します。

設定パラメーター:

パラメーター

説明

値

デフォルト

status

スナップショット管理を有効または無効にします。

enabled または disabled。

enabled

maxSnapshotAgeHours

スナップショットの最大保持期間 (時間) です。この期間を過ぎたスナップショットは削除されます。

1~2147483647。

120

minSnapshotsToKeep

最大保持期間を超えても保持する最小スナップショット数です。

1~2147483647。

1

スナップショット管理の表示と設定:

コンソール

[データメンテナンス] タブでスナップショット管理の設定を表示および変更します。

  1. OSS コンソールにログインします。左側のナビゲーションペインで、Table Bucket 一覧 を選択します。

  2. 対象のテーブルバケットの名前をクリックします。[テーブルリスト] で、対象のテーブルの名前をクリックします。

  3. [データメンテナンス] タブを選択します。

  4. [スナップショット管理] セクションで、現在の設定を表示します:

    • ステータス:スナップショット管理が有効かどうかを示します。

    • [最大スナップショット保持期間 (時間)]:スナップショットの最大保持期間です。デフォルト:120 時間。

    • 保持する最小スナップショット数:最大保持期間を超えても保持する最小スナップショット数です。デフォルト:1。

    • ジョブステータス:最新のスナップショットクリーンアップジョブのステータスとタイムスタンプです。

  5. [編集] をクリックしてスナップショット管理のパラメーターを変更し、[OK] をクリックします。

ossutil

ossutil を使用してスナップショット管理の設定を変更します:

ossutil tables-api put-table-maintenance-configuration \
  --table-bucket-arn {ARN} \
  --namespace mynamespace \
  --name mytable \
  --type icebergSnapshotManagement \
  --value '{"status":"enabled","settings":{"icebergSnapshotManagement":{"maxSnapshotAgeHours":72,"minSnapshotsToKeep":3}}}'

SDK

SDK を使用してスナップショット管理の設定をクエリおよび変更します。スナップショット管理とコンパクションは、同じ API である GetTableMaintenanceConfiguration と PutTableMaintenanceConfiguration を共有します。

Python

スナップショット管理の設定をクエリします:

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="get table maintenance configuration sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    result = client.get_table_maintenance_configuration(
        oss_tables.models.GetTableMaintenanceConfigurationRequest(
            table_bucket_arn=args.table_bucket_arn,
            namespace=args.namespace,
            name=args.name,
        )
    )

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' table arn: {result.table_arn},'
          f' configuration: {result.configuration}')


if __name__ == "__main__":
    main()

スナップショット管理の設定を変更します:

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="put table maintenance configuration sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)
parser.add_argument('--type', help='メンテナンスタイプ。例:icebergSnapshotManagement。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    value = {
        'status': 'enabled',
        'settings': {
            'icebergSnapshotManagement': {
                'maxSnapshotAgeHours': 72,
                'minSnapshotsToKeep': 3
            }
        }
    }

    result = client.put_table_maintenance_configuration(
        oss_tables.models.PutTableMaintenanceConfigurationRequest(
            table_bucket_arn=args.table_bucket_arn,
            namespace=args.namespace,
            name=args.name,
            type=args.type,
            value=value,
        )
    )

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id}')
    print(f'successfully updated maintenance configuration for: {args.namespace}/{args.name}')


if __name__ == "__main__":
    main()

Go

スナップショット管理の設定をクエリします:

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
	namespace      string
	name           string
)

func init() {
	flag.StringVar(&region, "region", "", "テーブルバケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
	flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
	flag.StringVar(&name, "name", "", "テーブルの名前。")
}

func main() {
	flag.Parse()

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンが必要です")
	}

	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
	}

	if len(namespace) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。名前空間名が必要です")
	}

	if len(name) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブル名が必要です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)

	result, err := client.GetTableMaintenanceConfiguration(context.TODO(), &tables.GetTableMaintenanceConfigurationRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
		Namespace:      oss.Ptr(namespace),
		Name:           oss.Ptr(name),
	})

	if err != nil {
		log.Fatalf("テーブルメンテナンス設定の取得に失敗しました %v", err)
	}

	log.Printf("テーブルメンテナンス設定の取得結果: %#v\n", result)
}

スナップショット管理の設定を変更します:

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
	namespace      string
	name           string
)

func init() {
	flag.StringVar(&region, "region", "", "テーブルバケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
	flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
	flag.StringVar(&name, "name", "", "テーブルの名前。")
}

func main() {
	flag.Parse()

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンが必要です")
	}

	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
	}

	if len(namespace) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。名前空間名が必要です")
	}

	if len(name) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブル名が必要です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)



	// icebergSnapshotManagement タイプ
	result, err := client.PutTableMaintenanceConfiguration(context.TODO(), &tables.PutTableMaintenanceConfigurationRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
		Namespace:      oss.Ptr(namespace),
		Name:           oss.Ptr(name),
		Type:           oss.Ptr("icebergSnapshotManagement"),
		Value: &tables.TableMaintenanceValue{
			Status: oss.Ptr("enabled"),
			Settings: &tables.TableMaintenanceSettings{
				IcebergSnapshotManagement: &tables.IcebergSnapshotManagementSettingsDetail{
					MaxSnapshotAgeHours: oss.Ptr(350),
					MinSnapshotsToKeep:  oss.Ptr(1),
				},
			},
		},
	})

	if err != nil {
		log.Fatalf("テーブルメンテナンス設定の適用に失敗しました %v", err)
	}

	log.Printf("テーブルメンテナンス設定の適用結果: %#v\n", result)
}

Java

スナップショット管理の設定をクエリします:

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class GetTableMaintenanceConfigurationSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
        String namespace = "mynamespace";
        String name = "mytable";

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            GetTableMaintenanceConfigurationRequest request = GetTableMaintenanceConfigurationRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .namespace(namespace)
                    .name(name)
                    .build();

            GetTableMaintenanceConfigurationResult result = client.getTableMaintenanceConfiguration(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブル ARN: %s%n", result.tableARN());

            if (result.configuration() != null && !result.configuration().isEmpty()) {
                System.out.println("メンテナンス設定:");
                result.configuration().forEach((type, config) -> {
                    System.out.printf("  タイプ: %s, ステータス: %s%n", type, config.status());
                    if (config.settings() != null) {
                        if (config.settings().icebergCompaction() != null) {
                            System.out.printf("    コンパクション - TargetFileSizeMB: %d, 戦略: %s%n",
                                    config.settings().icebergCompaction().targetFileSizeMB(),
                                    config.settings().icebergCompaction().strategy());
                        }
                        if (config.settings().icebergSnapshotManagement() != null) {
                            System.out.printf("    スナップショット管理 - MinSnapshotsToKeep: %d, MaxSnapshotAgeHours: %d%n",
                                    config.settings().icebergSnapshotManagement().minSnapshotsToKeep(),
                                    config.settings().icebergSnapshotManagement().maxSnapshotAgeHours());
                        }
                    }
                });
            } else {
                System.out.println("メンテナンス設定が見つかりません。");
            }
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

スナップショット管理の設定を変更します:

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class PutTableMaintenanceConfigurationSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
        String namespace = "mynamespace";
        String name = "mytable";
        String type = "icebergSnapshotManagement";
        String status = "enabled";
        int maxSnapshotAgeHours = 72;
        int minSnapshotsToKeep = 3;

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            IcebergSnapshotManagementSettings snapshotManagementSettings = IcebergSnapshotManagementSettings.newBuilder()
                    .maxSnapshotAgeHours(maxSnapshotAgeHours)
                    .minSnapshotsToKeep(minSnapshotsToKeep)
                    .build();
            TableMaintenanceSettings settings = TableMaintenanceSettings.newBuilder()
                    .icebergSnapshotManagement(snapshotManagementSettings)
                    .build();

            TableMaintenanceConfigurationValue value = TableMaintenanceConfigurationValue.newBuilder()
                    .status(status)
                    .settings(settings)
                    .build();

            PutTableMaintenanceConfigurationRequest request = PutTableMaintenanceConfigurationRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .namespace(namespace)
                    .name(name)
                    .type(type)
                    .value(value)
                    .build();

            PutTableMaintenanceConfigurationResult result = client.putTableMaintenanceConfiguration(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブル %s/%s のメンテナンス設定 (タイプ: %s) を正常に設定しました%n", namespace, name, type);
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

API

API 操作:

ランタイムメカニズム

  • スケジューリング:バックエンドは、メンテナンス タスクを自動的にスケジューリングします。タスクは通常、テーブルごとに 24 時間に 1 回実行されますが、固定されたスケジュールには従いません。システム負荷が高い場合、遅延が発生する可能性があります。

  • リソース使用量:メンテナンス タスクは、お客様のスループットや QPS クォータを消費せず、本番ワークロードに影響を与えません。

  • トランザクション分離:メンテナンス タスクは Iceberg スナップショット分離を使用します。同時読み取りおよび書き込みは影響を受けずに継続し、クエリエンジンは自動的に最新の有効なスナップショットを選択します。

メンテナンスジョブステータスの確認

コンパクション、スナップショット管理、参照されていないファイルのクリーンアップジョブのステータスを確認します。各ジョブタイプは個別にステータスを報告します。

コンソール

[データメンテナンス] タブで、各メンテナンスタイプの [ジョブステータス] を確認します。

  1. OSS コンソールにログオンします。左側のナビゲーションペインで、Table Bucket 一覧を選択します。

  2. 対象のテーブルバケットの名前をクリックします。[テーブル一覧] で、テーブル名をクリックして詳細ページを開きます。

  3. [データメンテナンス] タブをクリックします。

  4. 各メンテナンスセクションで、[ジョブステータス] を確認します。

    • [コンパクション]:実行ステータス (失敗または成功) と最終実行タイムスタンプ。

    • [スナップショット管理]:スナップショットクリーンアップジョブの実行ステータスと最終実行タイムスタンプ。

    • [参照されていないファイルのクリーンアップ]:テーブルバケットレベルで設定されます。[テーブルバケットで設定を編集] をクリックして、テーブルバケットの [データメンテナンス] ページでステータスを確認します。

Ossutil

ossutil tables-api get-table-maintenance-job-status \
  --table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket \
  --namespace mynamespace \
  --name mytable

SDK

Python

import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables

parser = argparse.ArgumentParser(description="テーブルメンテナンスジョブステータス取得サンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables へのアクセスに使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss_tables.Client(cfg)

    result = client.get_table_maintenance_job_status(
        oss_tables.models.GetTableMaintenanceJobStatusRequest(
            table_bucket_arn=args.table_bucket_arn,
            namespace=args.namespace,
            name=args.name,
        )
    )

    print(f'ステータスコード: {result.status_code},'
          f' リクエスト ID: {result.request_id},'
          f' テーブル ARN: {result.table_arn},'
          f' ステータス: {result.status}')


if __name__ == "__main__":
    main()

Go

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)

var (
	region         string
	tableBucketArn string
	namespace      string
	name           string
)

func init() {
	flag.StringVar(&region, "region", "", "テーブルバケットが配置されているリージョン。")
	flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
	flag.StringVar(&namespace, "namespace", "", "テーブルの名前空間。")
	flag.StringVar(&name, "name", "", "テーブルの名前。")
}

func main() {
	flag.Parse()

	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。リージョンは必須です")
	}

	if len(tableBucketArn) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブルバケット ARN は必須です")
	}

	if len(namespace) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。名前空間名は必須です")
	}

	if len(name) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーターです。テーブル名は必須です")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := tables.NewTablesClient(cfg)

	result, err := client.GetTableMaintenanceJobStatus(context.TODO(), &tables.GetTableMaintenanceJobStatusRequest{
		TableBucketARN: oss.Ptr(tableBucketArn),
		Namespace:      oss.Ptr(namespace),
		Name:           oss.Ptr(name),
	})

	if err != nil {
		log.Fatalf("テーブルメンテナンスジョブステータスの取得に失敗しました %v", err)
	}

	log.Printf("テーブルメンテナンスジョブステータス取得結果:%#v\n", result)
}

Java

import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;

public class GetTableMaintenanceJobStatusSample {

    public static void main(String[] args) throws Exception {
        String region = "cn-hangzhou";
        String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
        String namespace = "mynamespace";
        String name = "mytable";

        try (OSSTablesClient client = OSSTablesClient.newBuilder()
                .credentialsProvider(new EnvironmentVariableCredentialsProvider())
                .region(region)
                .build()) {
            GetTableMaintenanceJobStatusRequest request = GetTableMaintenanceJobStatusRequest.newBuilder()
                    .tableBucketARN(tableBucketARN)
                    .namespace(namespace)
                    .name(name)
                    .build();

            GetTableMaintenanceJobStatusResult result = client.getTableMaintenanceJobStatus(request);

            System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
                    result.statusCode(), result.requestId());
            System.out.printf("テーブル ARN: %s%n", result.tableARN());

            if (result.jobStatus() != null && !result.jobStatus().isEmpty()) {
                System.out.println("メンテナンスジョブステータス:");
                result.jobStatus().forEach((type, status) -> {
                    System.out.printf("  Type: %s, Status: %s%n", type, status.status());
                    if (status.lastRunTimestamp() != null) {
                        System.out.printf("    LastRunTimestamp: %s%n", status.lastRunTimestamp());
                    }
                    if (status.failureMessage() != null && !status.failureMessage().isEmpty()) {
                        System.out.printf("    FailureMessage: %s%n", status.failureMessage());
                    }
                });
            } else {
                System.out.println("メンテナンスジョブステータスが見つかりません。");
            }
        } catch (Exception e) {
            System.out.println("エラー: " + e.getMessage());
        }
    }
}

API

GetTableMaintenanceJobStatus を呼び出して、メンテナンスジョブステータスを照会します。