Source و Target هر دو دقیقاً یک میلیون Row دارند؛ ۱۰۰ Batch از ۱۰۰ Batch سبز است، Checksum برابر و Job error صفر است. آیا مهاجرت داده درست انجام شده؟ هنوز نه. ممکن است هر دو Count برابر باشند اما یک رکورد کم و یک رکورد تکراری باشد؛ Checksum با Canonicalization ضعیف تفاوت را پنهان کند؛ تومان به ریال اشتباه تبدیل شود؛ Timestamp جابه‌جا، رابطه شکسته یا Delete در CDC گم شده باشد.

این راهنما یک Data Migration Evidence Protocol می‌سازد: Scope و Source Snapshot → Mapping/Transform Rules → Batch/Checkpoint/Replay → Target Snapshot → Reconciliation چندلایه → Exception/Repair → Cutover/Rollback → Result/Correction. هدف، ادعای محدود و قابل‌ردیابی درباره‌ی Population مشخص است؛ نه سبزکردن یک Job.

پاسخ کوتاه: تست مهاجرت داده چیست؟

تست مهاجرت داده بررسی می‌کند که داده‌ی داخل Scope از Source با Snapshot و مرز زمانی مشخص، طبق Mapping و Transform نسخه‌دار، بدون فقدان/تکرار/تغییر نامجاز و با Semantics و روابط مورد انتظار به Target رسیده است. این بررسی Schema، Population، Row/Field، Aggregate، Relationship و Business invariant را همراه با Pending/Exception و محدودیت Evidence می‌سنجد.

Dashboardآنچه ثابت می‌کندآنچه ثابت نمی‌کند
Job succeededRunner طبق Exit semantics خاتمه یافتهکامل‌بودن یا درستی داده
Count برابرCardinality کل برابر استهمان Entityها یا نبود Duplicate
Checksum برابرDigest ورودی Canonicalشده برابر استدرستی Canonicalization و Semantics
Schema ایجاد شدDDL بخشی از Target اعمال شدهMapping، Constraint behavior یا Data
Batch سبزBatch status سبز استCheckpoint، Replay safety و Reconciliation

مرز این مقاله با TDM، ETL و Cutover سیستم لگسی

مدیریت داده تست مالک Request/Fitness/Provisioning/Cleanup یک Data Pack است. تست Data Pipeline Ingestion/Transform/Stream/Replay را در محصول داده پوشش می‌دهد. تست سیستم Legacy مدرن‌سازی، Characterization و Cutover کل سیستم را مالک است. این مقاله فقط Evidence لازم برای Migration Run و Reconciliation Source-to-Target را می‌سازد.

Intentمالکخروجی
داده مناسب تست بسازیمTDM/FitnessData Pack
Pipeline دائمی داده را تست کنیمData PipelineData Product Evidence
یک Population را منتقل و تطبیق دهیمهمین مقالهMigration/Reconciliation Evidence
سامانه قدیمی را جایگزین کنیمLegacy modernizationCharacterization/Cutover portfolio

Migration، Replication، Backfill، Restore و Provisioning یکی نیستند

عملهدفریسک ویژه
Migrationانتقال مالکیت/ساختار یا بسترMapping، Cutover، Point of no return
Replication/CDCهمگام‌سازی تغییر پیوستهLag، Ordering، Delete، Replay
Backfillپرکردن داده تاریخی/مشتقWindow، Recompute، Duplicate effect
Backup/Restoreبازسازی State ذخیره‌شدهRestore validity و Recovery point
Test provisioningتحویل Dataset برای TestFitness، Privacy، Isolation، Cleanup

زنجیره‌ی هویت Migration را Pin کنید

«مهاجرت شنبه شب» شناسه نیست. Source/Target System و Schema، Mapping، Transform code، Build، Run، Batch، Snapshot، CDC position، Reconciliation و Cutover باید شناسه‌های جدا داشته باشند. بدون این زنجیره، Repair یا Re-run ممکن است روی نسخه‌ی دیگری اجرا شود.

