depends with what error it fails?
The update runs in chunks of 200 history-entrys, to not hit the memory_limit:
On my laptop I was able to convert 66k entries in 15min, so 3million should run in 50*15min ~ 12h.
Did you wait long enough or did it fail after max_excution_time (which it should not, as setup should switch that off)?
Did you run the update via the web-interface, or setup/setup-cli.php like the packages. The later is not affected by any of the above mentioned limits, thought time-wise there will be no difference to the above estimated 12h.