Полагаю, без переделки скрипта не обойтись. Кмк, есть два схожих пути:
1. Скрипт должен уметь: на каждом этапе вычислений фиксировать состояние этапа, и уметь найти крайний этап и продолжить с него. Что-то вроде машины состояний. Тут можно и в базу писать.
2. Скрипт должен быть разделен на несколько фрагментов - подпрограмм, и результаты каждого отдельного скрипта-подпрограммы фиксируются, и для каждого должна быть возможность повторить. Фактически, вариант первого, но с нюансом, что это может быть не единый скрипт, а цепочка слабо связанных скриптов.
Вопрос в том, как мелко надо «порубить» исходный большой скрипт.
Да, в случае взаимодействия с внешними ресурсами надо учитывать способность этих ресурсов восстановить соединение или создать новое с учетом состояния основного скрипта.