
Перемещение базы PostgreSQL между серверами требует учёта версий сервера, формата хранения данных и особенностей кодировки. Например, дамп, созданный в PostgreSQL 15, может быть развёрнут на версии 14, но не наоборот, а различия в локали и collation влияют на сортировку строк и работу индексов. Поэтому перед началом переноса необходимо зафиксировать текущую версию сервера, список расширений и параметры кластера, чтобы избежать несовместимости уже на этапе импорта.
На практике чаще всего используется логический перенос через pg_dump и pg_restore, так как он позволяет переносить данные между разными операционными системами и архитектурами процессоров. При этом важно выбирать формат архива, который поддерживает параллельное восстановление и выборочный импорт схем, таблиц или только данных. Такой подход ускоряет развёртывание на новом компьютере и упрощает отладку проблем, связанных с повреждёнными объектами.
Отдельного внимания требует перенос ролей, владельцев объектов и прав доступа. В дамп базы они не всегда включаются автоматически, поэтому на целевой системе необходимо заранее создать пользователей и сопоставить им идентификаторы, либо выполнить отдельный экспорт глобальных объектов. Игнорирование этого шага приводит к тому, что приложения теряют доступ к таблицам, а фоновые задания и триггеры начинают завершаться с ошибками.
После восстановления базы на новом компьютере важно проверить не только наличие данных, но и корректность работы зависимых сервисов: соединение через пуллер, выполнение сложных запросов, использование расширений вроде PostGIS или pg_trgm. Нагрузочное тестирование и сверка контрольных сумм таблиц позволяют выявить расхождения, которые не видны при поверхностной проверке, и завершить перенос без скрытых проблем в продакшене.
Проверка версии PostgreSQL и кодировки перед началом переноса

Первым шагом фиксируется версия сервера-источника и сервера-приёмника, так как логический дамп из более новой версии не разворачивается в более старой. Например, база из PostgreSQL 15 без проблем восстанавливается в 16, но попытка загрузить её в 14 завершится ошибками из-за несовпадения системных каталогов и поддерживаемых типов данных. Совпадение основных и минорных версий упрощает перенос расширений, триггеров и пользовательских функций.
Отдельно проверяется набор установленных расширений через системные представления, поскольку такие модули, как PostGIS, uuid-ossp или pg_stat_statements, должны быть доступны и на целевом сервере до начала восстановления дампа. Если версия расширения отличается, возможны конфликты схем и ошибки при создании объектов, которые были сформированы на источнике.
Кодировка базы и параметры локали напрямую влияют на сравнение и сортировку строк. Значения ENCODING, LC_COLLATE и LC_CTYPE определяют, как работают индексы и операторы LIKE, поэтому они должны совпадать между старым и новым кластером. Например, база в UTF8 с русской локалью ru_RU.UTF-8 при восстановлении в кластере с en_US.UTF-8 приведёт к пересозданию индексов и изменению порядка сортировки данных.
Если целевой сервер развёрнут с другими локалями, правильным решением становится создание новой базы с теми же параметрами кодировки и сортировки, что и у источника, и только затем импорт дампа. Такой подход исключает скрытые расхождения в результатах запросов и предотвращает появление дублирующихся ключей в уникальных индексах после переноса.
Создание резервной копии базы через pg_dump с нужными параметрами

Для переноса между компьютерами оптимально использовать pg_dump в формате custom или directory, так как они поддерживают сжатие и параллельное восстановление. Эти форматы сохраняют структуру схем, данные, индексы и зависимости в виде архива, который можно выборочно разворачивать на целевом сервере, что особенно полезно при больших объёмах или частичных миграциях.
При создании дампа важно зафиксировать владельцев объектов и привилегии, иначе после импорта роли потеряют доступ к таблицам и представлениям. Параметры, отвечающие за сохранение прав, должны быть включены вместе с описанием схемы, чтобы триггеры, последовательности и внешние ключи были восстановлены в исходном виде без ручной донастройки.
Для баз с объёмом в сотни гигабайт рекомендуется задействовать параллельный режим экспорта, который разбивает выгрузку на несколько потоков и снижает время простоя. Дополнительно имеет смысл исключить временные или кэшируемые таблицы, если они могут быть пересозданы приложением, что уменьшает размер архива и ускоряет последующее развёртывание.
После завершения создания дампа его целостность проверяется встроенными средствами PostgreSQL и контрольными суммами файлов архива. Наличие повреждённых сегментов приведёт к сбоям при восстановлении, поэтому проверка выполняется до передачи резервной копии на другой компьютер.
Передача дампа базы данных на целевой компьютер и проверка его целостности

