#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 переводятся в новую строку, а пробел — нет
Комментарии:
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. У меня больше нет исходного материала для тестирования, но это выглядит примерно так, спасибо!