Разделение Tablespaces в PostgreSQL: Оптимизация дисков SSD NVMe и HDD
- Нехватка дискового пространства на высокоскоростных дорогостоящих SSD/NVMe массивах.
- Высокая стоимость хранения редко запрашиваемых исторических данных (logs, audit, архивные проводки).
- Необходимость изоляции I/O нагрузки временных файлов от основных таблиц БД.
1. Подготовка каталогов на уровне файловой системы Linux
# Создание точек монтирования для быстрого NVMe и емкого HDD
mkdir -p /mnt/nvme_fast/pg_tablespaces/fast_space
mkdir -p /mnt/hdd_cold/pg_tablespaces/cold_space
# Назначение владельца postgres
chown -R postgres:postgres /mnt/nvme_fast/pg_tablespaces
chown -R postgres:postgres /mnt/hdd_cold/pg_tablespaces
chmod 700 /mnt/nvme_fast/pg_tablespaces/fast_space
chmod 700 /mnt/hdd_cold/pg_tablespaces/cold_space2. Создание Tablespaces в PostgreSQL
CREATE TABLESPACE fast_nvme LOCATION '/mnt/nvme_fast/pg_tablespaces/fast_space';
CREATE TABLESPACE cold_hdd LOCATION '/mnt/hdd_cold/pg_tablespaces/cold_space';
-- Тюнинг стоимостных параметров планировщика под тип накопителя
ALTER TABLESPACE fast_nvme SET (random_page_cost = 1.1, seq_page_cost = 1.0);
ALTER TABLESPACE cold_hdd SET (random_page_cost = 4.0, seq_page_cost = 1.0);3. Перенос существующих таблиц и индексов на другой Tablespace
-- Перенос таблицы на быстрый диск (не блокирует чтение, блокирует запись)
ALTER TABLE active_orders SET TABLESPACE fast_nvme;
-- Перенос индекса на NVMe
ALTER INDEX idx_active_orders_id SET TABLESPACE fast_nvme;
-- Перенос исторической архивной таблицы на холодный HDD
ALTER TABLE archived_logs_2023 SET TABLESPACE cold_hdd;4. Настройка Tablespace для временных файлов
Отредактируйте postgresql.conf для сброса временных файлов сортировок на отдельный массив:
temp_tablespaces = 'fast_nvme' Частые вопросы (FAQ)
Блокирует ли ALTER TABLE ... SET TABLESPACE таблицу для пользователей?
Команда берет эксклюзивную блокировку AccessExclusiveLock на таблицу на время физического перемещения файлов данных с одного диска на другой, запрещая чтение и запись.
Можно ли создавать табличное пространство внутри директории PGDATA?
Нет, ядро PostgreSQL категорически запрещает размещать целевой каталог Tablespace внутри каталога PGDATA во избежание рекурсивных циклов при резервном копировании.
Как узнать, в каком табличном пространстве находится таблица?
Запросите каталог: SELECT tablename, tablespace FROM pg_tables WHERE tablename = 'my_table';. Если поле tablespace пустое, таблица использует пространство по умолчанию (pg_default).
Что произойдет при отказе диска, на котором расположен один из Tablespaces?
Весь кластер PostgreSQL перейдет в режим сбоя или аварийно остановится, так как транзакционный механизм WAL требует консистентности всех связанных пространств данных.