При эксплуатации серверов баз данных PostgreSQL часто возникает ситуация, когда место на основном диске заканчивается, а расширить его невозможно. В таких случаях оптимальным решением является перенос наиболее объемной или нагруженной базы данных на другой физический носитель (например, на быстрый SSD диск E:). При этом важно сохранить работоспособность остальных баз в их исходном расположении. Разберем подробно, какими способами можно решить эту задачу, учитывая специфику работы с платформой 1С:Предприятие.
Это самый «правильный» с точки зрения СУБД метод. Он позволяет на уровне логики 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 самостоятельно скопирует файлы данных из стандартного хранилища в новую папку и обновит системные каталоги. Это безопасный и надежный метод.
Если вы не хотите менять внутренние настройки PostgreSQL или опасаетесь сложностей с правами на уровне табличных пространств, можно воспользоваться механизмом файловой системы Windows — символьными ссылками. Этот метод «обманывает» систему: СУБД думает, что файлы лежат на диске C:, хотя фактически они находятся на E:.
Разберем этот алгоритм подробнее:
pgAdmin (в свойствах базы) или запросом SELECT oid, datname FROM pg_database;. Допустим, OID нашей базы — 16384.postgresql. Это обязательное условие, чтобы избежать повреждения данных.C:\Program Files\PostgreSQL\data\base\16384.16384 на новый диск, например в E:\pg_data\16384.
mklink /J "C:\Program Files\PostgreSQL\data\base\16384" "E:\pg_data\16384"
postgresql.Этот метод хорош тем, что он абсолютно прозрачен для PostgreSQL и 1С. Однако помните, что при удалении базы данных через консоль СУБД, она может попытаться удалить и саму ссылку, и содержимое на диске E:.
Рассмотрим важный нюанс, с которым сталкиваются программисты 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 для роли является наиболее надежным.