Доброго дня дорогой форум. Это мой первый пост. Буду рад критике.
У меня есть таблица на первом сервере Postgres. Например db1.sales Я создал таблицу на втором сервере Postgres. Например db2.sales
Скажите, пожалуйста, какими средствами я могу перенести данные партиционно?
Я пробую следующий алгоритм: создание партиций в целевой таблице: Проверяю есть ли партиции в таблице. если есть получаю параметры последней партиции(записываю в переменную конечную дату последней партиции). далее нужно вырезать новую партицию из дефолтной партиции(этот момент я не до конца понимаю).
приложенный код идёт с увеличением к конечной дате. то есть август->сентябрь->октябрь и тд.
но мне ведь нужно попасть в начальную дату которая есть в таблицe.
помогите, пожалуйста. у меня нет понимания каким способ перенести данные партициями. посоветуйте литературу. буду признателен любой помощи
CREATE OR REPLACE FUNCTION bd2.f_create_date_partitions(p_table_name text, p_partition_value timestamp)
RETURNS void
LANGUAGE plpgsql
VOLATILE
AS $$
DECLARE
v_cnt_partitions int;
v_table_name text;
v_partition_end_sql text;
v_partition_end timestamp;
v_interval interval;
v_ts_format text := 'YYYY-MM-DD HH24:MI:SS';
BEGIN
v_table_name = std7_167.f_unify_name(p_table_name);
-- Проверка наличия партиций в таблице
SELECT COUNT(*) INTO v_cnt_partitions
FROM pg_partitions p
WHERE p.schemaname || '.' || p.tablename = lower(v_table_name);
IF v_cnt_partitions > 1 THEN
LOOP
-- Получение параметров последней партиции
SELECT partitionrangeend INTO v_partition_end_sql
FROM (
SELECT p.*, RANK() OVER (ORDER BY partitionrank DESC) rnk
FROM pg_partitions p
WHERE p.partitionrank IS NOT NULL AND p.schemaname || '.' || p.tablename = lower(v_table_name)
) q
WHERE rnk = 1;
-- Конечная дата последней партиции
EXECUTE 'SELECT ' || v_partition_end_sql INTO v_partition_end;
raise notice 'v_partition_end_sql = [%], v_partition_end = [%]', v_partition_end_sql, v_partition_end;
-- Если партиция уже есть для входного значения, тогда EXIT из функции
EXIT WHEN v_partition_end > p_partition_value;
v_interval = '1 month'::interval;
-- Вырез новой партиции из дефолтной партиции, если её ещё не существует
EXECUTE 'ALTER TABLE ' || v_table_name || ' SPLIT DEFAULT PARTITION
START (' || v_partition_end_sql || ') END (''' ||
to_char(v_partition_end + v_interval, v_ts_format) || '''::timestamp)';
raise notice 'Successfully altered % from % to %', v_table_name, v_partition_end_sql, to_char(v_partition_end + v_interval, v_ts_format);
END LOOP;
ELSE
raise notice 'Number of partitions = %.%Please, check quantity of partitions.% % is not > 1', v_cnt_partitions, E'\n', E'\n', v_cnt_partitions;
END IF;
END;
$$
EXECUTE ON ANY;```