For gpcopy 2.3.0 and below, there are certain times when a table uses a sequence like below:
CREATE TABLE foo ( id bigint DEFAULT nextval('foo_id_seq'), source character varying(20) NOT NULL, name character varying(20)
) DISTRIBUTED BY (id) PARTITION BY LIST(source) ( PARTITION bps VALUES('RETAIL', 'BPS') WITH (tablename='foo_1_prt_bps', appendonly='false' ), PARTITION custody VALUES('CUSTODY', 'CUST') WITH (tablename='foo_1_prt_custody', appendonly='false' ) ); CREATE SEQUENCE foo_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE foo OWNER TO testuser1;
When a sequence exists and ALTER TABLE foo OWNER TO testuser1; is used, gpcopy handles implicit and explicit sequences differently when it is restoring to the target database:
For an implicit sequence, like the sequence in CREATE TABLE t1 (id SEIRAL)
. GPDB will create a sequence named t1_id_seq
automatically, and the pg_dump will dump the DDL of the sequence when dumping the table t1
.
In this case, gpcopy won't create the sequence separately.
For an explicit sequence, like CREATE TABLE t1 (id INT DEFAULT nextval('myseq'))
, pg_dump won't generate the DDL for sequence myseq
. So gpcopy needs to create the sequence first before creating t1.
In this case, an explicit sequence was created, but was then altered. This causes pg_dump to generate the DDL in the wrong order due to trying to satisfy the proper permissions.
When running gpcopy, you will get the following error:
DBs, (1/2) tables done] Failed to copy table "db"."public"."foo_prt_bps" => "db"."foo"."foo_1_prt_bps" 20221021:22:40:08 gpcopy:gpadmin:test2-m:026969-[ERROR]:-[Worker 0] Finished task 95142_P_DA_V_ with error: pq: relation "foo_id_seq" already exists 20221021:22:40:08 gpcopy:gpadmin:test2-m:026969-[ERROR]:-[Worker 0] [Progress: (0/1) DBs, (2/2) tables done] Failed to copy table "db"."public"."foo_1_prt_custody" => "db"."public"."foo_1_prt_custody"