全部产品
Search
文档中心

表格存储:创建全局表

更新时间:Apr 29, 2026

通过 Java SDK调用 createGlobalTable 接口,在表格存储中创建跨地域全局表,实现数据多地域复制。

使用说明

创建全局表前,先根据业务场景选择服务模式:

  • 主备模式PRIMARY_SECONDARY):主地域可读写,备地域只读。数据由主地域单向同步至备地域。适用于本地读取、容灾备份、异地热备场景。

  • 多活模式PEER_TO_PEER):所有地域均可读写。基于最后写入者获胜原则(LWW)按行或列解决写入冲突。适用于多地域低延迟读写场景。

创建请求成功后,系统以异步方式同步数据。调用 DescribeGlobalTable 查看状态,返回 active 时表示全局表创建完成。

前提条件

  • 在源地域和目标地域分别创建实例。

  • 在源地域创建数据表,并按以下要求配置:数据生命周期(TTL)设为 -1(永不过期)、最大版本数设为 1、最大版本偏差设为无限制(Integer.MAX_VALUE)、开启行版本(updateFullRow 设为 True)。

    重要

    开启行版本后存在以下限制:

    • 单行数据最多支持 256 列。

    • 写入数据时不支持手动指定版本号,版本号由系统自动生成。

    • 执行 Update 操作时,系统需先读取当前行版本,因此会带来少量额外读取负载。

  • 初始化客户端

    重要

    使用RAM用户的AccessKey初始化客户端时,需确保该RAM用户具有创建全局表的相关权限。具体 Action 定义请参见表格存储的API类型

方法说明

public CreateGlobalTableResponse createGlobalTable(CreateGlobalTableRequest createGlobalTableRequest) throws TableStoreException, ClientException

CreateGlobalTableRequest 参数说明

  • baseTable(必选)BaseTable:基础表信息,写操作默认作用于基础表。包含以下参数。

    名称

    类型

    说明

    regionId(必选)

    String

    地域 ID,例如 cn-hangzhou。

    instanceName(必选)

    String

    实例名称。

    tableName(必选)

    String

    基础表名称,同时也是全局表名称。

  • placements(必选)List<Placement>:关联表的分布位置配置列表。包含以下参数。

    名称

    类型

    说明

    regionId(必选)

    String

    地域 ID,例如 cn-beijing。

    instanceName(必选)

    String

    实例名称。

    writable(必选)

    boolean

    是否接受写操作。默认值为 false。主备模式下设为 false(备地域只读);多活模式下按需设为 true(允许该地域写入)。

  • syncMode(必选)SyncMode:数据同步模式。目前仅支持ROW(行级同步)。

  • serveMode(可选)ServeMode:服务模式。取值范围:

    • PRIMARY_SECONDARY(默认值):主备模式。主地域可读写,备地域只读。数据由主地域同步至备地域。适用于本地读取、容灾备份、异地热备场景。

    • PEER_TO_PEER:多活模式。所有地域均可读写。基于最后写入者获胜原则(LWW)按行或列解决冲突。适用于多地域低延迟读写场景。

示例

创建主备模式的全局表

private static void createGlobalTableExample(SyncClient client){
    // 构造请求
    CreateGlobalTableRequest req = new CreateGlobalTableRequest(
            // 基础表配置,表必须已存在
            new GlobalTableTypes.BaseTable(
                    // 基础表所在地域 ID
                    "cn-hangzhou",
                    // 基础表所在实例名称
                    "i-gt-test",
                    // 基础表名称(同时也是全局表名称)
                    "t-gt-test-1"
            ),
            // 数据同步模式:目前仅支持 ROW(行级同步)
            GlobalTableTypes.SyncMode.ROW
    );

    // 添加关联表(可添加多个)
    req.addPlacement(new GlobalTableTypes.Placement(
            // 关联表所在地域 ID
            "cn-shanghai",
            // 关联表所在实例名称,实例必须已存在
            // 实例中不能存在与基础表同名的表,系统会自动创建
            "i-dest-test",
            // false:备地域只读,主备模式下固定设为 false
            false
    ));

    // 设置服务模式为主备模式(PRIMARY_SECONDARY)
    req.setServeMode(GlobalTableTypes.ServeMode.PRIMARY_SECONDARY);

    // 发起请求
    CreateGlobalTableResponse createResp = client.createGlobalTable(req);

    // 打印响应结果
    System.out.println("Global table creation initiated.");
    System.out.println("RequestId: " + createResp.getRequestId());
    System.out.println("GlobalTableId: " + createResp.getGlobalTableId());
}

创建多活模式的全局表

private static void createGlobalTableExample(SyncClient client){
    // 构造请求
    CreateGlobalTableRequest req = new CreateGlobalTableRequest(
            // 基础表配置,表必须已存在
            new GlobalTableTypes.BaseTable(
                    // 基础表所在地域 ID
                    "cn-hangzhou",
                    // 基础表所在实例名称
                    "i-gt-test",
                    // 基础表名称(同时也是全局表名称)
                    "t-gt-test-1"
            ),
            // 数据同步模式:目前仅支持 ROW(行级同步)
            GlobalTableTypes.SyncMode.ROW
    );

    // 添加关联表(可添加多个)
    req.addPlacement(new GlobalTableTypes.Placement(
            // 关联表所在地域 ID
            "cn-shanghai",
            // 关联表所在实例名称,实例必须已存在
            // 实例中不能存在与基础表同名的表,系统会自动创建
            "i-dest-test",
            // true:该地域允许写入,多活模式下按需设置
            true
    ));

    // 设置服务模式为多活模式(PEER_TO_PEER)
    req.setServeMode(GlobalTableTypes.ServeMode.PEER_TO_PEER);

    // 发起请求
    CreateGlobalTableResponse createResp = client.createGlobalTable(req);

    // 打印响应结果
    System.out.println("Global table creation initiated.");
    System.out.println("RequestId: " + createResp.getRequestId());
    System.out.println("GlobalTableId: " + createResp.getGlobalTableId());
}