C# Azure弹性数据库合并GUI密钥碎片
在Azure中,我们有四个碎片,我想移除其中两个,因为我们不再需要它们了。数据应该合并到其他两个碎片中 我使用带有GUID的Listmap作为键来标识碎片(在我们的应用程序中,这是用户ID)。 在教程中,我只找到了将碎片与范围类型合并的示例。 有没有一种方法可以更快地合并这些类型的碎片,或者我必须为此编写自己的工具 如果自动执行合并,例如,在以下情况下会发生什么: 标识分片的GUID是用户ID,现在该数据从分片A移动到分片B。还有另一个名为Comments的表,该表的用户ID为ForeignKey。此表中的PrimaryKey是一个经典的数字自动递增值。如果将这些值从碎片A移动到碎片B,会发生什么情况?它们是否会被插入并分配一个新的ID,或者根本不起作用 此外,还有一些本地文件存储,它在路径中使用ID,因此无论如何我都必须编写自己的工具 为此,我查看了ShardMapManager,但没有完全理解它是如何工作的。ShardMappingsGlobal表中有一个名为MappingId的列。但这不是存储在Shard数据库中的Guid/UserId。如何获取用于标识碎片的实际Guid,在我的例子中是UserId? 我也没有找到在碎片之间移动数据的方法。 我现在要做的是自己使用工具在碎片之间传输数据,然后使用ListShardMap.UpdateMapping方法为值设置一个新的碎片。 在操作结束时,我会使用ListShardMap.DeleteShard,或者有更好的方法来实现这一点吗 编辑: 我编写了自己的工具来合并碎片,但现在我遇到了一个奇怪的异常。下面是一些代码:C# Azure弹性数据库合并GUI密钥碎片,c#,sql-server,azure,azure-elastic-scale,C#,Sql Server,Azure,Azure Elastic Scale,在Azure中,我们有四个碎片,我想移除其中两个,因为我们不再需要它们了。数据应该合并到其他两个碎片中 我使用带有GUID的Listmap作为键来标识碎片(在我们的应用程序中,这是用户ID)。 在教程中,我只找到了将碎片与范围类型合并的示例。 有没有一种方法可以更快地合并这些类型的碎片,或者我必须为此编写自己的工具 如果自动执行合并,例如,在以下情况下会发生什么: 标识分片的GUID是用户ID,现在该数据从分片A移动到分片B。还有另一个名为Comments的表,该表的用户ID为ForeignKe
Guid userKey = Guid.Parse(userId);
ListShardMap<Guid> map = GetUserShardMap<Guid>();
try
{
PointMapping<Guid> currentMapping = map.GetMappingForKey(userKey);
PointMapping<Guid> mappingOffline = map.UpdateMapping(currentMapping, new PointMappingUpdate()
{
Status = MappingStatus.Offline
});
}
Guid userKey=Guid.Parse(userId);
ListShardMap=GetUserShardMap();
尝试
{
PointMapping currentMapping=map.GetMappingForKey(userKey);
PointMappingOffline=map.UpdateMapping(currentMapping,new PointMappingUpdate())
{
Status=MappingStatus.Offline
});
}
UpdateMapping导致以下异常:
存储错误:错误515,级别16,状态2,过程\uuu ShardManagement.spBulkOperationShardMappingsLocal,第98行,消息:无法在表\uu ShardManagement.ShardMappingsLocal的“LockOwnerId”列中插入值NULL
我不明白为什么会有插页?我在本地和全局Shardmapping表中检查了mappingId,映射在那里,因此我认为不需要插入。我还查看了上述存储过程spBulkOperationShardMappingsLocal的代码:
在Insert语句中,LockOwnerId没有作为参数传递,因此它只能失败。
目前我使用测试设置,因为我当然不想在生产系统上玩。也许我犯了个错误,但对我来说一切都很好。如果有任何关于这个错误的提示,我将不胜感激
在教程中,我只找到了将碎片与范围类型合并的示例。有没有一种方法可以更快地合并这些类型的碎片,或者我必须为此编写自己的工具
是的,可以从范围和列表碎片贴图中移动数据。对于列表碎片映射,可以为每个键发出碎片移动请求。不幸的是,分割合并工具有一些复杂的设置,上次我花了大约一个小时来配置。我知道这不太好,我将让您决定是否需要更多或更少的时间来编写自己的自定义版本
还有另一个名为Comments的表,其UserId作为ForeignKey。此表中的PrimaryKey是一个经典的数字自动递增值。如果将这些值从碎片A移动到碎片B,会发生什么情况?它们是否会被插入并分配一个新的ID,或者根本不起作用
不会复制自动增量列的值,它们将在目标处重新生成。因此,将为这些行分配新的ID
为此,我查看了ShardMapManager,但没有完全理解它是如何工作的。ShardMappingsGlobal表中有一个名为MappingId的列。但这不是存储在Shard数据库中的Guid/UserId。如何获取用于标识碎片的实际Guid,在我的例子中是UserId
我强烈建议不要试图自己编辑ShardMapManager表,这很容易搞糟。编辑ShardMapManager表正是设计的目的
您可以使用更新映射的元数据。需要明确的是,这只会更新ShardMapManager表关于键的数据应该在哪里的知识。实际上,移动贴图必须由更高的层完成
这是拆分合并服务功能的高级总结:
OpenConnectionForKey
的数据定向路由被允许使用该键访问数据。它还将终止碎片上的所有当前会话,以强制它们重新连接,这将确保没有活动连接在使用now offline键的数据上运行SchemaInfo
确定需要移动哪些表谢谢你的回答。我设置了下面描述的工具,我选择“合并”作为操作,Guid作为键类型,但我必须为源和目标输入“范围低键和高键”。ListShardMap需要在这里输入什么?谢谢