Mamy w naszym systemie encję nazywaną "programem tożsamości". To jest również nasza granica, każdy program tożsamości jest przechowywany we własnym fragmencie, więc identyfikator fragmentu jest identyfikatorem programu tożsamości.Nie można usunąć odwzorowania odłamków przy użyciu elastycznej skali Azure SQL
Jesteśmy w trakcie realizacji możliwości fizycznego usunięcia programu tożsamości. W ramach tego procesu chcemy oczyścić mapę fragmentów. Aby to zrobić pisałem następujące:
var shardKey = new Guid("E03F1DC0-5CA9-45AE-B6EC-0C90529C0062");
var connectionString = @"shard-catalog-connection-string";
var shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy);
var shardMap = shardMapManager.GetListShardMap<Guid>("IdentityProgramIdListShardMap");
if (shardMap.TryGetMappingForKey(shardKey, out PointMapping<Guid> mapping))
{
if (mapping.Status == MappingStatus.Online)
{
shardMap.MarkMappingOffline(mapping);
}
shardMap.DeleteMapping(mapping);
}
Problem polega na tym, że kiedy uderza połączenie DeleteMapping
robi wyjątek:
ShardManagementException: Mapowanie przedstawieniu shard „[shard-connection-string ] "w mapie fragmentów" IdentityProgramIdListShardMap "nie istnieje. Wystąpił błąd podczas wykonywania procedury przechowywanej "__ShardManagement.spBulkOperationShardMappingsGlobalBegin" dla operacji "RemovePointMapping". Może się to zdarzyć, jeśli inny współbieżny użytkownik usunął już odwzorowanie.
Ale odwzorowanie nie został usunięty, ponieważ zaraz potem mogę wykonać:
mappings = shardMap.GetMappings();
foreach(var mapping in mappings)
{
Console.WriteLine(mapping.Value);
}
I widzę, że wejście shardmap nadal istnieje, i jest oznaczony w trybie offline.
Po usunięciu połączenia z numerem MarkMappingOffline
otrzymuję wyjątek z informacją, że mapowania odłamków nie można usunąć, ponieważ jest on w trybie online.
Wydaje mi się, że mam złap-22. Jeśli oznaczę to w trybie offline, uważa, że mapowanie odłamków zniknęło i nie pozwoli mi go usunąć. Jeśli nie oznaczę go jako offline, oznacza to, że musi być offline.
Dzięki za wyjaśnienie. Sam to sobie wyobraziłem wkrótce po tym, jak napisałem pytanie, dlatego nie wróciłem do niego, aby oznaczyć odpowiedź. Błędnie założyłem, że 'shardMap.MarkMappingOffline (mapowanie)' po prostu zmodyfikuje przekazane 'mapowanie' zamiast zwracać nową/zmodyfikowaną instancję. Teraz wszystko działa. –
W jaki sposób można to zrobić za pomocą Powershell? – Deepak