LINUX.ORG.RU

Сообщения Oleg27135

 

Delta Partition Перенос данных из таблицы в таблицу с одного сервера Postgres на другой Postgres

Форум — Development

Доброго дня дорогой форум. Это мой первый пост. Буду рад критике.

У меня есть таблица на первом сервере 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;```

 , ,

Oleg27135
()

RSS подписка на новые темы