这是我参与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命令过滤。