pg_dump INSERTS в SQL файл, отсортированный по первичному ключу - PullRequest
1 голос
/ 11 марта 2020

Я извлекаю таблицу из базы данных, используя следующую команду:

pg_dump -U postgres --column-inserts --data-only --table=<mytable> <mydb> > <mytablev2>.sql

Это создает. sql файл операторов INSERT для воссоздания моей таблицы. Единственная проблема, с которой я столкнулся, заключается в том, что данные сортируются не по порядку первичного ключа. Это более новая версия таблицы, и я хотел бы, чтобы мои строки были в порядке первичного ключа, чтобы отслеживать изменения между версиями намного проще. Можно ли сделать это?

1 Ответ

1 голос
/ 11 марта 2020

Ради эффективности pg_dump просто выводит данные в зависимости от того, как они хранятся на диске. Это действительно затрудняет, если вы хотите отсортировать файлы дампа или отследить изменения с помощью чего-то вроде diff. Я думаю, что единственный способ добиться этого - создать другую таблицу с отсортированными значениями:

postgres=# create table teller2 as SELECT * FROM pgbench_tellers order by tid;
SELECT 10
postgres=# \q
-bash-4.2$ pg_dump -U postgres --column-inserts --data-only --table=teller2    
<...snip...>
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (1, 1, -58378, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (2, 1, 160826, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (3, 1, 21714, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (4, 1, -74568, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (5, 1, 21023, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (6, 1, -80872, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (7, 1, -26181, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (8, 1, -78087, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (9, 1, 43505, NULL);
INSERT INTO public.teller2 (tid, bid, tbalance, filler) VALUES (10, 1, -225725, NULL);

Я знаю, что это может плохо масштабироваться, когда вы имеете дело с миллионами строк. Единственные другие варианты, которые я могу придумать, требуют немного больше кодирования и низкого уровня знаний о том, как работает Postgres - в основном, я бы предложил использовать pg_waldump или логическое декодирование, чтобы создать какой-то инструмент для отслеживания ваших изменений (но это не не удовлетворяет ваш первоначальный вопрос о том, как сортировать pg_dump вывод).

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