Я использую PostgreSQL 10 на Windows 10 (64 бита). Моя цель - загрузить очень большие файлы CSV в локальную базу данных. Изучив онлайн-документацию PostgreSQL, я нашел команду COPY. Действительно, эта команда выполняет работу очень впечатляюще и быстро (учитывая размер файлов).
То, что я делаю, довольно просто: я просто открываю сеанс psql и запускаю следующие команды
truncate table my_log_table;
copy my_log_table from 'D:/tmp/logs/file-01.csv' with delimiter '|' null '';
И все.
Пока что, недавно в моих файлах были строки, которые, по-видимому, не имеют хорошего формата и, очевидно, отклоняются во время процесса загрузки с помощью команды копирования. Вот что говорит онлайн-документация об ошибках:
https://www.postgresql.org/docs/12/sql-copy.html
COPY останавливает работу при первой ошибке. Это должно не приводит к проблемам в случае COPY TO, но целевая таблица уже получит более ранние строки в COPY FROM. Эти строки не будут видны или доступны, но они все еще занимают место на диске. Это может привести к значительному расходу дискового пространства, если сбой произошел из-за большой операции копирования. Вы можете sh вызвать VACUUM для восстановления потраченного впустую пространства.
И это именно то, чего я хочу избежать. Я не хочу скатываться Я хочу продолжить вставку как можно большего количества строк, чтобы все плохие строки были собраны в отдельный файл. Это именно то, что SQL* Loader в Oracle позволяет делать. И очистка файлов перед загрузкой не вариант. Напротив, возможность предоставления этих плохо отформатированных строк действительно помогла бы нашим разработчикам понять, что не так в их приложении, генерирующем эти файлы журналов.
Есть ли способ решить эту проблему в PostgreSQL?