Re: PostgreSQL 15.10 update corrective action for ATTACH PARTITION/DETACH PARTITION - Mailing list pgsql-general

From Paul Foerster
Subject Re: PostgreSQL 15.10 update corrective action for ATTACH PARTITION/DETACH PARTITION
Date
Msg-id F103529F-49ED-4A2F-9EB1-19AFC561635A@gmail.com
Whole thread Raw
In response to Re: PostgreSQL 15.10 update corrective action for ATTACH PARTITION/DETACH PARTITION  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: PostgreSQL 15.10 update corrective action for ATTACH PARTITION/DETACH PARTITION
List pgsql-general
Hi Tom,

> On 26 Nov 2024, at 22:25, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>
> I would have expected an empty result too.  Can you confirm that
> p_ci_pipelines used to be a partition of something?  Can you show us
> the full DDL (or psql \d+ output) for the partitioned table it
> used to be part of, and for that matter also for p_ci_pipelines?
> Did the FK used to reference the whole partitioned table, or just
> this partition?
>
> I'm suspicious that our repair recipe might not have accounted
> for self-reference FKs fully, but that's just a gut feeling at
> this point.

Of course, it contains no secret data. Please find the full log below. According to the add constraint statement, it is
aself reference. 

Thanks for looking into it.

Cheers,
Paul


gitxp1t=# \set
AUTOCOMMIT = 'on'
...
VERSION = 'PostgreSQL 15.10 on x86_64-pc-linux-gnu, compiled by gcc (SUSE Linux) 7.5.0, 64-bit'
...



gitxp1t=# SELECT conrelid::pg_catalog.regclass AS "constrained table",
gitxp1t-#        conname AS constraint,
gitxp1t-#        confrelid::pg_catalog.regclass AS "references",
gitxp1t-#        pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;',
gitxp1t(#                          conrelid::pg_catalog.regclass, conname) AS "drop",
gitxp1t-#        pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;',
gitxp1t(#                          conrelid::pg_catalog.regclass, conname,
gitxp1t(#                          pg_catalog.pg_get_constraintdef(oid)) AS "add"
gitxp1t-# FROM pg_catalog.pg_constraint c
gitxp1t-# WHERE contype = 'f' AND conparentid = 0 AND
gitxp1t-#    (SELECT count(*) FROM pg_catalog.pg_constraint c2
gitxp1t(#     WHERE c2.conparentid = c.oid) <>
gitxp1t-#    (SELECT count(*) FROM pg_catalog.pg_inherits i
gitxp1t(#     WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND
gitxp1t(#       EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table
gitxp1t(#               WHERE partrelid = i.inhparent));
constrained table |   constraint    |   references   |                            drop                             |
                                                                                                add

-------------------+-----------------+----------------+-------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
p_ci_pipelines    | fk_262d4c2d19_p | p_ci_pipelines | ALTER TABLE p_ci_pipelines DROP CONSTRAINT fk_262d4c2d19_p; |
ALTERTABLE p_ci_pipelines ADD CONSTRAINT fk_262d4c2d19_p FOREIGN KEY (auto_canceled_by_partition_id,
auto_canceled_by_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE SET NULL; 
(1 row)
 gitxp1t=# ALTER TABLE p_ci_pipelines DROP CONSTRAINT fk_262d4c2d19_p;
ALTER TABLE
gitxp1t=# ALTER TABLE p_ci_pipelines ADD CONSTRAINT fk_262d4c2d19_p FOREIGN KEY (auto_canceled_by_partition_id,
auto_canceled_by_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE SET NULL; 
ALTER TABLE
gitxp1t=# SELECT conrelid::pg_catalog.regclass AS "constrained table",
gitxp1t-#        conname AS constraint,
gitxp1t-#        confrelid::pg_catalog.regclass AS "references",
gitxp1t-#        pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;',
gitxp1t(#                          conrelid::pg_catalog.regclass, conname) AS "drop",
gitxp1t-#        pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;',
gitxp1t(#                          conrelid::pg_catalog.regclass, conname,
gitxp1t(#                          pg_catalog.pg_get_constraintdef(oid)) AS "add"
gitxp1t-# FROM pg_catalog.pg_constraint c
gitxp1t-# WHERE contype = 'f' AND conparentid = 0 AND
gitxp1t-#    (SELECT count(*) FROM pg_catalog.pg_constraint c2
gitxp1t(#     WHERE c2.conparentid = c.oid) <>
gitxp1t-#    (SELECT count(*) FROM pg_catalog.pg_inherits i
gitxp1t(#     WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND
gitxp1t(#       EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table
gitxp1t(#               WHERE partrelid = i.inhparent));
constrained table |   constraint    |   references   |                            drop                             |
                                                                                                add

-------------------+-----------------+----------------+-------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 p_ci_pipelines    | fk_262d4c2d19_p | p_ci_pipelines | ALTER TABLE p_ci_pipelines DROP CONSTRAINT fk_262d4c2d19_p; |
ALTERTABLE p_ci_pipelines ADD CONSTRAINT fk_262d4c2d19_p FOREIGN KEY (auto_canceled_by_partition_id,
auto_canceled_by_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE SET NULL; 
(1 row)



gitxp1t=# \d+ p_ci_pipelines
                                                                      Partitioned table "public.p_ci_pipelines"
            Column             |            Type             | Collation | Nullable |                 Default
      | Storage  | Compression | Stats target | Description 

-------------------------------+-----------------------------+-----------+----------+------------------------------------------+----------+-------------+--------------+-------------
 ref                           | character varying           |           |          |
      | extended |             |              | 
 sha                           | character varying           |           |          |
      | extended |             |              | 
 before_sha                    | character varying           |           |          |
      | extended |             |              | 
 created_at                    | timestamp without time zone |           |          |
      | plain    |             |              | 
 updated_at                    | timestamp without time zone |           |          |
      | plain    |             |              | 
 tag                           | boolean                     |           |          | false
      | plain    |             |              | 
 yaml_errors                   | text                        |           |          |
      | extended |             |              | 
 committed_at                  | timestamp without time zone |           |          |
      | plain    |             |              | 
 project_id                    | integer                     |           |          |
      | plain    |             |              | 
 status                        | character varying           |           |          |
      | extended |             |              | 
 started_at                    | timestamp without time zone |           |          |
      | plain    |             |              | 
 finished_at                   | timestamp without time zone |           |          |
      | plain    |             |              | 
 duration                      | integer                     |           |          |
      | plain    |             |              | 
 user_id                       | integer                     |           |          |
      | plain    |             |              | 
 lock_version                  | integer                     |           |          | 0
      | plain    |             |              | 
 pipeline_schedule_id          | integer                     |           |          |
      | plain    |             |              | 
 source                        | integer                     |           |          |
      | plain    |             |              | 
 config_source                 | integer                     |           |          |
      | plain    |             |              | 
 protected                     | boolean                     |           |          |
      | plain    |             |              | 
 failure_reason                | integer                     |           |          |
      | plain    |             |              | 
 iid                           | integer                     |           |          |
      | plain    |             |              | 
 merge_request_id              | integer                     |           |          |
      | plain    |             |              | 
 source_sha                    | bytea                       |           |          |
      | extended |             |              | 
 target_sha                    | bytea                       |           |          |
      | extended |             |              | 
 external_pull_request_id      | bigint                      |           |          |
      | plain    |             |              | 
 ci_ref_id                     | bigint                      |           |          |
      | plain    |             |              | 
 locked                        | smallint                    |           | not null | 1
      | plain    |             |              | 
 partition_id                  | bigint                      |           | not null |
      | plain    |             |              | 
 id                            | bigint                      |           | not null |
nextval('ci_pipelines_id_seq'::regclass)| plain    |             |              | 
 auto_canceled_by_id           | bigint                      |           |          |
      | plain    |             |              | 
 auto_canceled_by_partition_id | bigint                      |           |          |
      | plain    |             |              | 
Partition key: LIST (partition_id)
Indexes:
    "p_ci_pipelines_pkey" PRIMARY KEY, btree (id, partition_id)
    "p_ci_pipelines_auto_canceled_by_id_idx" btree (auto_canceled_by_id)
    "p_ci_pipelines_ci_ref_id_id_idx" btree (ci_ref_id, id) WHERE locked = 1
    "p_ci_pipelines_ci_ref_id_id_source_status_idx" btree (ci_ref_id, id DESC, source, status) WHERE ci_ref_id IS NOT
NULL
    "p_ci_pipelines_external_pull_request_id_idx" btree (external_pull_request_id) WHERE external_pull_request_id IS
NOTNULL 
    "p_ci_pipelines_id_idx" btree (id) WHERE source = 13
    "p_ci_pipelines_merge_request_id_idx" btree (merge_request_id) WHERE merge_request_id IS NOT NULL
    "p_ci_pipelines_pipeline_schedule_id_id_idx" btree (pipeline_schedule_id, id)
    "p_ci_pipelines_project_id_id_idx" btree (project_id, id DESC)
    "p_ci_pipelines_project_id_iid_partition_id_idx" UNIQUE, btree (project_id, iid, partition_id) WHERE iid IS NOT
NULL
    "p_ci_pipelines_project_id_ref_id_idx" btree (project_id, ref, id DESC)
    "p_ci_pipelines_project_id_ref_status_id_idx" btree (project_id, ref, status, id)
    "p_ci_pipelines_project_id_sha_idx" btree (project_id, sha)
    "p_ci_pipelines_project_id_source_idx" btree (project_id, source)
    "p_ci_pipelines_project_id_status_config_source_idx" btree (project_id, status, config_source)
    "p_ci_pipelines_project_id_status_created_at_idx" btree (project_id, status, created_at)
    "p_ci_pipelines_project_id_status_updated_at_idx" btree (project_id, status, updated_at)
    "p_ci_pipelines_project_id_user_id_status_ref_idx" btree (project_id, user_id, status, ref) WHERE source <> 12
    "p_ci_pipelines_status_id_idx" btree (status, id)
    "p_ci_pipelines_user_id_created_at_config_source_idx" btree (user_id, created_at, config_source)
    "p_ci_pipelines_user_id_created_at_source_idx" btree (user_id, created_at, source)
    "p_ci_pipelines_user_id_id_idx" btree (user_id, id) WHERE status::text = ANY (ARRAY['running'::character
varying::text,'waiting_for_resource'::character varying::text, 'preparing'::character varying::text,
'pending'::charactervarying::text, 'created'::character varying::text, 'scheduled'::character varying::text]) 
    "p_ci_pipelines_user_id_id_idx1" btree (user_id, id DESC) WHERE failure_reason = 3
Check constraints:
    "check_2ba2a044b9" CHECK (project_id IS NOT NULL)
Foreign-key constraints:
    "fk_190998ef09" FOREIGN KEY (external_pull_request_id) REFERENCES external_pull_requests(id) ON DELETE SET NULL
    "fk_262d4c2d19_p" FOREIGN KEY (auto_canceled_by_partition_id, auto_canceled_by_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE SET NULL 
    "fk_3d34ab2e06" FOREIGN KEY (pipeline_schedule_id) REFERENCES ci_pipeline_schedules(id) ON DELETE SET NULL
    "fk_d80e161c54" FOREIGN KEY (ci_ref_id) REFERENCES ci_refs(id) ON DELETE SET NULL
Referenced by:
    TABLE "p_ci_pipelines" CONSTRAINT "fk_262d4c2d19_p" FOREIGN KEY (auto_canceled_by_partition_id,
auto_canceled_by_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE SET NULL 
    TABLE "ci_pipeline_chat_data" CONSTRAINT "fk_64ebfab6b3_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "p_ci_builds" CONSTRAINT "fk_87f4cefcda_p" FOREIGN KEY (upstream_pipeline_partition_id, upstream_pipeline_id)
REFERENCESp_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "p_ci_builds" CONSTRAINT "fk_a2141b1522_p" FOREIGN KEY (auto_canceled_by_partition_id, auto_canceled_by_id)
REFERENCESp_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE SET NULL 
    TABLE "p_ci_builds" CONSTRAINT "fk_d3130c9a7f_p" FOREIGN KEY (partition_id, commit_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "ci_sources_pipelines" CONSTRAINT "fk_d4e29af7d7_p" FOREIGN KEY (source_partition_id, source_pipeline_id)
REFERENCESp_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "ci_sources_pipelines" CONSTRAINT "fk_e1bad85861_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "p_ci_pipeline_variables" CONSTRAINT "fk_f29c5f4380_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "p_ci_stages" CONSTRAINT "fk_fb57e6cc56_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "ci_sources_projects" CONSTRAINT "fk_rails_10a1eb379a_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "gitlab_partitions_dynamic.ci_builds_101" CONSTRAINT "fk_rails_4540ead625_p" FOREIGN KEY
(upstream_pipeline_partition_id,upstream_pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON
DELETECASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_102" CONSTRAINT "fk_rails_4540ead625_p" FOREIGN KEY
(upstream_pipeline_partition_id,upstream_pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON
DELETECASCADE NOT VALID 
    TABLE "ci_builds" CONSTRAINT "fk_rails_4540ead625_p" FOREIGN KEY (upstream_pipeline_partition_id,
upstream_pipeline_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_101" CONSTRAINT "fk_rails_494e57ee78_p" FOREIGN KEY
(auto_canceled_by_partition_id,auto_canceled_by_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON
DELETESET NULL NOT VALID 
    TABLE "ci_builds" CONSTRAINT "fk_rails_494e57ee78_p" FOREIGN KEY (auto_canceled_by_partition_id,
auto_canceled_by_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE SET NULL NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_102" CONSTRAINT "fk_rails_494e57ee78_p" FOREIGN KEY
(auto_canceled_by_partition_id,auto_canceled_by_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON
DELETESET NULL NOT VALID 
    TABLE "ci_pipeline_variables" CONSTRAINT "fk_rails_507416c33a_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_pipeline_variables_102" CONSTRAINT "fk_rails_507416c33a_p" FOREIGN KEY
(partition_id,pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "ci_pipeline_metadata" CONSTRAINT "fk_rails_50c1e9ea10_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "gitlab_partitions_dynamic.ci_stages_102" CONSTRAINT "fk_rails_5d4d96d44b_p" FOREIGN KEY (partition_id,
pipeline_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "ci_stages" CONSTRAINT "fk_rails_5d4d96d44b_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "ci_pipeline_messages" CONSTRAINT "fk_rails_8d3b04e3e1_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "p_ci_pipelines_config" CONSTRAINT "fk_rails_906c9a2533_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "ci_pipeline_artifacts" CONSTRAINT "fk_rails_a9e811a466_p" FOREIGN KEY (partition_id, pipeline_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "p_ci_builds_execution_configs" CONSTRAINT "fk_rails_c26408d02c_p" FOREIGN KEY (partition_id, pipeline_id)
REFERENCESp_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE 
    TABLE "ci_builds" CONSTRAINT "fk_rails_d739f46384_p" FOREIGN KEY (partition_id, commit_id) REFERENCES
p_ci_pipelines(partition_id,id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_101" CONSTRAINT "fk_rails_d739f46384_p" FOREIGN KEY (partition_id,
commit_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_102" CONSTRAINT "fk_rails_d739f46384_p" FOREIGN KEY (partition_id,
commit_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_execution_configs_102" CONSTRAINT "fk_rails_e214655a86_p" FOREIGN KEY
(partition_id,pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_execution_configs_100" CONSTRAINT "fk_rails_e214655a86_p" FOREIGN KEY
(partition_id,pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "gitlab_partitions_dynamic.ci_builds_execution_configs_101" CONSTRAINT "fk_rails_e214655a86_p" FOREIGN KEY
(partition_id,pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID 
    TABLE "ci_daily_build_group_report_results" CONSTRAINT "fk_rails_ee072d13b3_p" FOREIGN KEY (partition_id,
last_pipeline_id)REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE 
Triggers:
    p_ci_pipelines_loose_fk_trigger AFTER DELETE ON p_ci_pipelines REFERENCING OLD TABLE AS old_table FOR EACH
STATEMENTEXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records() 
Partitions: ci_pipelines FOR VALUES IN ('100', '101', '102')




pgsql-general by date:

Previous
From: jayakumar s
Date:
Subject: Re: DB Switchover using repmgr--Error
Next
From: Philip Couling
Date:
Subject: Re: Validating check constraints without a table scan?