Как перенести одну базу PostgreSQL на другой диск, не затрагивая остальные?

Системный администратор IT и автоматизация бизнеса
← На главную

При эксплуатации серверов баз данных PostgreSQL часто возникает ситуация, когда место на основном диске заканчивается, а расширить его невозможно. В таких случаях оптимальным решением является перенос наиболее объемной или нагруженной базы данных на другой физический носитель (например, на быстрый SSD диск E:). При этом важно сохранить работоспособность остальных баз в их исходном расположении. Разберем подробно, какими способами можно решить эту задачу, учитывая специфику работы с платформой 1С:Предприятие.

Метод 1. Использование механизма Tablespace (официальный способ PostgreSQL)

Это самый «правильный» с точки зрения СУБД метод. Он позволяет на уровне логики PostgreSQL указать, в какой именно папке на диске должны храниться файлы конкретной базы данных. Рассмотрим этот процесс по шагам.

Шаг 1. Подготовка папки и прав доступа. Прежде всего, создадим на новом диске целевую папку, например E:\pg_data\new_db_space. Крайне важно на данном этапе настроить права доступа. Служба PostgreSQL (обычно запущенная под учетной записью postgres или NetworkService) должна иметь полный доступ (Full Control) к этой папке. Если права не будут назначены, СУБД не сможет инициализировать файлы, и вы получите ошибку доступа.

Шаг 2. Создание табличного пространства. Теперь нам необходимо зарегистрировать это место в самой СУБД. Откроем pgAdmin или консоль psql и выполним команду:

CREATE TABLESPACE fast_disk LOCATION 'E:/pg_data/new_db_space';

Шаг 3. Перенос существующей базы. Чтобы переместить уже существующую базу данных в созданное пространство, необходимо сначала отключить от нее всех пользователей. Для 1С это означает временную остановку службы сервера 1С или блокировку соединений. После этого выполняем команду:

ALTER DATABASE имя_вашей_базы SET TABLESPACE fast_disk;

Проанализируем, что происходит в этот момент: PostgreSQL самостоятельно скопирует файлы данных из стандартного хранилища в новую папку и обновит системные каталоги. Это безопасный и надежный метод.

Метод 2. Использование символьных ссылок (Junction Points) в Windows

Если вы не хотите менять внутренние настройки PostgreSQL или опасаетесь сложностей с правами на уровне табличных пространств, можно воспользоваться механизмом файловой системы Windows — символьными ссылками. Этот метод «обманывает» систему: СУБД думает, что файлы лежат на диске C:, хотя фактически они находятся на E:.

Разберем этот алгоритм подробнее:

  1. Выясним идентификатор (OID) нужной базы данных. Это можно сделать через pgAdmin (в свойствах базы) или запросом SELECT oid, datname FROM pg_database;. Допустим, OID нашей базы — 16384.
  2. Остановим службу postgresql. Это обязательное условие, чтобы избежать повреждения данных.
  3. Найдем папку с данными базы. Обычно она находится по пути: C:\Program Files\PostgreSQL\data\base\16384.
  4. Перенесем (вырежем и вставим) папку 16384 на новый диск, например в E:\pg_data\16384.
  5. Создадим символьную ссылку (Junction) на месте старой папки. Для этого откроем командную строку от имени администратора и введем: mklink /J "C:\Program Files\PostgreSQL\data\base\16384" "E:\pg_data\16384"
  6. Запустим службу postgresql.

Этот метод хорош тем, что он абсолютно прозрачен для PostgreSQL и 1С. Однако помните, что при удалении базы данных через консоль СУБД, она может попытаться удалить и саму ссылку, и содержимое на диске E:.

Особенности работы с 1С:Предприятие при использовании Tablespace

Рассмотрим важный нюанс, с которым сталкиваются программисты 1С. При использовании механизма dt (выгрузка/загрузка информационной базы) платформа 1С при загрузке данных полностью пересоздает таблицы. По умолчанию 1С создает их в пространстве pg_default, что может привести к тому, что после восстановления из бэкапа ваша база «вернется» на диск C:, проигнорировав настройки табличного пространства базы данных.

Чтобы этого избежать, мы рекомендуем принудительно назначить пространство имен по умолчанию для пользователя (роли), под которым 1С подключается к базе:

ALTER ROLE имя_пользователя_1с SET default_tablespace = 'fast_disk';

После выполнения этой команды любая таблица, создаваемая этим пользователем (в том числе при загрузке .dt), будет автоматически создаваться на быстром диске E:.

Оптимизация производительности: перенос индексов и логов

Выясним причину, по которой иногда не требуется переносить всю базу целиком. Если ваша цель — ускорение работы 1С, проанализируем структуру нагрузки. Часто узким местом являются индексы или временные таблицы.

Перенос индексов: Вы можете создать отдельный Tablespace на самом быстром SSD (например, NVMe) и перенести туда только индексы самых тяжелых таблиц 1С. Это делается командой: ALTER INDEX имя_индекса SET TABLESPACE fast_ssd_space;.

Перенос логов транзакций (WAL): Еще один способ ускорить систему — вынести папку pg_wal (в старых версиях pg_xlog) на отдельный физический диск. Журналы транзакций пишутся последовательно, и если их поток отделен от случайного чтения/записи основных данных, общая производительность дисковой подсистемы значительно возрастает. Это также делается через остановку службы и создание символьной ссылки mklink для всей папки журналов.

Таким образом, мы рассмотрели несколько эффективных инструментов для управления дисковым пространством PostgreSQL. Выбор между использованием TABLESPACE и mklink зависит от ваших предпочтений в администрировании, но для долгосрочной эксплуатации в связке с 1С метод с табличными пространствами и настройкой default_tablespace для роли является наиболее надежным.

← На главную