postgresql导出工具pg_dump导出单表能不能同时导出索引序列触发器

2,174 阅读1分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
pg_dump是postgresql数据库逻辑导出工具。
小L:鹤神鹤神,我用PG_dump导出一张表,表上用到的序列会不会自动给备份出来?
我:你猜~\

下边通过实际操作来解答小L的问题,并引申一下能不能同时导出索引序列触发器。
首先我们创建一张表,一列通过序列自增。表上带有一个索引,并对该表创建触发器。\

create sequence sq1 minvalue 100 ;
create table sq2 (id int default nextval('sq1'), name char(1));
insert into sq2 (name) values ('1');
create  index ind1 ON sq2 (id);
create trigger tr1 after insert ON sq2 execute function process_emp_audit();

然后我们通过pg_dump导出单表,执行单表的参数是指定-t

[postgres13@rhel711g ~]$ pg_dump -U postgres -d postgres -t sq2 -Fp -f a.txt

我们来查看一下导出文件的内容:

………………
CREATE TABLE public.sq2 (
    id integer DEFAULT nextval('public.sq1'::regclass),
    name character(1)
);

ALTER TABLE public.sq2 OWNER TO postgres;

………………

COPY public.sq2 (id, name) FROM stdin;
100     1
101     2
\.

………………
CREATE INDEX ind1 ON public.sq2 USING btree (id);

………………
CREATE TRIGGER tr1 AFTER INSERT ON public.sq2 FOR EACH STATEMENT EXECUTE FUNCTION public.process_emp_audit();


我们可以看到,表结构和数据,索引,触发器均被导出。
但是!
序列和触发器用到的FUNCTION并没有被导出。
如果想同步导出该表用到的序列。
需要通过pg_dump的-t追加序列名,例如\

[postgres13@rhel711g ~]$ pg_dump -U postgres -d postgres -t sq2 -t sq1 -Fp -f a.txt

这样再查询结果,就包括了序列的定义和他当前使用到的值。

………………
CREATE SEQUENCE public.sq1
    START WITH 100
    INCREMENT BY 1
    MINVALUE 100
    NO MAXVALUE
    CACHE 1;
………………
SELECT pg_catalog.setval('public.sq1', 101, true);
………………

但是想导出该触发器用到的序列就没有这么便捷了,只能是导出完整的一份数据定义也就是元数据,通过frep命令按照FUNCTION过滤词来过滤,例如。

[postgres13@rhel711g ~]$ pg_dump -U postgres -d postgres -s -Fp |grep FUNCTION > func.sql

总结一下就是:
pg_dump导出时指定-t后,只导出-t指定的表及其上的索引和触发器,序列需要单独通过-t指定序列名来导出。FUNCTION没有参数可以直接单独导出,需要进行一次完整导出,结合-s排除数据,再通过系统frep命令过滤。