Перенос базы данных PostgreSQL на другой диск в Windows — задача, с которой рано или поздно сталкивается каждый администратор. Причины могут быть разные: нехватка места на системном диске, оптимизация производительности или переход на более быстрые SSD. В большинстве случаев процедура не требует сложных манипуляций, но нужно учитывать нюансы работы PostgreSQL с путями и правами доступа.

Сразу скажу: перенос возможен без потери данных, но требует остановки сервера на время операции. Основные шаги — остановка службы, копирование файлов базы на новый диск, обновление конфигурации и запуск сервера с новыми параметрами. Далее разберём процесс подробно, с учетом типичных ошибок и способов их избежать.

Подготовка к переносу: что нужно знать

Перед тем как перенести базу PostgreSQL на другой диск, убедитесь, что у вас есть:

  • Права администратора на компьютере;
  • Доступ к конфигурационным файлам PostgreSQL (обычно в C:\Program Files\PostgreSQL\<версия>\data);
  • Достаточно свободного места на целевом диске (объём данных базы можно уточнить через pg_admin или командную строку);
  • Резервная копия базы на случай сбоев.

Стандартный путь к данным PostgreSQL в Windows — C:\Program Files\PostgreSQL\16\data. Здесь 16 — версия сервера. Уточните актуальный путь в файле postgresql.conf (параметр data_directory).

💡

Если вы используете PostgreSQL через Docker, перенос данных требует других действий — работайте с томами контейнеров, а не с файлами напрямую

Способ Плюсы Минусы Время простоя
Копирование файлов с изменением data_directory Быстро, сохраняет все настройки Требует остановки сервера 5–30 минут
Экспорт/импорт через pg_dump Подходит для переноса на другой сервер Долго для больших баз От часа (зависит от объёма)
Использование символических ссылок Нет простоя, гибкость Сложно в реализации, требует прав Минимальный

Способы переноса базы в Windows

Существует несколько подходов к переносу базы. Выбор зависит от версии PostgreSQL, структуры данных и требований к времени простоя. Рассмотрим основные:

Для большинства пользователей оптимален первый способ — копирование файлов с обновлением конфигурации. Он прост, надёжен и не требует глубоких знаний PostgreSQL.

Пошаговый перенос базы через копирование файлов

Этот метод подходит, если вы переносите базу на другой диск на том же сервере. Алгоритм следующий:

  1. Остановите службу PostgreSQL. Откройте Службы (services.msc) и найдите postgresql-x64-16 (где 16 — ваша версия). Нажмите Остановить.
  2. Скопируйте папку с данными. По умолчанию это C:\Program Files\PostgreSQL\16\data. Используйте Robocopy для точного копирования: robocopy "C:\Program Files\PostgreSQL\16\data" "D:\PostgreSQL\data" /E /COPYALL /R:1 /W:1 Флаги /E — копировать все подкаталоги (включая пустые), /COPYALL — сохранить атрибуты и права доступа.
  3. Настройте новый путь в конфигурации. Откройте файл postgresql.conf (лежит в старой папке data) и измените параметр: data_directory = 'D:/PostgreSQL/data'.
  4. Обновите путь в системной переменной (если нужно). Иногда PostgreSQL использует переменную окружения PGDATA. Проверьте её через Свойства системы → Переменные среды.
  5. Запустите службу. В Службы найдите postgresql-x64-16 и нажмите Запустить.
⚠️ Внимание: если после запуска сервер не стартует, проверьте права доступа на новую папку data. Убедитесь, что пользователь postgres (или SYSTEM) имеет полный доступ.
Какой способ переноса PostgreSQL вы используете чаще?
Копирование файлов
pg_dump/pg_restore
Символические ссылки
Другое

Настройка прав доступа для новой папки

Ошибка прав — самая частая причина сбоев после переноса. PostgreSQL в Windows работает под учётной записью postgres (или NETWORK SERVICE, если установлен как служба). Чтобы избежать проблем:

Действие Для пользователя Описание
Полный доступ postgres Необходим для работы с файлами базы
Чтение и выполнение SYSTEM Требуется для системных операций
Изменение Администраторы Для ручного управления файлами

Как проверить права:

  1. Правый клик на папку D:\PostgreSQL\data → Свойства → Безопасность.
  2. Нажмите Изменить → Добавить → введите postgres (или имя пользователя, под которым работает служба).
  3. Выдайте Полный доступ и примените изменения ко всем вложенным папкам.

Если учёта postgres нет в системе, создайте её вручную через Упровление компьютером → Локальные пользователи и группы.

