Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Сделать партиционирование на живых таблицах  [new]
balykovdron
Member

Откуда:
Сообщений: 120
Есть задача - партиционировать табличку с данными на несколько разных. Как это лучше сделать? До этого не сталкивались с подобными решениями.

Табличка (вообще их несколько разных, но не суть) очень большая (20 млн записей) и жирная (400 Gb).
Диски заканчиваются и хочется разнести данные на т.н. архивные данные на другой диск (партиция в другом TABLESPACE) и это бОльшая часть данных и т.н. оперативные данные. Архивные данные при этом также партицируем (например помесячно), чтобы ну очень старые данные отцеплять и куда-то убирать с сервера вообще. При этом - почему по партициям, потому что существующий софт не переписывается и должен видеть при желании весь набор данных.

Какие есть решения для этого? И какие требования к ним? Свободное дисковое пространство и пр... Конечно хотелось бы чтобы это работало на живой БД - без остановки существующих на сервере процессов. Такое вообще возможно?

Решение нужно для серверов начиная с версии 9.6. Если такого нет, то конечно сможем обновляться вверх.
14 янв 22, 17:08    [22421221]     Ответить | Цитировать Сообщить модератору
 Re: Сделать партиционирование на живых таблицах  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 5087
balykovdron
Есть задача - партиционировать табличку с данными на несколько разных. Как это лучше сделать? До этого не сталкивались с подобными решениями.

Табличка (вообще их несколько разных, но не суть) очень большая (20 млн записей) и жирная (400 Gb).
Диски заканчиваются и хочется разнести данные на т.н. архивные данные на другой диск (партиция в другом TABLESPACE) и это бОльшая часть данных и т.н. оперативные данные. Архивные данные при этом также партицируем (например помесячно), чтобы ну очень старые данные отцеплять и куда-то убирать с сервера вообще. При этом - почему по партициям, потому что существующий софт не переписывается и должен видеть при желании весь набор данных.

Какие есть решения для этого? И какие требования к ним? Свободное дисковое пространство и пр... Конечно хотелось бы чтобы это работало на живой БД - без остановки существующих на сервере процессов. Такое вообще возможно?

Решение нужно для серверов начиная с версии 9.6. Если такого нет, то конечно сможем обновляться вверх.


Если от 9.6 то только старая схема партиционирования на наследовании и триггерах.
И вот как раз её проще внедрять на живую чем нативное.

PS: что вы под "решением" понимает? софтину которая за вас всё сделает? такого не бывает.
просто руками задача вполне реалистично решается...
https://www.postgresql.org/docs/9.6/ddl-partitioning.html


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
14 янв 22, 19:59    [22421294]     Ответить | Цитировать Сообщить модератору
 Re: Сделать партиционирование на живых таблицах  [new]
balykovdron
Member

Откуда:
Сообщений: 120
А если не 9.6? Какие могут быть варианты? Например для 14й версии.

Под решением я понимаю какой-то набор команд, при котором табличка станет партиционируемой, без изменения стороннего софта, который с ней работает. При этом работа БД не остановится (это идеальный вариант) или БД может быть недоступна только кратковременно.
17 янв 22, 10:33    [22422056]     Ответить | Цитировать Сообщить модератору
 Re: Сделать партиционирование на живых таблицах  [new]
mefman
Member

Откуда:
Сообщений: 3758
balykovdron
А если не 9.6? Какие могут быть варианты? Например для 14й версии.

Под решением я понимаю какой-то набор команд, при котором табличка станет партиционируемой, без изменения стороннего софта, который с ней работает. При этом работа БД не остановится (это идеальный вариант) или БД может быть недоступна только кратковременно.


В эту сторону смотри

begin; 

alter table pgbench_history rename to pgbench_history_old; 
create table pgbench_history (like pgbench_history_old) partition by range(mtime); 
alter table pgbench_history attach partition pgbench_history_old default; 

create table pgbench_history_20200713 (like pgbench_history_old including ALL); 

with x as ( 
delete from pgbench_history_old where mtime between '2020-07-13 00:00:00' and '2020-07-13 23:59:59' 
returning *) 
insert into pgbench_history_20200713 select * from x; 
alter table pgbench_history  
attach partition pgbench_history_20200713  
for values from ('2020-07-13 00:00:00') to ('2020-07-13 23:59:59'); 
commit; 


https://www.depesz.com/2019/03/19/migrating-simple-table-to-partitioned-how/
17 янв 22, 11:13    [22422081]     Ответить | Цитировать Сообщить модератору
 Re: Сделать партиционирование на живых таблицах  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1427
mefman,

долго будет.
Если место не совсем уже 95% used, то обычно делается просто вот так:

begin;
set local statement_timeout to '1s';
alter table tablename add constraint tablename_old_partition check(created_at < '2018-10-01') not valid;
commit;

alter table tablename validate constraint tablename_old_partition;

begin;
set local statement_timeout to '1s';
alter table tablename rename to tablename_olddata;
CREATE TABLE tablename ... PARTITION BY RANGE (created_at);
ALTER SEQUENCE public.tablename_id_seq OWNED BY public.tablename.id; -- если serial/bigserial
ALTER TABLE ONLY public.tablename ALTER COLUMN id SET DEFAULT nextval('public.tablename_id_seq'::regclass);
alter table tablename attach partition tablename_olddata for values from (minvalue) to ('2018-10-01');
create table tablename_p201810 partition of tablename for values from ('2018-10-01') to ('2018-11-01');
commit;

То есть имеющаяся таблица цепляется как есть одним куском исторического артефакта, дальше уже пишете партиции.

Если данные insert-only (не нужно волноваться про update/delete в старых данных) - то делаете копию этой исторической таблицы уже нарезанную на партиции и затем делаете detach partition плюс группу attach partition этих новых партиций.
17 янв 22, 11:30    [22422094]     Ответить | Цитировать Сообщить модератору
 Re: Сделать партиционирование на живых таблицах  [new]
mefman
Member

Откуда:
Сообщений: 3758
Melkij,
Это один из вариантов, разумеется.
В целом я это все к тому, что разнообразные примеры онлайн партиционирования отлично гуглятся.
17 янв 22, 11:43    [22422103]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить