Ugrás a tartalomhoz

Visszaállítás

A visszaállítási tervek leírják, hogyan vonhatók vissza a kiválasztott egyesítési műveletek azok alkalmazása után. Az alkalmazás előtt készülnek, közvetlenül az írás előtt fennálló pontos éles sorok felhasználásával.

Ne kizárólag az alap pillanatképből készítsen visszaállítást. Az alap a közös előd, nem feltétlenül az a jelenlegi éles állapot, amelyet felülír.

Visszaállítási terv összeállítása

PHP
use Merql\Plan\ChangeGroupSelection;
use Merql\Rollback\RollbackPlanBuilder;
use Merql\Snapshot\SnapshotStore;

$selection = ChangeGroupSelection::fromIds([$plan->changeGroups[0]->id]);
$operationSelection = $selection->toOperationSelection($plan);
$expectedLive = SnapshotStore::load($plan->theirsSnapshot);

$liveBeforeRows = [];
foreach ($plan->operations as $operation) {
    if (!$operationSelection->contains($operation->id)) {
        continue;
    }

    $liveBeforeRows[$operation->id] = $expectedLive
        ->getTable($operation->table)
        ?->getRow($operation->rowKey);
}

$rollback = (new RollbackPlanBuilder())->build(
    'rollback-1',
    $plan,
    $operationSelection,
    $liveBeforeRows,
    metadata: ['promotion_id' => 'promotion-1'],
);

A terv a következőket tárolja:

  • az egyesítési terv azonosítója,
  • a kiválasztott műveletek azonosítói,
  • az érintett táblák,
  • a fordított műveletek,
  • az előző sorok,
  • az elvárt utólagos sorok,
  • metaadatok,
  • visszaállítási hash,
  • sémaverzió.

Eltérés ellenőrzése

A visszaállítás alkalmazása előtt hasonlítsa össze az aktuális éles sorokat a visszaállítási tervben szereplő elvárt utólagos sorokkal. Ha az előléptetés óta bármelyik sor megváltozott, alapértelmezés szerint szakítsa meg a műveletet.

PHP
use Merql\Rollback\RollbackDrift;

$currentRows = [
    $operationId => $currentLiveRow,
];

$drifted = (new RollbackDrift())->driftedOperationIds($rollback, $currentRows);

if ($drifted !== []) {
    throw new RuntimeException('Rollback drifted: ' . implode(', ', $drifted));
}

Az eltérés ellenőrzése sornyomatokat hasonlít össze, ezért az oszlopok sorrendje nem számít.

Visszaállítás alkalmazása

Ha nincs eltérés, alkalmazza a fordított műveleteket.

PHP
use Merql\Rollback\RollbackPlanApplier;

$applied = (new RollbackPlanApplier($connection))->apply($rollback);

if ($applied->hasErrors()) {
    foreach ($applied->errors() as $error) {
        echo $error . "\n";
    }
}

A visszaállítás fordított műveletekből összeállított, szokásos MergeResult-t alkalmaz. A normál egyesítések alkalmazásával azonos tranzakciós alkalmazási útvonalon fut.

Sorosítás

A továbblépő egyesítés alkalmazása előtt mentse el a visszaállítási terveket. Ez az állomány biztosítja a későbbi visszaállítás tartós alapját.

PHP
use Merql\Rollback\RollbackPlanSerializer;

$json = RollbackPlanSerializer::toJson($rollback);
$restored = RollbackPlanSerializer::fromJson($json);

Az alkalmazások az éles írást végrehajtó művelettel együtt tárolják a sorosított tervet, valamint az alkalmazásspecifikus audit-metaadatokat.