powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сделать партиционирование на живых таблицах
6 сообщений из 6, страница 1 из 1
Сделать партиционирование на живых таблицах
    #40126691
balykovdron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть задача - партиционировать табличку с данными на несколько разных. Как это лучше сделать? До этого не сталкивались с подобными решениями.

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

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

Решение нужно для серверов начиная с версии 9.6. Если такого нет, то конечно сможем обновляться вверх.
...
Рейтинг: 0 / 0
Сделать партиционирование на живых таблицах
    #40126728
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Сделать партиционирование на живых таблицах
    #40127152
balykovdron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если не 9.6? Какие могут быть варианты? Например для 14й версии.

Под решением я понимаю какой-то набор команд, при котором табличка станет партиционируемой, без изменения стороннего софта, который с ней работает. При этом работа БД не остановится (это идеальный вариант) или БД может быть недоступна только кратковременно.
...
Рейтинг: 0 / 0
Сделать партиционирование на живых таблицах
    #40127163
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balykovdron
А если не 9.6? Какие могут быть варианты? Например для 14й версии.

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


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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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/
...
Рейтинг: 0 / 0
Сделать партиционирование на живых таблицах
    #40127171
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mefman,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 этих новых партиций.
...
Рейтинг: 0 / 0
Сделать партиционирование на живых таблицах
    #40127175
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,
Это один из вариантов, разумеется.
В целом я это все к тому, что разнообразные примеры онлайн партиционирования отлично гуглятся.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сделать партиционирование на живых таблицах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]