Program/Product → Migration/Scope
→ Source System/Schema/Snapshot/Position
→ Mapping/Transform/Build/Run
→ Batch/Checkpoint/Exception
→ Target System/Schema/Snapshot
→ Reconciliation/Result → Cutover/Decision/Correction

Migration Scope Contract

Scope فقط فهرست Table نیست. Entity، Tenant، تاریخچه، Attachment، Derived view، Archive، Deleted record، Data class و Exclusion را ثبت کنید. Success claim و Not claimed را قبل از Result بنویسید تا یک Subset سبز به کل Source تعمیم داده نشود.

MigrationScope {
  scopeId, businessPurpose,
  includedEntities, excludedEntities,
  sourceObjects, targetObjects,
  historicalRange, tenantScope,
  dataClasses, sensitivityClasses, policyRefs,
  qualityQuestions, riskIds,
  successClaim, notClaimed,
  assumptions, unknowns, version, digest
}

Source Snapshot باید یک مرز زمانی واقعی باشد

اگر Table A ساعت ۱۰:۰۰ و Table B ساعت ۱۰:۲۰ خوانده شود، Count و روابط ممکن است از دو State متفاوت بیایند. Snapshot method، Isolation semantics، Source position، Object set و سیاست Concurrent write را ثبت کنید. مستند PostgreSQL نشان می‌دهد Repeatable Read یک Snapshot پایدار می‌دهد، اما حتی آن هم Semantics و محدودیت‌های خودش را دارد؛ مرجع: PostgreSQL Transaction Isolation. رفتار را برای Engine واقعی خود بررسی کنید.

SourceSnapshot {
  snapshotId, sourcePosition, snapshotMethod,
  isolationSemantics, capturedAt, timezone, clockSource,
  consistentObjectSet, concurrentWritePolicy,
  cdcStartPosition, cdcEndPosition,
  schemaDigest, rowPopulationManifest,
  retention, access, redaction,
  limitations, digest
}

Full Load و CDC را با Gap یا Overlap طراحی کنید

Full Load تا Position مشخص و CDC از Position مشخص باید به هم متصل شوند. Gap می‌تواند Change را گم کند و Overlap بدون Idempotency می‌تواند Effect تکراری بسازد. Start/end position، Catch-up lag، Ordering، Tombstone/Delete و Reconnect semantics را در Run Manifest نگه دارید.

مرزFailureEvidence
Full load → CDCGap یا overlapSnapshot/CDC positions + replay test
ReconnectEvent دوباره یا گم‌شدهResume token + idempotency key
Out-of-orderState قدیمی روی جدیدSequence/version rule
DeleteTarget ghost recordTombstone lineage
Long transactionCutoff ambiguityCommit position and policy

Mapping Contract؛ Spreadsheet بی‌نسخه کافی نیست

هر Mapping باید Field، Type، Transform، ترتیب Rule، Null/default، Enum، Precision/scale، Rounding، Timezone، Encoding، Normalization، Key/Relationship/Delete و Provenance را تعریف کند. Oracle مستقل از Transform تا حد ممکن از تکرار همان اشتباه جلوگیری می‌کند.

MappingRule {
  mappingId, sourceField, targetField,
  sourceType, targetType, transformRule, ruleOrder,
  nullSemantics, defaultSemantics, enumMap,
  precisionScale, roundingMode,
  timezoneRule, encodingRule, normalizationRule,
  keyRule, relationshipRule, deleteRule,
  provenanceRule, oracleId, version, digest
}

Null، Empty، Missing و Default را یکی نکنید

Source stateTarget rule نمونهریسک
NULLNULL یا governed defaultساخت Fact جعلی
Empty stringحفظ یا Normalize طبق Basisازبین‌رفتن معنای «واردشده ولی خالی»
Field missingSchema-evolution ruleاشتباه با NULL
Legacy sentinelMap نسخه‌دار-۱/۱۹۰۰-۰۱-۰۱ به‌عنوان داده واقعی
Default targetفقط با Source/authorityپنهان‌کردن Missing migration

