Сортировка дампа базы данных postgresql (pg_dump) - PullRequest
4 голосов
/ 05 февраля 2010

Я создаю в pg_dumps, DUMP1 и DUMP2.

DUMP1 и DUMP2 абсолютно одинаковы, за исключением того, что DUMP2 был сброшен в обратном порядке DUMP1.

Есть ли в любом случае, что я могу отсортировать два DUMPS так, чтобы два файла DUMP были абсолютно одинаковыми (при использовании diff)?

Я использую PHP и Linux. Я пытался использовать "сортировку" в Linux, но это не работает ...

Спасибо!

Ответы [ 5 ]

6 голосов
/ 05 февраля 2010

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

Как мы видели там , pg_dump не будет вести себя детерминистически. Тот факт, что один файл является обратным к другому, вероятно, просто случайен.

Вот способ, которым вы можете сделать общее сравнение, включая схему и данные.

Сначала сравните схему , используя этот метод .

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

Запрос ниже генерирует операторы COPY.

select
    'copy (select * from '||r.relname||' order by '||
    array_to_string(array_agg(a.attname), ',')||
    ') to STDOUT;'
from
    pg_class r,
    pg_constraint c,
    pg_attribute a
where
    r.oid = c.conrelid
    and r.oid = a.attrelid
    and a.attnum = ANY(conkey)
    and contype = 'p'
    and relkind = 'r'
group by
    r.relname
order by
    r.relname

Выполнение этого запроса даст вам список операторов вроде copy (select * from test order by a,b) to STDOUT; Поместите их все в текстовый файл и выполните их через psql для каждой базы данных, а затем сравните выходные файлы. Возможно, вам придется настроить параметры вывода на COPY.

2 голосов
/ 06 июня 2013

Мое решение состояло в том, чтобы написать собственную программу для вывода pg_dump. Загрузите PgDumpSort , который сортирует дамп по первичному ключу. С памятью java по умолчанию 512 МБ она должна работать с 10 миллионами записей в таблице, поскольку информация о записи (значение первичного ключа, смещения файлов) хранится в памяти.

Вы используете эту маленькую программу на Java, например, с

java -cp ./pgdumpsort.jar PgDumpSort db.sql

И вы получите файл с именем «db-sorted.sql», или укажите имя выходного файла:

java -cp ./pgdumpsort.jar PgDumpSort db.sql db-$(date +%F).sql

И отсортированные данные находятся в файле типа "db-2013-06-06.sql"

Теперь вы можете создавать патчи, используя diff

diff --speed-large-files -uN db-2013-06-05.sql db-2013-06-06.sql >db-0506.diff

Это позволяет создавать инкрементные резервные копии, которые обычно намного меньше. Для восстановления файлов вы должны применить патч к исходному файлу, используя

 patch -p1 < db-0506.diff

(Исходный код находится внутри файла JAR)

0 голосов
/ 18 февраля 2019

Несмотря на то, что в 2019 году ответить на вопрос, опубликованный в 2010 году, уже слишком поздно, вот еще одно решение проблемы: https://github.com/tigra564/pgdump-sort

Позволяет сортировать как DDL, так и DML, в том числе сбрасывать изменчивые значения (например, значения последовательности) в некоторые канонические значения, чтобы минимизировать результирующую разницу.

0 голосов
/ 19 июля 2017

Если

  • производительность менее важна, чем заказ
  • вас интересуют только данные, а не схема
  • и вы можете воссоздать оба дампа (вам не нужно работать с существующими дампами)

вы можете выгружать данные в формате CSV в определенном порядке, например:

COPY (select * from your_table order by some_col) to stdout
      with csv header delimiter ',';

См. КОПИЯ (9,5)

0 голосов
/ 05 февраля 2010

Вероятно, это не стоит усилий для разбора дампа.

Будет гораздо, намного быстрее восстановить DUMP2 во временную базу данных и вывести временную память в правильном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...