资源标识(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
:
- 查询当前集群中所有表的 ID:
SELECT TABLE_ID FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_ID DESC LIMIT 1;
- 通过 API 获取当前的
待分配表 ID
(见下方接口说明) - 如果现有表 ID 的最大值大于等于当前的
待分配表 ID
,则需要手动设置待分配表 ID
为一个更大的值。通常为现有表 ID 的最大值加 1。
你可以通过 Metasrv 的 HTTP 接口获取或设置待分配的表 ID
:http://{METASRV}:{HTTP_PORT}/admin/sequence/table/next-id
(获取)和 http://{METASRV}:{HTTP_PORT}/admin/sequence/table/set-next-id
(设置)。请注意,此接口监听 Metasrv 的 HTTP_PORT
,默认为 4000
。
设置待分配的表 ID
要安全地更新待分配的表 ID
,请按照以下步骤操作:
- 启用集群恢复模式 - 这可以防止在更新过程中创建新表。详情请参阅集群恢复模式。
- 设置待分配的表 ID - 通过 HTTP 接口设置
待分配的表 ID
。 - 重启 metasrv 节点 - 这确保新的
待分配的表 ID
被正确设置。 - 禁用集群恢复模式 - 恢复正常的集群操作。
通过发送 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}