public inbox for [email protected]
help / color / mirror / Atom feedFrom: yudhi s <[email protected]>
To: pgsql-general <[email protected]>
Subject: Question on pg_cron
Date: Sat, 8 Jun 2024 15:01:32 +0530
Message-ID: <CAEzWdqdHXZRpOq75Tkj-4JL1S_Q3vtL-9KJasubhhELAvapRuA@mail.gmail.com> (raw)
Hello All,
We have around 10 different partition tables for which the partition
maintenance is done using pg_partman extension. These tables have foreign
key dependency between them. We just called partman.run_maintanance_proc()
through pg_cron without any parameters and it was working fine. So we can
see only one entry in the cron.job table. And it runs daily once.
It was all working fine and we were seeing the historical partition being
dropped and new partitions being created without any issue. But suddenly we
started seeing, its getting failed with error "ERROR: can not drop
schema1.tab1_part_p2023_12_01 because other objects depend on it"
Then we realized , it may be the case that it's trying to run the partition
maintenance for the Parent partition table first before the child partition
table. So not sure how pg_partman handles the ordering of tables while
doing the partition maintenance as we don't see any parameter to drive the
ordering of the partition maintenance in part_config and we were under the
impression pg_partman will take care of the sequence of partition
maintenance automatically.
So want to understand if anybody encountered such issues?
And to handle the above issue , we are planning to call the partition
maintenance of each of the TABLE by passing the table name explicitly to
the run_maintanance_proc(), something as below. Is this advisable?
SELECT cron.unschedule('run_maintenance_proc');
SELECT cron.schedule(
'daily_partition_maintenance',
'0 2 * * *',
$$
DO $$
BEGIN
-- Run maintenance for child tables first
PERFORM partman.run_maintenance_proc('schema1.child_table1');
PERFORM partman.run_maintenance_proc('schema1.child_table2');
-- Add more child tables as needed
-- Run maintenance for parent tables next
PERFORM partman.run_maintenance_proc('schema1.parent_table1');
PERFORM partman.run_maintenance_proc('schema1.parent_table2');
-- Add more parent tables as needed
END;
$$;
$$
);
*Or else *
create a function like below and then call/schedule it through pg_cron
CREATE OR REPLACE FUNCTION run_partition_maintenance()
RETURNS void AS $$
BEGIN
-- Run maintenance for child tables first
PERFORM partman.run_maintenance_proc('schema1.child_table1');
PERFORM partman.run_maintenance_proc('schema1.child_table2');
-- Add more child tables as needed
-- Run maintenance for parent tables next
PERFORM partman.run_maintenance_proc('schema1.parent_table1');
PERFORM partman.run_maintenance_proc('schema1.parent_table2');
-- Add more parent tables as needed
END;
$$ LANGUAGE plpgsql;
SELECT cron.unschedule('run_maintenance_proc');
SELECT cron.schedule(
'daily_partition_maintenance',
'0 2 * * *',
'CALL run_partition_maintenance()'
);
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected]
Subject: Re: Question on pg_cron
In-Reply-To: <CAEzWdqdHXZRpOq75Tkj-4JL1S_Q3vtL-9KJasubhhELAvapRuA@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox