Hoppa till innehåll

Återställning

Återställningsplaner beskriver hur valda sammanslagningsåtgärder ångras efter att de har tillämpats. De skapas före tillämpningen med hjälp av de exakta aktuella raderna som finns omedelbart före skrivningen.

Generera inte en återställning enbart från bassnapshoten. Basen är den gemensamma förfadern, inte nödvändigtvis det aktiva tillstånd som skrivs över.

Skapa en återställningsplan

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'],
);

Planen lagrar:

  • ID för sammanfogningsplanen,
  • valda åtgärds-ID:n,
  • berörda tabeller,
  • inversa åtgärder,
  • rader före ändringen,
  • förväntade rader efter ändringen,
  • metadata,
  • en återställningshash,
  • en schemaversion.

Avvikelsekontroll

Innan återställningen tillämpas jämför du de aktuella aktiva raderna med återställningsplanens förväntade rader efter ändringen. Om någon rad har ändrats sedan driftsättningen avbryts processen som standard.

PHP
use Merql\Rollback\RollbackDrift;

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

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

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

Avvikelsekontrollen jämför radfingeravtryck, så kolumnordningen spelar ingen roll.

Tillämpa återställningen

När ingen avvikelse finns tillämpas de inversa åtgärderna.

PHP
use Merql\Rollback\RollbackPlanApplier;

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

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

Återställningen tillämpar en vanlig MergeResult som byggts från inversa åtgärder. Den körs genom samma transaktionella tillämpningsflöde som vanlig sammanfogningstillämpning.

Serialisering

Spara återställningsplaner innan den framåtriktade sammanfogningen tillämpas. Den artefakten utgör den beständiga grunden för senare återställning.

PHP
use Merql\Rollback\RollbackPlanSerializer;

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

Program bör lagra den serialiserade planen tillsammans med åtgärden som utförde skrivningen till den aktiva databasen, samt eventuell värdspecifik granskningsmetadata.