The plan said four months. It took nine, and I want to be specific about where the extra five went, because “migrations always slip” is the kind of explanation that teaches nobody anything.
Two months went to data we did not know existed — soft-deleted rows that a downstream report depended on, and which nobody could authorise deleting because the person who wrote the report had left. Two more went to running both systems in parallel far longer than planned, because we had no way to prove equivalence except by comparing output daily for six weeks. The last month was ours: we had no rollback for the final cutover and had to build one under pressure.
What I would do differently is narrow. Inventory the reads, not just the writes, before estimating. Build the comparison harness in week one rather than month four. And write the rollback before the cutover date is announced, because after it is announced you will be asked to skip it.