Azure には 4 つのシャードがあり、そのうちの 2 つが不要になったため削除したいと考えています。データは、他の 2 つのシャードにマージする必要があります。
シャードを識別するためのキーとして GUID を持つ Listmap を使用します (このアプリケーションでは、これは UserId です)。チュートリアルでは、Shards を Range タイプとマージするためのサンプルしか見つかりませんでした。これらのタイプのシャードをより高速にマージする方法はありますか、それとも独自のツールを作成する必要がありますか?
マージが自動的に実行される場合、たとえば次のような場合に何が起こるか: シャードを識別する GUID は UserId であり、このデータはシャード A からシャード B に移動されます。ForeignKey として UserId を持つ Comments と呼ばれる別のテーブルがあります。 . このテーブルの PrimaryKey は、従来の数値自動インクリメント値です。これらの値をシャード A からシャード B に移動するとどうなりますか? それらは挿入され、新しい ID が割り当てられますか、それともまったく機能しませんか?
また、パスでIDを使用するローカルFileStorage invlovedがいくつかあるので、とにかく自分のツールを作成する必要があると思います。
そのために、私は ShardMapManager を調べましたが、それがどのように機能するかを完全には理解していませんでした。ShardMappingsGlobal テーブルには、MappingId という列があります。ただし、これはシャード データベースに格納されている 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
});
}
UpdateMapping により、次の例外が発生します。
ストア エラー: エラー 515、レベル 16、状態 2、プロシージャ __ShardManagement.spBulkOperationShardMappingsLocal、行 98、メッセージ: 列 'LockOwnerId'、テーブル __ShardManagement.ShardMappingsLocal に値 NULL を挿入できません
なぜインサートがあるのか わかりませんか?ローカルおよびグローバルの Shardmapping テーブルで mappingId を確認しましたが、マッピングが存在するため、私の意見では挿入は必要ありません。また、前述のストアド プロシージャ spBulkOperationShardMappingsLocal のコードも確認しました。 2.sql Insert ステートメントでは、LockOwnerId がパラメーターとして渡されないため、失敗するだけです。もちろん、生産的なシステムでプレイしたくないので、現在、テストセットアップで作業しています。多分私はそこで間違いを犯しましたが、私にはすべてがうまく見えます. このエラーに関するヒントをいただければ幸いです。