Почему бы не выполнить экспорт / импорт за один шаг с группированием (для повышения производительности) и разбиением на фрагменты (чтобы избежать ошибок и обеспечить контрольную точку, с которой следует начинать работу после сбоя).
В большинстве случаев базы данных поддерживают INSERT
запросов со многими значениями, например ::100100
INSERT INTO table_a (col_a, col_b, ...) VALUES
(val_a, val_b, ...),
(val_a, val_b, ...),
(val_a, val_b, ...),
...
Количество строк, которые вы генерируете в одном таком операторе INSERT
, соответствует размеру вашего чанка, который может нуждаться в настройке для конкретной целевой базы данных (достаточно большой, чтобы ускорить процесс, но достаточно мал, чтобы чанк не превышал некоторых ограничение базы данных и создание сбоев).
Как уже предлагалось, каждый из этих блоков должен затем выполняться в транзакции, и ваше приложение должно помнить , какой блок успешно выполнялся последним в случае возникновения ошибки, чтобы он мог продолжить при следующем запуске там.
Для самих блоков вам действительно следует использовать LIMIT OFFSET .
Таким образом, вы можете повторять любой блок в любое время, каждый блок сам по себе является атомарным, и он должен работать намного лучше, чем с однострочными операторами.