Type، Precision، Scale و Rounding

Cast موفق به معنای حفظ معنا نیست. Integer overflow، Decimal scale، Floating representation، Boolean/Enum، Large object truncation و Collation باید Boundary و Property داشته باشند. برای مقدار پول، Currency و Unit بخشی از داده است؛ Money Contract و Reconciliation مالی جزئیات بیشتری دارد.

ریسکTestOracle
Decimal→IntegerBoundary/negative/max/scaleExact governed conversion
FloatTolerance پیش‌تعریف‌شدهDomain precision، نه arbitrary epsilon
Enumتمام Source values + unknownVersioned map
Text lengthgrapheme/byte boundariesNo silent truncation
LOBsize/digest/content sample/full policyExplicit validation scope

زمان، منطقه زمانی و Calendar

Timestamp without timezone، Local time، UTC instant، Date-only و Duration را جدا کنید. DST/Offset، precision، epoch، ambiguous time و Cut-off ممکن است تغییر معنایی بسازند. در داده فارسی، UTC instant را Canonical نگه دارید؛ Asia/Tehran و تاریخ جلالی View هستند مگر Domain Contract چیز دیگری بگوید.

Unicode، فارسی، RTL و شناسه

ی/ی، ک/ک، نیم‌فاصله، ارقام فارسی/عربی/لاتین، NFC/NFD، Collation و RTL/LTR می‌توانند Equality، Sort، Search یا Unique key را تغییر دهند. Normalization را خودکار «پاکسازی» ننامید؛ Rule باید Field-specific باشد و Raw lineage یا Source reference را حفظ کند.

Persian migration test values (fictional)
digits: ۱۲۳ | ١٢٣ | 123
letters: ی/ي | ک/ك
spacing: space | ZWNJ
normalization: NFC and NFD variants
direction: RTL label + LTR stable ID
time: UTC instant → Asia/Tehran view → Jalali presentation

Key Mapping و Provenance

Source key ممکن است در Target Surrogate تازه بگیرد. Crosswalk باید Source key reference را به Target key وصل کند و Version/Batch/Transform lineage داشته باشد. Plain PII را برای Traceability ذخیره نکنید؛ Reference یا Hash تحت Policy کافی است. Collision، Merge، Split و Re-parenting را صریح مدل کنید.

حالتریسکEvidence
1→1Wrong mappingCrosswalk + row compare
N→1 mergeLoss/precedence ambiguityMerge rule + source set
1→N splitMissing childExpected cardinality/invariant
Re-keyBroken foreign/logical linkRelationship reconciliation
DedupFalse mergeMatch policy + review sample

Referential Integrity شرط لازم است، نه Business Integrity

Foreign key سبز فقط رابطه‌ی فیزیکی تعریف‌شده را می‌سنجد. رابطه‌ی منطقی میان Storeها، Event و Ledger، Version و History یا Tenant boundary ممکن است Constraint دیتابیس نداشته باشد. Invariantهای کسب‌وکاری را جدا بنویسید: هر Callback حداکثر یک Effect، جمع Breakdown برابر Total و Child متعلق به همان Tenant.

Delete، Tombstone، Archive و Retention

مهاجرت فقط Insert/Update نیست. Hard delete، Soft delete، Tombstone، Expiry، Legal hold و Archive semantics باید در Scope و CDC حاضر باشند. Ghost record در Target می‌تواند هم Privacy و هم Business behavior را نقض کند. Retention/Deletion authority را از تیم Migration اختراع نکنید.

Batch Contract، Checkpoint و Resume

MigrationBatch {
  batchId, partitionRule,
  sourceRange, targetRange, inputCount, outputCount,
  startedAt, completedAt,
  checkpointBefore, checkpointAfter, resumeToken,
  idempotencyKey, retryPolicy, replayPolicy,
  duplicatePolicy, orderingPolicy,
  status, evidenceManifestId,
  supersedes, digest
}

Batch سبز باید Range بدون Gap/Overlap، Checkpoint durable، Resume token و Evidence داشته باشد. Retry تنها وقتی امن است که Transform/Load idempotent یا Compensation تعریف شده باشد. Restart از ابتدا ممکن است Duplicate بسازد؛ Resume از Position اشتباه ممکن است Loss ایجاد کند.

Reconciliation چندلایه؛ Count کافی نیست

لایهسؤالFailure نمونه
SchemaObject/type/constraint/index مطابق Contract؟Default یا collation متفاوت
Populationهمان Entity keyها حاضرند؟یک Missing + یک Duplicate
Row/FieldMapping هر مقدار درست است؟Null/round/timezone mismatch
AggregateCount/sum/distribution per partition؟خطاها همدیگر را خنثی کرده‌اند
Relationshipفیزیکی و منطقی حفظ شده؟Orphan یا cross-tenant link
Invariantقاعده دامنه برقرار است؟دو Effect برای یک Event
JourneyTarget داده را درست مصرف می‌کند؟Storage صحیح، application mapping غلط

مستندات رسمی AWS DMS Data Validation نمونه‌ای از مقایسه Source/Target و وضعیت‌های Pending، Suspended و Failed ارائه می‌کند و محدودیت/هزینه‌ی Validation را نیز می‌گوید. آن را قابلیت یک ابزار بدانید، نه استاندارد جهانی یا جایگزین Business invariant و Mapping Oracle.

Reconciliation Contract قابل‌کپی

Reconciliation {
  reconciliationId,
  sourceSnapshotId, targetSnapshotId, comparisonAsOf,
  population,
  sourceCount, targetCount,
  missingSourceCount, missingTargetCount, duplicateTargetCount,
  fieldMismatchCount, invalidTransformCount,
  relationshipViolationCount,
  aggregateChecks, invariantChecks,
  samplePolicy, fullComparePolicy, tolerancePolicy,
  pendingCount, suspendedCount,
  verdict, limitations, digest
}

Checksum را با Canonicalization و Scope بخوانید

Checksum به ترتیب Row/Column، Encoding، Null representation، Float/Decimal، Timestamp، Whitespace و normalization حساس است. اگر Source و Target Schema متفاوت‌اند، Hash خام ممکن است همیشه متفاوت یا با حذف Fieldهای مهم ظاهراً برابر شود. Canonical form، Field set، ordering، algorithm/version و Partition را در Evidence ثبت کنید.

Full Compare، Sampling و Risk

Full row compare هم همیشه ممکن یا بی‌هزینه نیست؛ Validation می‌تواند Source/Target را تحت بار بگذارد. Sampling برای Discovery یا Confidence محدود مفید است، اما Pass نمونه به Population کامل تعمیم نمی‌یابد. Stratified/risk/change-based sample، Seed، Population، Inclusion probability و Claim limit را ثبت کنید.

روشمزیتمحدودیت
Full key compareMissing/Duplicate گستردههزینه و key requirement
Partition aggregateسریع‌تر و Locator بهترخطاهای جبرانی
Row/field fullMismatch دقیقTransform/canonical complexity
Risk-stratified sampleتمرکز روی Edgeهاعدم اثبات کل Population
Journey/invariantSemantics مصرفCoverage محدود سناریو

Tolerance را پیش از Result تعریف کنید

Tolerance برای Measurement uncertainty یا Transform مجاز است، نه پاک‌کردن Failure. Absolute/relative tolerance، Unit، Field/Population، دلیل، Authority و Boundary را قبل از مقایسه Pin کنید. برای Money یا Count گاهی Tolerance باید صفر باشد؛ برای Float ممکن است Domain-specific باشد.

Exception Registry؛ Pending و Suspended مساوی Pass نیستند

MigrationException {
  exceptionId, entityKeyRef, batchId, category,
  observation, expected, actual, evidenceRefs,
  severity, status, ownerCapability, decisionAuthority,
  disposition, rationale, repairPlan,
  reconcileAgain, dueAt, digest
}

Missing Source، Missing Target، Duplicate، Transform mismatch، Relationship violation، Validation error و Cannot compare را جدا کنید. Exception بدون Owner/Disposition/Expiry نباید در Count موفق حل شود. «Suspended» یعنی نتوانسته‌ایم مقایسه کنیم، نه اینکه داده درست است.

Repair، Resync و Reconciliation دوباره

Repair باید Source/Mapping version، Entity، prior/new value reference، Authority و Evidence را حفظ کند. Patch مستقیم Target ممکن است Provenance را نابود کند یا CDC بعداً آن را برگرداند. پس از Repair، همان Layerهای متاثر را Reconcile و Result قبلی را Supersede کنید؛ سبزکردن Exception table کافی نیست.

Performance و Safety خود Migration

Throughput بالا اگر Lock، Replica lag، Storage saturation یا App latency بسازد موفقیت نیست. Rate limit، Maintenance window، resource guardrail، Kill switch، Restore point و Incident path تعریف کنید. Validation نیز Query و Network cost دارد؛ سرعت را کنار Source/Target health و Correctness بسنجید.

MetricGuardrailStop نمونه
Rows/secSource p95 latencyعبور پایدار از Threshold
CDC lagChange loss/duplicatePosition discontinuity
Validation rateDB CPU/IOخطر سرویس
Exception rateCategory concentrationFailure class ناشناخته
Batch durationCheckpoint freshnessResume unsafe

Privacy و Security؛ Production Copy پیش‌فرض نیست

مهاجرت Validation به PII واقعی نیاز قطعی ندارد. Purpose، minimization، access، encryption، retention، deletion و audit را با Authority سازمانی تعیین کنید. Masking و Pseudonymization ریسک را کاهش می‌دهند اما ناشناس‌بودن یا Compliance را تضمین نمی‌کنند؛ Synthetic نیز خودکار Safe/Representative نیست. برای انتخاب راهبرد، داده واقعی یا مصنوعی و برای Privacy، ملاحظات حریم خصوصی TDM را ببینید.

Cutover Contract؛ Migration Pass خودکار Go نیست

CutoverPlan {
  cutoverPlanId, mode,
  entryCriteria, freezePolicy, writeRouting,
  cdcCatchupThreshold, finalReconciliationId,
  decisionAuthority, goDecision, goRationale,
  rollbackTriggers, rollbackTarget, rollbackProcedure,
  pointOfNoReturn, communications, monitoringWindow,
  exitCriteria, digest
}

Final Reconciliation، Open exceptions، CDC lag، Application smoke، Operational readiness و Business timing ورودی تصمیم‌اند. Test Result یک توصیه یا Evidence است؛ Authority Go/No-Go را Policy تعیین می‌کند. Point of no return را صریح کنید.

Rollback را تمرین کنید؛ Backup وجود دارد کافی نیست

Rollback ممکن است Schema/Data را برگرداند اما Email، Message، Payment request یا External side effect را پس نگیرد. Restore target، Recovery point، Write freeze/routing، Reverse mapping، CDC handling، External-effect compensation و Reconciliation پس از Restore را تمرین کنید. Dual write نیز Consistency را تضمین نمی‌کند و Divergence evidence می‌خواهد.

Evidence Manifest و Result

MigrationResult {
  resultId, migrationId, runId,
  scopeId, sourceSnapshotId, targetSnapshotId,
  mappingVersion, transformBuildId,
  batchManifestId, reconciliationId,
  exceptionCountsByState, pendingCount, suspendedCount,
  verdict: HOLD | INCONCLUSIVE | READY_FOR_REVIEW,
  unknowns, limitations, residualRisk,
  evidenceManifestId, supersedes, digest
}

READY_FOR_REVIEW را Production Go ننامید. Manifest باید Snapshot/Mapping/Batch/Comparison/Exception/Cutover rehearsal را پیدا کند و Access/Retention/Redaction داشته باشد. Evidence تولیدکننده‌ی Transform تا حد امکان تنها Validator نباشد.

Correction و Affected-decision analysis

اگر Mapping اشتباه، Snapshot ناسازگار یا Validator ناقص کشف شد، Result قدیمی را بی‌صدا تغییر ندهید. Correction با prior/new digest، Scope متاثر، Re-run/Reconcile refs و Query تصمیم‌ها/مصرف‌کنندگان بسازید. Target اصلاح‌شده بدون اعلام به Downstream ممکن است Resultهای قبلی را نامعتبر کند.

آزمایشگاه فارسی: مهاجرت Checkout کاملاً خیالی

این Lab کاملاً ساختگی و جدا از هر شرکت، بانک، PSP، کاربر، پرداخت یا سامانه‌ی واقعی است؛ شبکه و Production واقعی ندارد و توصیه‌ی بانکی، مالی، حقوقی، مالیاتی، امنیتی، حریم خصوصی یا انطباق ایران نیست. Entityهای خیالی Order، PaymentAttempt، PSP Stub، Callback Event، Ledger Entry و Reconciliation Job هستند.

Transform خیالیریسکOracle
نمای تومان برچسب‌خورده → IRR canonical ×۱۰Unit confusionExact Money mapping
Local Tehran view → UTC instantOffset/order shiftKnown instant pairs
ی/ی و ک/کFalse merge/key collisionField-specific NFC rule
Callback→Ledger relationDuplicate effectیک Effect برای Event ID
Soft delete→TombstoneGhost recordDelete lineage

Tenant/Order/Attempt/Event/Ledger/Run/Batch/Snapshot/Evidence شناسه‌های جدا دارند. مقدارها فقط IRR خیالی و نمای تومان صریح‌اند؛ ارقام فارسی/عربی/لاتین، Unicode NFC، RTL/LTR، UTC/Asia-Tehran و Jalali نمایشی پوشش داده می‌شوند. هیچ نام، موبایل، ایمیل، IP، حساب، PAN، CVV2، OTP، Cookie، Token، Credential، Log یا Screenshot واقعی استفاده نمی‌شود.

Fixture: یک میلیون Row سبز در برابر ۲۱۳ Finding

Fixture مستقل `SYN-DATA-MIGRATION-RECONCILIATION-۰۱` با Node.js و بدون Dependency بیرونی اجرا شد. Dashboard یک میلیون Source Row، یک میلیون Target Row، ۱۰۰/۱۰۰ Batch، Checksum MATCH و صفر Job error را دید و `MIGRATION_PASS` اعلام کرد. ممیزی ۲۱۵قاعده‌ای همان ورودی را با دقیقاً ۲۱۳ Finding به HOLD برد.

گروهقاعدهنمونه
Identity18Source/Target/Schema/Mapping/Build/Run
Scope18Entity/Range/Class/Claim/Unknown
Snapshot18Position/Isolation/Object set/CDC
Mapping22Type/Null/Money/Time/Key/Delete
Batch20Range/Checkpoint/Resume/Idempotency
Reconciliation22Missing/Duplicate/Field/Relation/Invariant
Exception18Category/Evidence/Disposition/Repair
Cutover18Entry/Freeze/Go/Rollback/Exit
Governance19Owner/Authority/Correction/Limit
Forbidden + Relations42مطلق‌گویی و سازگاری قراردادها

نسخه‌ی اصلاح‌شده `MIG-SYN-۳۱`، Snapshot `SNAP-SRC-SYN-۳۱` و CDC positions را Freeze کرد، Mapping تومانِ برچسب‌خورده به IRR و Time/Unicode/Delete rules را نسخه‌دار ساخت، Batch ۰۴۲ را به Checkpoint/Resume/Evidence بست، یک Exception را با Provenance Repair کرد و Reconciliation صفر Missing/Duplicate/Mismatch/Violation و صفر Pending/Suspended ساخت. نتیجه `READY_FOR_MIGRATION_EVIDENCE_REVIEW` با صفر Finding بود؛ نه اثبات Privacy/Compliance، Truth Source، پوشش خارج Scope، Business correctness یا Production Cutover.

Automation و AI

Automation باید Snapshot/position، Mapping digest، Batch range/checkpoint، Validation query/version، Exception و Manifest را تولید کند. AI می‌تواند Mapping candidate، anomaly cluster یا SQL draft پیشنهاد دهد؛ نباید Mapping را بدون Domain review اعمال، PII دریافت، Tolerance اختراع، Mismatch را خودکار Repair، Provenance را overwrite یا Go/Risk acceptance صادر کند. Prompt/model/input/output و Human decision را ثبت کنید.

معیارهای سالم و Countermetricها

MetricکاربردCountermetric
Rows/secتوان انتقالMismatch/DB impact
Reconciliation coveragePopulation/Layer بررسی‌شدهValidator blind spots
Exception ageپیری اختلافFalse repair/reopen
CDC lagفاصله PositionLoss/duplicate/order
Resume successتاب‌آوری BatchDuplicate effect
Cutover durationWindow عملیاتیCorrectness/rollback readiness
Correction latencyسرعت اصلاح ClaimAffected consumers reached

۳۴ Anti-pattern مهاجرت داده

  1. Count برابر را اثبات Migration دانستن.
  2. Checksum برابر را اثبات Semantics دانستن.
  3. همه Batch سبز را Completeness دانستن.
  4. صفر Job error را Correctness دانستن.
  5. Schema success را Data success دانستن.
  6. Referential integrity را Business integrity دانستن.
  7. Sample pass را تعمیم به Population.
  8. Production copy را الزامی دانستن.
  9. Masking را تضمین Anonymity دانستن.
  10. Synthetic را دارای ریسک Privacy صفر دانستن.
  11. Automation را حذف خطای انسانی دانستن.
  12. ETL success را Migration pass دانستن.
  13. CDC lag صفر را نبود Lost change دانستن.
  14. Exactly once را شعار بدون Scope.
  15. Retry را همیشه امن دانستن.
  16. Rollback را بازگرداننده همه External effectها دانستن.
  17. وجود Backup را Restore proof دانستن.
  18. Dual write را تضمین Consistency دانستن.
  19. Source را همیشه Oracle دانستن.
  20. Target را همیشه Oracle دانستن.
  21. Null و Empty را یکی گرفتن.
  22. Timezone را فقط Display دانستن.
  23. Rounding mismatch را بی‌خطر دانستن.
  24. Unicode normalization را بدون اثر Identity دانستن.
  25. Delete را از Scope حذف‌کردن.
  26. Orphan را فقط FK error دانستن.
  27. Reconciliation را Row count نهایی دانستن.
  28. Pending را Pass دانستن.
  29. Suspended را Pass دانستن.
  30. Repair بدون Provenance.
  31. Mapping خودکار AI بدون Review.
  32. Repair خودکار AI.
  33. Migration pass را Cutover Go دانستن.
  34. Cutover موفق را Business correctness دانستن.

چک‌لیست ۳۲نقطه‌ای Migration Owner