Дамп PostgreSQL передаётся на целевой компьютер по зашифрованному каналу, чтобы исключить повреждение и утечку данных при передаче. Для больших архивов предпочтительны протоколы, поддерживающие возобновление передачи и проверку блоков, так как обрыв соединения на середине файла делает резервную копию непригодной для восстановления.
После копирования файла на новый сервер выполняется проверка контрольной суммы, созданной на исходной машине. Совпадение хешей подтверждает, что архив не был изменён или частично утрачен, а любое расхождение указывает на необходимость повторной передачи до начала развёртывания базы.
Для дампов в формате directory дополнительно сверяется количество и размер всех сегментов архива, поскольку отсутствие даже одного файла приведёт к ошибкам при восстановлении таблиц или индексов. Такая проверка занимает считанные минуты, но избавляет от необходимости повторного экспорта базы на исходном компьютере.
Только после подтверждения целостности архива его имеет смысл подключать к процессу восстановления на целевом сервере, что снижает риск остановки импорта на позднем этапе и потери времени при миграции.
Развёртывание базы из дампа с помощью psql или pg_restore

Способ восстановления зависит от формата дампа: архивы в custom и directory разворачиваются через pg_restore, а текстовые SQL-файлы загружаются через psql. Перед началом на целевом сервере создаётся пустая база с теми же параметрами кодировки и локали, что и у источника, иначе индексы и уникальные ограничения могут быть построены с другими правилами сравнения строк.
При работе с pg_restore имеет смысл включать параллельный режим, который позволяет одновременно создавать таблицы, индексы и загружать данные в несколько потоков. Это снижает время простоя на десятки процентов при объёмах в десятки и сотни гигабайт, особенно если диск и процессор не являются узким местом.
Если требуется восстановить только часть базы, pg_restore позволяет выбирать отдельные схемы, таблицы или типы объектов, что удобно при поэтапной миграции или тестовом запуске. Для SQL-дампов такой гибкости нет, поэтому их применяют только при простых переносах без выборочного импорта.
В процессе восстановления контролируется журнал сервера PostgreSQL, где сразу видны ошибки создания объектов, несоответствие расширений или проблемы с правами. Обнаруженные сбои устраняются до загрузки данных, чтобы не допустить частично созданных таблиц и нарушенных связей между ними.
Настройка ролей, прав доступа и владельцев объектов после импорта
После развёртывания базы из дампа все пользователи и их идентификаторы должны существовать на целевом сервере, иначе объекты будут принадлежать системному владельцу и приложения не смогут к ним обращаться. Сопоставление ролей источника и приёмника проверяется до выдачи прав, чтобы избежать ситуации, когда один логин получает доступ к данным другого.
В первую очередь приводятся в порядок владельцы схем, таблиц и последовательностей, поскольку именно они определяют, кто может изменять структуру базы и управлять индексами.
- проверяется владелец каждой схемы и при необходимости назначается корректная роль
- таблицы и представления переводятся под контроль пользователей, которые работают с ними в приложении
- последовательности связываются с теми же владельцами, что и соответствующие таблицы
Далее восстанавливаются права доступа, которые регулируют чтение, запись и выполнение функций. Без этой настройки фоновые задания, отчёты и внешние сервисы будут получать ошибки доступа даже при наличии правильных логинов.
- выдаётся SELECT, INSERT, UPDATE и DELETE на таблицы для прикладных ролей
- назначаются права на использование схем и выполнение функций
- проверяются привилегии на последовательности, отвечающие за автоинкремент
После применения прав выполняется проверка под каждой ключевой ролью, чтобы убедиться, что запросы выполняются без отказов и данные доступны в тех же пределах, что и на исходном компьютере.
Проверка работоспособности приложений после переноса базы
После переноса базы необходимо убедиться, что все клиентские приложения корректно подключаются к новому серверу и выполняют ключевые операции без ошибок. Проверка включает выполнение тестовых запросов, контроль корректности выборок и обновлений данных, а также проверку работы триггеров и фоновых процедур.
Особое внимание уделяется сложным запросам с сортировкой и фильтрацией, зависящей от локали и кодировки. Несовпадение LC_COLLATE или LC_CTYPE между старым и новым сервером может изменять результаты ORDER BY и сравнения строк, что проявляется в ошибках бизнес-логики.
Для приложений с пулом соединений проверяется, что все подключения корректно открываются и закрываются, а новые транзакции обрабатываются в том же порядке, что и на исходном сервере. Нарушения в конфигурации ролей или прав доступа выявляются на этом этапе через отказ в выполнении INSERT, UPDATE или DELETE.
Также рекомендуется сравнить контрольные суммы таблиц или количество записей в критичных таблицах, чтобы убедиться в полном переносе данных. Любые расхождения фиксируются и исправляются до перевода приложений в продуктивный режим, чтобы исключить потерю данных или некорректные расчёты.
Вопрос-ответ:
Можно ли переносить базу из PostgreSQL 15 на сервер с версией 14?
Нет, дамп из более новой версии PostgreSQL может содержать типы данных и функции, которых нет в старой версии. Попытка восстановления приведёт к ошибкам создания объектов. Для переноса на более старую версию нужно использовать промежуточный экспорт данных в формате CSV или пересоздавать объекты вручную.
Какие параметры pg_dump лучше использовать для больших баз данных?
Для баз объёмом сотни гигабайт рекомендуется использовать формат custom или directory с включением параллельного экспорта через ключ -j. Это позволяет разбить процесс на несколько потоков, ускоряет загрузку и позволяет выбирать отдельные схемы или таблицы для восстановления. Также стоит сохранять владельцев и права доступа, чтобы потом не переназначать их вручную.
Как проверить, что дамп был передан на целевой сервер без ошибок?
После копирования файла проверяется контрольная сумма с исходным дампом, например через sha256sum. Для архивов формата directory дополнительно сверяется количество файлов и их размеры. Любое расхождение указывает на необходимость повторной передачи. Это предотвращает проблемы при восстановлении и сохранение целостности данных.
Что делать, если после восстановления базы приложения не могут подключиться к таблицам?
Скорее всего, на целевом сервере отсутствуют роли или права доступа, соответствующие владельцам объектов. Нужно проверить владельцев схем, таблиц и последовательностей и назначить их существующим пользователям. Затем установить права SELECT, INSERT, UPDATE и DELETE для прикладных ролей. После этого приложения получат доступ к таблицам и корректно выполнят операции.
Как убедиться, что перенос не изменил результаты запросов?
Проверяются сложные SELECT-запросы, сортировка и фильтры по строкам, особенно для баз с русской или нестандартной локалью. Рекомендуется сравнить количество записей и контрольные суммы критичных таблиц. Также тестируются триггеры, последовательности и фоновые процедуры, чтобы убедиться, что они работают идентично исходному серверу.
Можно ли переносить базу PostgreSQL с Windows на Linux без потери данных и индексов?
Да, но при этом важно учитывать формат дампа и кодировку базы. Для таких переносов рекомендуется использовать pg_dump в формате custom или directory, так как они сохраняют структуру таблиц, индексы, последовательности и триггеры. После копирования архива на Linux-сервер следует проверить контрольную сумму файлов и создать базу с такой же кодировкой и локалью, что и на исходной системе. Только после этого выполняется восстановление через pg_restore с указанием параллельного режима при больших объёмах. Если кодировка или локаль будут отличаться, индексы на текстовых полях могут изменять порядок сортировки и сравнения, что приведёт к некорректным результатам запросов.
