本页面介绍了如何在数据库中创建和管理拆分点。您可以创建拆分点来预先拆分数据库,以便为预期的流量增长做好准备。 如需详细了解预先拆分,请参阅预先拆分概览。
准备工作
-
如需获得创建和管理拆分点所需的权限,请让您的管理员为您授予实例的 Cloud Spanner Database Admin (
roles/spanner.databaseAdmin
) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。此预定义角色包含创建和管理拆分点所需的
spanner.databases.addSplitPoints
权限。 本页面中的 gcloud CLI 示例进行如下假设:
- 您已设置 gcloud CLI 来搭配使用 Spanner。如果您是第一次将 gcloud CLI 与 Spanner 搭配使用,请参阅使用 gcloud CLI 创建和查询数据库。
您已为项目配置了 gcloud CLI。例如:
gcloud config set core/project PROJECT_ID
确保您的 Spanner 实例具有足够的节点来支持预期的流量增长。如需了解详情,请参阅预拆分概览。
创建拆分点
您可以使用 Google Cloud CLI 或 REST API 创建拆分点。
gcloud
如果您想使用 Google Cloud CLI 创建拆分点,则需要创建一个包含所有拆分的文件,并在 gcloud CLI 命令中提供路径。文件不得超过每个 API 请求 100 个点的 API 限制。如需了解详情,请参阅配额和限制。
该文件必须使用以下格式指定拆分点:
ObjectType ObjectName (SplitValue)
ObjectType ObjectName (SplitValue)
ObjectType ObjectName (SplitValue)
创建文件时,请替换以下变量:
- ObjectType:要添加拆分的对象类型。有效值为
TABLE
和INDEX
。 - ObjectName:数据库表或索引的名称。
- SplitValue:要引入拆分的拆分点值。
在文件中创建拆分点值时,请使用以下规则:
- 字符串值需要用单引号引起来。例如
'splitKeyPart'
。 - 布尔值必须是
true
或false
。 INT64
和NUMERIC
Spanner 数据类型值需要用单引号引起来。例如'123'
或'99.99'
。- 所有其他数字值都不需要用单引号引起来。例如
1.287
。 - 时间戳值应采用
'2020-06-18T17:24:53Z'
格式,并用单引号引起来。 - 拆分值需要用括号括起来。
- 拆分键值的顺序必须与主键顺序相同。
- 如果拆分值需要包含逗号,您必须使用 `\` 字符转义逗号。
- 对于拆分索引,您可以提供索引键或整个索引和完整的表键。
- 指定拆分点时,您必须始终使用完整键。
以下示例文件展示了如何指定拆分点:
TABLE Singers ('c32ca57a-786c-2268-09d4-95182a9930be')
TABLE Singers ('bb98c7e2-8240-b780-346d-c5d63886594a')
INDEX Order ('5b8bac71-0cb2-95e9-e1b0-89a027525460')
TABLE Payment ('6cf41f21-2d77-318f-c504-816f0068db8b')
INDEX Indx_A (2152120141932780000)
TABLE TableD (0,'7ef9d̦b22-d0e5-6041-8937-4bc6a7ef9db2')
INDEX IndexXYZ ('8762203435012030000',NULL,NULL)
INDEX IndexABC (0, '2020-06-18T17:24:53Z', '2020-06-18T17:24:53Z') TableKey
(123,'ab\,c')
在使用下面的命令数据之前,请先进行以下替换:
- SPLITS_FILE:拆分文件的路径。
- INSTANCE_ID:实例 ID。
- DATABASE_ID:数据库 ID。
-
EXPIRATION_DATE:(可选)拆分点的失效日期。接受
'2020-06-18T17:24:53Z'
格式的时间戳。 - INITIATOR:(可选)拆分点的发起者。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud spanner databases splits add DATABASE_ID \ --splits-file=SPLITS_FILE \ --instance=INSTANCE_ID\ --split-expiration-date=EXPIRATION_DATE\ --initiator=INITIATOR\
Windows (PowerShell)
gcloud spanner databases splits add DATABASE_ID ` --splits-file=SPLITS_FILE ` --instance=INSTANCE_ID` --split-expiration-date=EXPIRATION_DATE` --initiator=INITIATOR`
Windows (cmd.exe)
gcloud spanner databases splits add DATABASE_ID ^ --splits-file=SPLITS_FILE ^ --instance=INSTANCE_ID^ --split-expiration-date=EXPIRATION_DATE^ --initiator=INITIATOR^
REST v1
您可以使用 projects.instances.databases.addSplitPoints
方法创建拆分点。
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:项目 ID。
- INSTANCE_ID:实例 ID。
- DATABASE_ID:数据库 ID。
HTTP 方法和网址:
POST https://spanner.googleapis.com/v1/projects//instances/ /databases/ :addSplitPoints
请求 JSON 正文:
{ "split_points": [ { "table": "T1", "index": "T1_IDX", "expire_time": "2023-04-22T10:00:20.021Z", "keys": [ { "key_parts": { "values": [ 3 ] } }, { "key_parts": { "values": [ 10 ] } } ] }, { "table": "T2", "expire_time": "2023-04-22T10:00:20.021Z", "keys": [ { "key_parts": { "values": [ 50 ] } } ] } ] }
如需发送您的请求,请展开以下选项之一:
您应该会收到一个成功的状态代码 (2xx) 和一个空响应。
客户端库
Go
Java
Node.js
Python
可能的错误场景
在创建拆分点时,以下情况可能会导致错误:
- 索引级拆分在输入中具有错误的表名称。
- 表级拆分点具有多个键。
- 索引级拆分点具有两个以上的键。
- 拆分点是在数据库架构中未定义的表或索引上定义的。
- 请求包含重复的拆分点。
如需详细了解配额和限制,请参阅配额和限制。
查看拆分点
您可以使用Google Cloud 控制台或 gcloud CLI 查看数据库中已创建的所有拆分点:
控制台
如需通过在 Google Cloud 控制台中查询 SPANNER_SYS.USER_SPLIT_POINTS
视图来获取拆分点计数,请执行以下操作:
打开 Spanner 实例页面。
选择要查询的 Spanner 实例和数据库的名称。
点击左侧导航面板中的 Spanner Studio。
在文本字段中输入以下查询:
SELECT * FROM SPANNER_SYS.USER_SPLIT_POINTS
点击运行查询。
系统会显示类似以下内容的结果:
TABLE_NAME | INDEX_NAME | INITIATOR | SPLIT_KEY | EXPIRE_TIME |
---|---|---|---|---|
T | CloudAddSplitPointsAPI | T(90,153,4,2024-04-30T17:00:00-07:00,1,2024-05-01,a) | 2025-03-06T09:58:58.007201Z | |
T | T_IDX | CloudAddSplitPointsAPI | 索引:T 上的 T_IDX,索引键:(10),主表键:(<begin>,<begin>,<begin>,<begin>,<begin>,<begin>,<begin>) | 2025-03-08T07:33:23.861682Z |
T | T_IDX | CloudAddSplitPointsAPI | 索引:T 上的 T_IDX,索引键:(9091),主表键:(4567,123,4.2,2024-04-30T17:00:00-07:00,1,2024-05-01,a) | 2025-03-08T07:35:25.990007Z |
gcloud
运行以下 gcloud CLI 命令以查看数据库中的拆分点:
gcloud spanner databases splits list DATABASE_ID \
--instance INSTANCE_ID
运行此命令时,替换以下变量:
- INSTANCE_ID:Spanner 实例 ID。
- DATABASE_ID:Spanner 数据库 ID。
系统会显示类似以下内容的响应:
TABLE_NAME: T
INDEX_NAME:
INITIATOR: CloudAddSplitPointsAPI
SPLIT_KEY: T(90,153,4,2024-04-30T17:00:00-07:00,1,2024-05-01,a)
EXPIRE_TIME: 2025-03-06T09:58:58.007201Z
TABLE_NAME: T
INDEX_NAME: T_IDX
INITIATOR: CloudAddSplitPointsAPI
SPLIT_KEY: Index: T_IDX on T, Index Key: (10), Primary Table Key: (<begin>,<begin>,<begin>,<begin>,<begin>,<begin>,<begin>)
EXPIRE_TIME: 2025-03-08T07:33:23.861682Z
TABLE_NAME: T
INDEX_NAME: T_IDX
INITIATOR: CloudAddSplitPointsAPI
SPLIT_KEY: Index: T_IDX on T, Index Key: (9091), Primary Table Key: (4567,123,4.2,2024-04-30T17:00:00-07:00,1,2024-05-01,a)
EXPIRE_TIME: 2025-03-08T07:35:25.990007Z
如何使拆分点失效
您可以为创建的每个拆分点设置到期时间。如需了解详情,请参阅拆分点到期时间。 您可以使用 Google Cloud CLI 或 REST API 使拆分点失效。
gcloud
如果您想在 Google Cloud CLI 中使拆分点失效,则需要创建一个包含您想使其失效的所有拆分的文件,并使用 gcloud CLI 命令中的 splits-file
参数提供路径。文件不得超过每个 API 请求 100 个点的 API 限制。如需了解详情,请参阅配额和限制。
该文件必须使用以下格式指定拆分点:
ObjectType ObjectName (SplitValue)
ObjectType ObjectName (SplitValue)
ObjectType ObjectName (SplitValue)
创建文件时,请替换以下变量:
- ObjectType:您要使其失效的拆分的对象类型。有效值为
TABLE
和INDEX
。 - ObjectName:数据库表或索引的名称。
- SplitValue:您要使其失效的拆分点值。
在文件中创建拆分点值时,请使用以下规则:
- 字符串值需要用单引号引起来。例如
'splitKeyPart'
。 - 布尔值可以是
true
或false
。 INT64
和NUMERIC
Spanner 数据类型值需要用单引号引起来。例如'123'
或'99.99'
。- 所有其他数字值都不需要用单引号引起来。例如
1.287
。 - 时间戳值应采用
'2020-06-18T17:24:53Z'
格式,并用单引号引起来。 - 拆分值需要用括号括起来。
- 拆分键值的顺序必须与主键顺序相同。
- 如果拆分值需要包含逗号,您必须使用 `\` 字符转义逗号。
- 对于拆分索引,您可以提供索引键或整个索引和完整的表键。
- 指定拆分点时,您必须始终使用完整键。
以下示例文件展示了如何指定拆分点:
TABLE Singers ('c32ca57a-786c-2268-09d4-95182a9930be')
TABLE Singers ('bb98c7e2-8240-b780-346d-c5d63886594a')
INDEX Order ('5b8bac71-0cb2-95e9-e1b0-89a027525460')
TABLE Payment ('6cf41f21-2d77-318f-c504-816f0068db8b')
INDEX Indx_A (2152120141932780000)
TABLE TableD (0,'7ef9db22-d0e5-6041-8937-4bc6a7ef9db2')
INDEX IndexXYZ ('8762203435012030000',NULL,NULL)
INDEX IndexABC (0, '2020-06-18T17:24:53Z', '2020-06-18T17:24:53Z') TableKey
(123,'ab\,c')
在使用下面的命令数据之前,请先进行以下替换:
- SPLITS_FILE:拆分文件的路径。
- INSTANCE_ID:实例 ID。
- DATABASE_ID:数据库 ID。
-
EXPIRATION_DATE:(可选)拆分点的失效日期。接受
'2020-06-18T17:24:53Z'
格式的时间戳。 - INITIATOR:(可选)拆分点的发起者。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud spanner databases splits add DATABASE_ID \ --splits-file=SPLITS_FILE \ --instance=INSTANCE_ID\ --split-expiration-date=EXPIRATION_DATE\ --initiator=INITIATOR\
Windows (PowerShell)
gcloud spanner databases splits add DATABASE_ID ` --splits-file=SPLITS_FILE ` --instance=INSTANCE_ID` --split-expiration-date=EXPIRATION_DATE` --initiator=INITIATOR`
Windows (cmd.exe)
gcloud spanner databases splits add DATABASE_ID ^ --splits-file=SPLITS_FILE ^ --instance=INSTANCE_ID^ --split-expiration-date=EXPIRATION_DATE^ --initiator=INITIATOR^
REST v1
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:项目 ID。
- INSTANCE_ID:实例 ID。
- DATABASE_ID:数据库 ID。
HTTP 方法和网址:
POST https://spanner.googleapis.com/v1/projects//instances/ /databases/ :addSplitPoints
请求 JSON 正文:
{ "split_points": [ { "table": "T1", "index": "T1_IDX", "expire_time": "2023-04-22T10:00:20.021Z", "keys": [ { "key_parts": { "values": [ 3 ] } }, { "key_parts": { "values": [ 10 ] } } ] }, { "table": "T2", "expire_time": "2023-04-22T10:00:20.021Z", "keys": [ { "key_parts": { "values": [ 50 ] } } ] } ] }
如需发送您的请求,请展开以下选项之一:
您应该会收到一个成功的状态代码 (2xx) 和一个空响应。