Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure弹性数据库合并GUI密钥碎片_C#_Sql Server_Azure_Azure Elastic Scale - Fatal编程技术网

C# Azure弹性数据库合并GUI密钥碎片

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

在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,或者有更好的方法来实现这一点吗

编辑:

我编写了自己的工具来合并碎片,但现在我遇到了一个奇怪的异常。下面是一些代码:

        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需要在这里输入什么?谢谢