Права доступа — 90% успеха при переносе PostgreSQL в Windows. Проверяйте их в первую очередь, если сервер не стартует

Проверка работоспособности после переноса

После запуска службы выполните несколько проверок, чтобы убедиться, что перенос прошёл успешно:

  • Подключитесь к базе. Используйте psql -U postgres или pgAdmin. Если подключение прошло — файл сервера работает.
  • Проверьте таблицы. Выполните запрос SELECT datname FROM pg_database; — должны отобразиться все ваши базы.
  • Тестируйте запись/чтение. Создайте тестовую таблицу и добавьте в неё данные. Убедитесь, что изменения сохраняются.

Если что-то пошло не так, смотрите логи PostgreSQL. Они находятся в папке data\log (или в пути, указанном в postgresql.conf в параметре log_directory).

Перенос базы с помощью pg_dump и pg_restore

Если вы хотите перенести базу на другой диск или на другой сервер, используйте утилиты pg_dump и pg_restore. Это универсальный метод, но он дольше и требует больше места на диске.

Вот как это сделать:

  1. Создайте дамп базы. pg_dump -U postgres -F c -f D:\backup\mydb.dump mydb
    • -U postgres — пользователь;
    • -F c — формат кастомизированный (подходит для pg_restore);
    • -f — файл для дампа;
    • mydb — имя базы.
  2. Создайте новую базу на целевом диске. Если сервер уже настроен на новый диск, подключитесь к нему и выполните: CREATE DATABASE mydb;
  3. Восстановите данные. pg_restore -U postgres -d mydb -C D:\backup\mydb.dump Флаг -C создаёт объекты базы автоматически.

Этот способ подходит, если вы мигрируете на новую версию PostgreSQL или хотите перенести только определённые базы, а не всё содержимое каталога data.

Частые ошибки и их решения

Даже при точном следовании инструкции могут возникнуть проблемы. Рассмотрим типовые:

Ошибка

"FATAL: data directory "D:/PostgreSQL/data" has wrong ownership": Проверьте, что пользователь, под которым работает служба PostgreSQL, имеет права на папку. В Windows это может быть учётная запись postgres или SYSTEM. Исправьте права через Свойства папки → Безопасность.

  1. Сервер не запускается после переноса. Проверьте:
    • Права доступа на новую папку;
    • Корректность пути в data_directory (используйте прямые слеши / или двойные обратные \\);
    • Отсутствие пробелов или кириллицы в пути (лучше использовать D:\pgsql\data, а не D:\Мои данные\pgsql).
  2. Ошибка "database system is starting up". Это нормально — подождите несколько минут. Если сообщение висит дольше 5–10 минут, проверьте логи.
  3. Потеряны данные после восстановления. Убедитесь, что дамп создавался с флагом -F c (кастомизированный формат), и восстанавливайте в пустую базу.

Практические советы для ускорения процесса

Чтобы перенос базы PostgreSQL прошёл максимально быстро и безболезненно:

Чек-лист перед переносом

Выполнено: 0 / 5
  • Используйте SSD. Если переносите базу на новый диск, отдайте предпочтение SSD — это ускорит работу PostgreSQL в несколько раз.
  • Проверьте фрагментацию. Если базу давно не оптимизировали, перед переносом выполните VACUUM FULL для всех таблиц.
  • Настройте pg_hba.conf. Если вы изменили IP-адрес сервера или путь к данным, обновляйте этот файл (лежит в папке data).
  • Тестируйте на тестовом сервере. Если у вас есть возможность, отработайте перенос на тестовой машине.

Часто задаваемые вопросы

Можно ли перенести базу без остановки сервера?

Технически можно использовать символические ссылки или репликацию, но для простого переноса на другой диск в Windows обязательно нужно останавливать сервер. Иначе рискуете повредить файлы базы.

Сколько времени занимает перенос базы объёмом 100 ГБ?

Время зависит от скорости дисков и метода. Копирование файлов через robocopy на может занять 10–30 минут. Экспорт через pg_dump для такой базы займёт от 1 до 3 часов.

Что делать, если после переноса не видит базу?

Проверьте:

  1. Корректность пути в data_directory;
  2. Права доступа на новую папку;
  3. Отсутствие ошибок в логах (data\log\postgresql-*.log);
  4. Что service Postgres запущен под тем же пользователем, что и раньше.
Можно ли перенести только часть базы (несколько таблиц)?

Да, с помощью pg_dump укажите конкретные таблицы: pg_dump -U postgres -t table1 -t table2 -f backup.dump mydb. Но учтите: зависимости между таблицами (внешние ключи, триггеры) могут потребовать дополнительной настройки.