繁体   English   中英

pg_dump INSERTS 到按主键排序的 SQL 文件

[英]pg_dump INSERTS to SQL file sorted by primary key

我正在使用以下命令从数据库中提取表:

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

这将创建一个包含 INSERT 语句的 .sql 文件来重新创建我的表。 我遇到的唯一问题是它没有按主键的顺序对数据进行排序。 这是一个较新版本的表,我希望我的行按主键顺序排列,以便更轻松地跟踪版本之间的更改。 是否有可能做到这一点?

为了效率, 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输出进行排序的原始问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM