Назад | Перейти на главную страницу

Скопируйте большой CSV (строки 110 мил) в Postgres 10 в патронах, возобновите работу в случае сбоя

Я хочу \ КОПИРОВАТЬ большой файл CSV в Postgres 10, и от искаженных строк ожидаются различные типы ошибок, то есть дополнительные кавычки, ожидается дополнительный столбец и т. Д.

Я хочу запустить команду \ COPY, и в случае сбоя соответствующая строка записывается в журнал для исправления вручную. Затем \ COPY повторно запускается со следующей строки до новой ошибки.

В конце строки с ошибками будут вручную исправлены и добавлены в таблицу вручную.

Я надеюсь получить решение по этому поводу, при необходимости объединив \ COPY и скрипт bash.

Postgresql \copy просто завершается ошибкой и прерывает весь импорт. Нет возможности пропустить искаженные строки или недопустимое содержимое столбца.

Вам нужно использовать такую ​​программу, как pgloader который построен поверх COPY и добавляет возможность отфильтровывать ошибки. Как объясняется в руководстве:

Для загрузки данных в PostgreSQL pgloader использует протокол потоковой передачи COPY. Хотя это более быстрый способ загрузки данных, у COPY есть важный недостаток: как только PostgreSQL выдает ошибку с любым битом данных, отправленных ему, независимо от проблемы, весь набор данных отклоняется PostgreSQL.

Чтобы обойти это, pgloader разрезает данные на пакеты по 25000 строк в каждой, так что при возникновении проблемы она влияет только на это количество строк данных. Каждый пакет сохраняется в памяти во время потоковой передачи КОПИРОВАНИЯ, чтобы иметь возможность обрабатывать ошибки, если они произойдут.

Когда PostgreSQL отклоняет весь пакет, pgloader регистрирует сообщение об ошибке, а затем изолирует неверные строки от принятых, повторяя попытки создания пакетов меньшими партиями. Для этого pgloader анализирует сообщение об ошибке CONTEXT из неудачной COPY, так как сообщение содержит номер строки, в которой была обнаружена ошибка [...]