Å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
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.
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.
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.
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.