Как сохранить небольшой фрагмент информации в файле, не затрагивая его содержимое?

Мой вопрос:

Как сохранить текущую версию моего программного обеспечения в файле дампа, созданном PostgreSQL?


Причина моего вопроса:

Я разработал программное обеспечение JAVA с использованием базы данных PostgreSQL. Программное обеспечение устанавливается локально на компьютер каждого пользователя, база данных также локальна и индивидуальна для каждого пользователя.

Я создал функцию, позволяющую пользователям создавать резервные копии своих баз данных и восстанавливать их. Для этого мой код JAVA запускает pg_dump для создания файла резервной копии и pg_restore для его восстановления. То есть резервная копия — это не что иное, как дамп базы данных, сгенерированный командой ниже:

pg_dump.exe -U myuser -h localhost -p 5432 -Fc -f bkpname.bkp mydb

Проблема в том, что я обычно запускаю обновления программного обеспечения. Новые версии программы всегда совместимы с дампами предыдущих версий. Однако более старые версии программного обеспечения несовместимы с дампами, созданными более новой версией.

Иногда бывает так, что пользователь пытается восстановить последнюю версию дампа в старой версии программы, которая несовместима.

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


Я думал о двух приведенных ниже формах, но думаю, что они не подходят:

  1. Чтобы сохранить версию программного обеспечения в имя файла дампа. Было бы плохо, потому что пользователь мог бы переименовать файл.
  2. Чтобы объединить версию внутри содержимого файла дампа. Боюсь, что файл дампа мог как-то испортиться в процессе ввода текста внутри него или в процессе удаления из него текста (до восстановления дампа).

Есть ли лучший способ добавить эту информацию в файл дампа?


person viniciussss    schedule 12.06.2017    source источник
comment
Я рекомендую создать собственный zip-файл резервной копии, который будет содержать два файла — резервную копию базы данных и версию вашего приложения.   -  person Prashant Saraswat    schedule 12.06.2017
comment
@viniciussss, вы можете поместить версии приложения в качестве комментария в первую строку файла дампа.   -  person Taras Shpulyar    schedule 12.06.2017
comment
@PrashantSaraswat Я боюсь, что команда zip может иногда генерировать поврежденный файл, который нельзя будет разархивировать позже. Я не сталкивался с этим. Имеет ли это смысл? Или это на 100% безопасно, и у команды zip нет шансов создать поврежденный файл?   -  person viniciussss    schedule 13.06.2017
comment
@TarasShpulyar файл дампа двоичный, а не текстовый. Я думаю, что это может быть проблемой. Кроме того, я боюсь, что изменение содержимого файла дампа может как-то его повредить. Пожалуйста, скажи мне, если я говорю глупости.   -  person viniciussss    schedule 13.06.2017
comment
вероятность того, что zip повредит файл, равна 0. Архивирование файлов в настоящее время довольно стандартно. Если вы не хотите заархивировать его, вы также можете создать tar.   -  person Prashant Saraswat    schedule 13.06.2017
comment
вы можете запустить pg_dump без -Fc и просто добавить любую строку в файл дампа между /**/ или после --, а затем заархивировать его, чтобы уменьшить размер   -  person Vao Tsun    schedule 13.06.2017


Ответы (1)


Одной из идей было бы хранить информацию в специальной таблице внутри базы данных.

Таблица обычно не используется, и вы записываете в нее правильную версию прямо перед выполнением дампа.

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

pg_restore --table dump_version -d mydatabase dumpfile.dmp

Затем вы проверяете, что находится в таблице, и действуете соответственно.

person Laurenz Albe    schedule 13.06.2017