حوزهکنترل
IdentityMigration/Source/Target/Schema/Mapping/Build/Run/Cutover Pin شده؟
ScopeEntity/Tenant/Range/Class/Include/Exclude/Claim/Unknown روشن است؟
SnapshotPosition/Isolation/Object set/Concurrent write/CDC boundary ثبت است؟
MappingNull/Default/Enum/Type/Precision/Time/Unicode/Key/Delete versioned است؟
OracleTransform و Validator استقلال کافی دارند؟
BatchRange/Gap/Overlap/Checkpoint/Resume/Idempotency/Evidence روشن است؟
ReconciliationSchema/Population/Field/Aggregate/Relation/Invariant پوشش دارد؟
ValidityCanonicalization/Sample/Tolerance/Pending/Suspended محدود شده؟
ExceptionCategory/Owner/Authority/Disposition/Repair/Reconcile-again دارد؟
SafetyRate/Resource/Kill switch/Restore/Incident path آماده است؟
PrivacyPurpose/Minimization/Access/Retention/Deletion/Redaction دارد؟
CutoverEntry/Freeze/Routing/Catch-up/Go/Rollback/Point-of-no-return روشن است؟
ResultManifest/Unknown/Limit/Residual risk/Authority جدا هستند؟
CorrectionSupersedes و Affected-decision/consumer query وجود دارد؟

Pilot سی‌روزه

بازهکارخروجی/Guardrail
روز ۱–۵یک Entity chain و Scope/Identityفقط داده ساختگی/مجاز
روز ۶–۱۰Snapshot و Mapping ContractTime/Null/Key/Delete
روز ۱۱–۱۵سه Batch و Resume drillCheckpoint/Idempotency
روز ۱۶–۲۰Reconciliation چندلایهPending/Suspended صریح
روز ۲۱–۲۵Exception/Repair/Rollback rehearsalProvenance + Reconcile again
روز ۲۶–۳۰Result و Scale/Adapt/StopCountermetric + claim limits

جمع‌بندی

تست مهاجرت داده از مقایسه Count شروع می‌شود، اما آنجا تمام نمی‌شود. Population و Snapshot/Position را Freeze کنید، Mapping و Transform را نسخه‌دار سازید، Batch را با Checkpoint و Replay Evidence ببندید، Reconciliation را از Schema تا Business invariant لایه‌بندی کنید و Pending/Exception را پنهان نکنید. سپس Cutover و Rollback را به Authority و Result محدود وصل کنید؛ Job سبز فقط یک Signal است.

سؤالات متداول

آیا برابر بودن تعداد رکوردهای Source و Target کافی است؟

خیر. یک Missing و یک Duplicate می‌توانند Count را برابر نگه دارند. Key population، Field/Transform، Relationship، Aggregate و Business invariant را روی Snapshotهای هم‌مرز بررسی کنید.

Checksum برابر چه چیزی را ثابت می‌کند؟

فقط Equality بایت‌های Canonicalشده با Algorithm/Scope مشخص را. اگر Field مهم حذف، ترتیب/Encoding متفاوت یا Transform معنایی باشد، Checksum به‌تنهایی کافی نیست. Canonicalization و محدودیت را ثبت کنید.

بهترین روش تست Migration با CDC چیست؟

Snapshot/Full-load position را به CDC start/end وصل کنید، Gap/Overlap و Replay/Ordering/Delete را آزمایش، Catch-up و Pending را بسنجید و Reconciliation نهایی را در Comparison-as-of مشخص اجرا کنید.

آیا برای تست مهاجرت باید داده Production را کپی کنیم؟

الزاماً نه. Test objective و Fidelity/Risk تعیین می‌کند Synthetic، generated، masked/subset یا داده‌ی مجاز دیگری لازم است. هر راهبرد Privacy و Utility validation و Policy سازمانی می‌خواهد.

Migration Pass یعنی Cutover مجاز است؟

خیر. Migration Result یکی از ورودی‌هاست. Open exception، CDC lag، Application/Operational evidence، زمان‌بندی، Rollback readiness و Residual risk نیز لازم‌اند و Authority تعریف‌شده تصمیم Go/No-Go می‌گیرد.

دیدگاهتان را بنویسید