Не удается восстановить данные из pg_dump из-за того, что пустые строки обрабатываются как несуществующие данные

#postgresql #docker #restore #database-backups

#postgresql #docker #восстановить #база данных-резервные копии

Вопрос:

В настоящее время у меня есть база данных на сервере PostgreSQL 9.3.9, которую я создаю с помощью pgdump самым простым из возможных способов, например pg_dump orb > mar_9_2018.db .

Одна из этих таблиц (linktags) имеет следующее определение:

 CREATE TABLE linktags (
    linktagid integer NOT NULL,
    linkid integer,
    tagval character varying(1000)
);
  

При попытке восстановить базу данных в PostgreSQL 11.2 через

cat mar_9_2018.db | docker exec -i pg-docker psql -U postgres

(восстановление контейнера docker) таблица возвращается пустой из-за следующей ошибки —

 ERROR:  missing data for column "tagval"
CONTEXT:  COPY linktags, line 737: "1185    9325"
 setval
  

Я проверил файл db и обнаружил, что отсутствуют вкладки, на которых я ожидал бы получить какую-то информацию, и, очевидно, процесс восстановления также выполняется.

демонстрация отсутствия вкладок в регулярных выражениях

Я также проверил, что значение в базе данных является пустой строкой.

Итак —

  • Существует ли идиоматический метод резервного копирования и восстановления базы данных postgres, которой мне не хватает?
  • Достаточно ли старая моя версия, чтобы в этой версии pg_dump были какие-то особые соображения? Я просто восстанавливаю это неправильно?

Редактировать: Я провел некоторое дальнейшее исследование и обнаружил, что я был неверен при первоначальной проверке нулей, вместо этого проблему вызывают пустые строки.

Если я создам пример таблицы с нулевыми строками, а затем пустыми строками, я увижу, что значения NULL переводятся в новую строку, а пробел — нет нулевые значения, показывающие a  n, и пробелы, показывающие no  n

Комментарии:

1. Я проверил, что pg_dump в версии 10 имеет такое же поведение.

2. При установке postgres версии 9.5 pg_dump по умолчанию использует COPY инструкцию с разделенными табуляцией значениями N для любых полей, содержащих нулевые значения.

3. спасибо @clamp, я ошибся, проблема возникает только с пустыми строками, а не с нулевыми значениями. Я обновил вопрос дополнительными примерами.

4. Пробелы также переводятся в новую строку, иначе 3 и 4 были бы в одной строке.

5. Также, если вы проверите дамп в редакторе или с помощью cat -T , вы должны увидеть вкладки в строке 3 и 4.

Ответ №1:

pg_dump есть возможность использовать INSERT вместо COPY

 pg_dump -d db_name --inserts
  

как предупреждает руководство, это может замедлить восстановление (и значительно увеличить размер файла дампа). Даже в случае некоторых несоответствий таблицы будут заполнены допустимыми строками.

Другая проблема связана с пустыми таблицами, pg_dump генерирует пустой оператор копирования типа:

 COPY config (key, value) FROM stdin;
.
  

в этом случае вы будете получать ошибки при повторном импорте, такие как:

  ERROR:  invalid input syntax for type smallint: "  "
CONTEXT:  COPY config, line 1, column group: "  "
  

чего не происходит с --insert опцией (оператор insert не генерируется).

Комментарии:

1. У меня больше нет исходного материала для тестирования, но это выглядит примерно так, спасибо!