跳到主要内容
版本:Nightly

资源标识(ID)管理

资源标识(ID)管理主要用于在从元数据备份恢复集群时,手动设置资源标识(如表 ID)。这是因为备份文件可能未包含最新的待分配表 ID值,如果不及时重置,可能会导致资源冲突或数据不一致。

理解表 ID 及 待分配表 ID 的关系

在 GreptimeDB 中:

  • 表 ID:每个表都有一个唯一的数字标识符,用于数据库内部识别和管理表
  • 待分配表 ID(Next Table ID):系统预留的下一个可用的表 ID 值。当创建新表时,系统会自动分配这个 ID 给新表,然后将待分配表 ID递增

举例说明:

  • 假设当前集群中已有表 ID 为 1001、1002、1003 的表
  • 此时待分配表 ID应该是 1004
  • 当创建新表时,系统分配 ID 1004 给新表,并将待分配表 ID更新为 1005
  • 如果从备份恢复时,待分配表 ID仍然是 1002,就会与现有表 ID 1002、1003 产生冲突(通常你会在 Datanode 启动时遇到 Region 1024 is corrupted, reason: 的错误)

通常情况下,资源标识(ID)由数据库自动维护,无需人工干预。但在某些特殊场景下(如从元数据备份恢复集群,且备份后集群又创建了新表),备份中的待分配表 ID可能已经落后于实际集群状态,此时需要手动调整。

如何判断是否需要手动设置待分配表 ID

  1. 查询当前集群中所有表的 ID:SELECT TABLE_ID FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_ID DESC LIMIT 1;
  2. 通过 API 获取当前的待分配表 ID(见下方接口说明)
  3. 如果现有表 ID 的最大值大于等于当前的待分配表 ID,则需要手动设置待分配表 ID为一个更大的值。通常为现有表 ID 的最大值加 1。

你可以通过 Metasrv 的 HTTP 接口获取或设置待分配的表 IDhttp://{METASRV}:{HTTP_PORT}/admin/sequence/table/next-id(获取)和 http://{METASRV}:{HTTP_PORT}/admin/sequence/table/set-next-id(设置)。请注意,此接口监听 Metasrv 的 HTTP_PORT,默认为 4000

设置待分配的表 ID

要安全地更新待分配的表 ID,请按照以下步骤操作:

  1. 启用集群恢复模式 - 这可以防止在更新过程中创建新表。详情请参阅集群恢复模式
  2. 设置待分配的表 ID - 通过 HTTP 接口设置待分配的表 ID
  3. 重启 metasrv 节点 - 这确保新的待分配的表 ID被正确设置。
  4. 禁用集群恢复模式 - 恢复正常的集群操作。

通过发送 POST 请求到 /admin/sequence/table/set-next-id 端点设置待分配的表 ID

curl -X POST 'http://localhost:4000/admin/sequence/table/set-next-id' \
-H 'Content-Type: application/json' \
-d '{"next_table_id": 2048}'

预期输出(next_table_id 可能不同):

{"next_table_id":2048}

获取待分配的表 ID

curl -X GET 'http://localhost:4000/admin/sequence/table/next-id'

预期输出(next_table_id 可能不同):

{"next_table_id":1254}