Обновление базы данных PostgreSQL с помощью дампа и восстановление
Область применения: отдельный сервер Базы данных Azure для PostgreSQL
Внимание
База данных Azure для PostgreSQL — одиночный сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для PostgreSQL — гибкий сервер. Дополнительные сведения о миграции на База данных Azure для PostgreSQL — гибкий сервер см. в статье "Что происходит с одним сервером База данных Azure для PostgreSQL?".
Примечание.
Концепции, описанные в этой документации, применимы как к Базе данных Azure для PostgreSQL —отдельный сервер, так и к Базе данных Azure для PostgreSQL — гибкий сервер.
Вы можете обновить сервер PostgreSQL, развернутый в Базе данных Azure для PostgreSQL, перенеся базы данных на сервер более поздней основной версии, используя приведенные ниже методы.
- Автономный метод с использованием PostgreSQL pg_dump и pg_restore, при котором во время переноса данных возникает простой. В этом документе рассматривается именно этот метод обновления и переноса.
- Сетевой метод с использованием Database Migration Service (DMS). Этот метод обеспечивает сокращение времени простоя миграции и поддерживает синхронизацию целевой базы данных с исходной, и вы можете выбирать, когда выполнять отключение. Однако существует несколько предварительных условий и ограничений для использования DMS. Дополнительные сведения см. в документации по DMS.
- Метод обновления основной версии на месте с помощью База данных Azure для PostgreSQL — гибкий сервер. На месте функция обновления основной версии выполняет обновление основной версии сервера с помощью щелчка мыши. Это упрощает процесс обновления, минимизируя нарушения доступа пользователей и приложений к серверу. Обновления на месте — это более простой способ обновления основной версии экземпляра, так как он сохраняет имя сервера и другие параметры текущего сервера после обновления и не требует миграции данных или изменений в приложениях строка подключения. Обновления на месте выполняются быстрее и требуют меньшего времени простоя, чем перенос данных.
В следующей таблице приведено несколько рекомендаций, основанных на размерах баз данных и сценариях их использования.
База данных или сценарий | Дамп или восстановление (автономно) | DMS (в сети) |
---|---|---|
У вас небольшая база данных, и вы можете позволить себе простой при обновлении. | X | |
Небольшие базы данных (< 10 ГБ) | X | X |
Средние базы данных (10–100 ГБ) | X | X |
Большие базы данных (> 100 ГБ) | X | |
Допускается простой при обновлении (независимо от размера базы данных) | X | |
Возможно ли выполнение предварительных условий DMS, включая перезагрузку? | X | |
Можно ли избежать операций DDL и незанесенных в журнал таблиц во время процесса обновления? | X |
Это руководство содержит несколько методов автономной миграции и примеры, демонстрирующие, как можно выполнить миграцию с исходного сервера на целевой сервер, на котором работает более поздняя версия PostgreSQL.
Примечание.
Создание дампа и восстановление PostgreSQL можно выполнить различными способами. Вы можете выполнить миграцию с помощью одного из методов, приведенных в этом руководстве, или выбрать другие способы в соответствии с вашими потребностями. Подробный синтаксис создания дампа и восстановления с дополнительными параметрами приведен в описании pg_dump и pg_restore.
Предварительные условия для использования дампа и восстановления для Базы данных Azure для PostgreSQL
Чтобы приступить к выполнению этого руководства, вам потребуются следующее:
- Исходный сервер базы данных PostgreSQL с более ранней версией ядра, которое требуется обновить.
- Целевой сервер базы данных PostgreSQL с требуемой основной версией Базы данных Azure для PostgreSQL на отдельном сервере или Базы данных Azure для PostgreSQL на гибком сервере.
- Клиентская система PostgreSQL для выполнения команд dump и restore. Рекомендуется использовать более высокую версию базы данных. Например, если вы обновляетесь с PostgreSQL версии 9.6 до 11, используйте клиент PostgreSQL версии 11.
- Это может быть клиент Linux или Windows, на котором установлена среда PostgreSQL и программы командной строки pg_dump и pg_restore.
- Кроме того, можно использовать Azure Cloud Shell или выбрать Azure Cloud Shell в строке меню в правом верхнем углу портала Azure. Перед выполнением команд dump и restore потребуется выполнить вход в учетную запись:
az login
.
- Клиент PostgreSQL лучше всего запускать в том же регионе, что и исходный и целевой серверы.
Дополнительные сведения и рекомендации
- Строку подключения к исходным и целевым базам данных можно найти, щелкнув "Строки подключения" на портале.
- Возможно, на сервере выполняется несколько баз данных. Список баз данных можно найти, подключившись к исходному серверу и выполнив команду
\l
. - Создайте соответствующие базы данных на целевом сервере баз данных или добавьте параметр
-C
в командуpg_dump
, которая создает базы данных. - Не следует обновлять
azure_maintenance
или базы данных шаблонов. Если вы внесли какие-либо изменения в базы данных шаблонов, можно перенести эти изменения или внести их в целевую базу данных. - Ознакомьтесь с приведенными выше таблицами, чтобы определить, какая база данных подходит для этого режима миграции.
- Если вы хотите использовать Azure Cloud Shell, обратите внимание на то, что время ожидания сеанса истекает через 20 минут. Если размер Вашей базы данных составляет < 10 ГБ, вы можете выполнить обновление без истечения времени ожидания сеанса. В противном случае вам, возможно, придется держать сеанс открытым другими способами, например, нажимая любую клавишу каждые 10–15 минут.
Пример базы данных, используемый в этом руководстве
В этом разделе приведены примеры с использованием следующих имен исходных и целевых серверов, а также имен баз данных.
Description | Value |
---|---|
Исходный сервер (версии 9.5) | pg-95.postgres.database.azure.com |
База данных-источник | bench5gb |
Размер базы данных-источника | 5 ГБ |
Имя пользователя источника | pg@pg-95 |
Целевой сервер (версии 11) | pg-11.postgres.database.azure.com |
Целевая база данных | bench5gb |
Имя целевого пользователя | pg@pg-11 |
Примечание.
Гибкий сервер поддерживает PostgreSQL 11 и более поздней версии. Кроме того, имя пользователя гибкого сервера не требуется @dbservername.
Обновление баз данных с помощью автономных методов миграции
Вы можете использовать для обновления один из методов, описанных в этом разделе. При выполнении задач можно использовать следующие советы.
Если вы используете тот же пароль для источника и целевой базы данных, можно задать
PGPASSWORD=yourPassword
переменную среды. После этого вам не придется указывать пароль при каждом выполнении команд, таких как psql, pg_dump и pg_restore. Аналогичным образом можно настроить дополнительные переменные, напримерPGUSER
,PGSSLMODE
и т. д. (см. раздел Переменные среды PostgreSQL).Если серверу PostgreSQL требуются TLS/SSL-соединения (они используются по умолчанию на серверах Базы данных Azure для PostgreSQL), задайте переменную среды
PGSSLMODE=require
, чтобы инструмент pg_restore подключался через протокол TLS. Без протокола TLS может отобразиться такая ошибка:FATAL: SSL connection is required. Please specify SSL options and retry.
В командной строке Windows выполните команду
SET PGSSLMODE=require
перед выполнением команды pg_restore. В Linux или Bash выполните командуexport PGSSLMODE=require
перед выполнением команды pg_restore.
Внимание
Действия и методы, описанные в этом документе, — дать некоторые примеры команд pg_dump/pg_restore и не представляют всех возможных способов выполнения обновлений. Перед их использованием в рабочей среде рекомендуется протестировать и проверить команды в тестовой среде.
Перенос ролей
Роли (пользователи) — это глобальные объекты, которые необходимо перенести отдельно в новый кластер перед восстановлением базы данных. Можно использовать двоичный файл pg_dumpall
с параметром -r (--roles-only) для создания дампа.
Чтобы дампать все роли с паролями из исходного отдельного сервера, выполните следующие действия.
pg_dumpall -r --host=mySourceServer --port=5432 --username=myUser@mySourceServer --database=mySourceDB > roles.sql
Чтобы дампать все имена ролей без паролей с исходного гибкого сервера:
pg_dumpall -r --no-role-passwords --host=mySourceServer --port=5432 --username=myUser --database=mySourceDB > roles.sql
Внимание
В База данных Azure для PostgreSQL — пользователи гибкого сервера не могут получить доступ к таблице pg_authid, содержащей сведения об идентификаторах авторизации базы данных вместе с паролями пользователя. Поэтому получение паролей для пользователей невозможно. Рекомендуется использовать Azure Key Vault для безопасного хранения секретов.
Отредактируйте roles.sql
и удалите ссылки NOSUPERUSER
и NOBYPASSRLS
перед восстановлением содержимого с помощью psql на целевом сервере:
psql -f roles.sql --host=myTargetServer --port=5432 --username=myUser --dbname=postgres
Скрипт дампа не должен выполняться полностью без ошибок. В частности, поскольку скрипт выдает CREATE ROLE для каждой роли, существующей в исходном кластере, определенно, чтобы получить ошибку "роль уже существует" для суперпользователя начальной загрузки, например azure_pg_admin или azure_superuser. Эта ошибка безвредна, ее можно игнорировать. Использование параметра --clean
может привести к появлению дополнительных сообщений о безвредных ошибках для несуществующих объектов, но их можно минимизировать, добавив --if-exists
.
Метод 1. Использование pg_dump и psql
Этот метод состоит из двух этапов. Во-первых, создайте дамп файла SQL с исходного сервера с помощью pg_dump
. Вторым шагом является импорт файла на целевой сервер с помощью psql
. Дополнительные сведения см. в документе Перенос с использованием экспорта и импорта.
Метод 2. Использование pg_dump и pg_restore
В этом методе обновления сначала создается дамп с исходного сервера с помощью pg_dump
. Затем выполняется восстановление этого файла дампа на целевом сервере с помощью pg_restore
. Дополнительные сведения см. в документе Перенос с использованием дампа и восстановления.
Метод 3. Использование потоковой передачи данных дампа в целевую базу данных
Если у вас нет клиента PostgreSQL или вы хотите использовать Azure Cloud Shell, можно использовать этот метод. Дамп базы данных передается непосредственно на целевой сервер базы данных и не сохраняет дампа в клиенте. Этот метод можно использовать для клиента с ограниченным хранилищем, и его даже можно выполнять из Azure Cloud Shell.
Убедитесь, что база данных существует на целевом сервере, с помощью команды
\l
. Если база данных не существует, создайте базу данных.psql "host=myTargetServer port=5432 dbname=postgres user=myUser password=###### sslmode=mySSLmode"
postgres> \l postgres> create database myTargetDB;
Запустите создание дампа и восстановите в одной командной строке с помощью канала.
pg_dump -Fc --host=mySourceServer --port=5432 --username=myUser --dbname=mySourceDB | pg_restore --no-owner --host=myTargetServer --port=5432 --username=myUser --dbname=myTargetDB
Например,
pg_dump -Fc --host=pg-95.postgres.database.azure.com --port=5432 --username=pg@pg-95 --dbname=bench5gb | pg_restore --no-owner --host=pg-11.postgres.database.azure.com --port=5432 --username=pg@pg-11 --dbname=bench5gb
После завершения процесса обновления (миграции) можно протестировать приложение на целевом сервере.
Повторите эту процедуру для всех баз данных на сервере.
Например, в следующей таблице показано время, затраченное на миграцию с помощью метода потоковой передачи дампа. Пример данных заполняется с помощью pgbench. Так как база данных может иметь разное количество объектов с различными размерами, чем созданные pgbench таблицы и индексы, настоятельно рекомендуется протестировать дамп и восстановить базу данных, чтобы понять фактическое время, необходимое для обновления базы данных.
Размер базы данных | Примерное затраченное время |
---|---|
1 ГБ | 1–2 минуты |
5 ГБ | 8–10 минут |
10 ГБ | 15-20 минут |
50 ГБ | 1–1,5 часа |
100 ГБ | 2,5–3 часа |
Метод 4. Использование параллельного создания дампа и восстановления
Этот метод можно рассматривать, если в базе данных имеется несколько больших таблиц и необходимо распараллелить процесс создания дампа и восстановления этой базы данных. Кроме того, в клиентской системе должно быть достаточно места для размещения резервных дампов. Этот параллельный процесс создания дампа и восстановления сокращает время, необходимое для завершения всей миграции. Например, миграция базы данных pgbench размером в 50 ГБ методами 1 и 2 заняла 1–1,5 часа, тогда как на ее перенос этим методом потребовалось меньше 30 минут.
Для каждой базы данных на исходном сервере создайте соответствующую базу данных на целевом сервере.
psql "host=myTargetServer port=5432 dbname=postgres user=myuser password=###### sslmode=mySSLmode"
postgres> create database myDB;
Например,
psql "host=pg-11.postgres.database.azure.com port=5432 dbname=postgres user=pg@pg-11 password=###### sslmode=require" psql (12.3 (Ubuntu 12.3-1.pgdg18.04+1), server 13.3) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres> create database bench5gb; postgres> \q
Выполните команду pg_dump в формате каталога с числом заданий, равным 4 (число таблиц в базе данных). При более крупном уровне вычислений и большим количеством таблиц число заданий можно увеличить. Программа pg_dump создаст каталог для хранения сжатых файлов для каждого задания.
pg_dump -Fd -v --host=sourceServer --port=5432 --username=myUser --dbname=mySourceDB -j 4 -f myDumpDirectory
Например,
pg_dump -Fd -v --host=pg-95.postgres.database.azure.com --port=5432 --username=pg@pg-95 --dbname=bench5gb -j 4 -f dump.dir
Затем восстановите резервную копию на целевом сервере.
$ pg_restore -v --no-owner --host=myTargetServer --port=5432 --username=myUser --dbname=myTargetDB -j 4 myDumpDir
Например,
$ pg_restore -v --no-owner --host=pg-11.postgres.database.azure.com --port=5432 --username=pg@pg-11 --dbname=bench5gb -j 4 dump.dir
Совет
Описанный в этом документе процесс можно также использовать для обновления Базы данных Azure для PostgreSQL на Гибком сервере. Основное отличие заключается в том, что строка подключения для целевого гибкого сервера не содержит @dbName
. Например, если имя пользователя — pg
, то имя пользователя отдельного сервера в строке подключения будет иметь значение pg@pg-95
, а при использовании гибкого сервера можно просто указать pg
.
После обновления или миграции
После завершения обновления основной версии рекомендуется выполнить команду ANALYZE
в каждой базе данных, чтобы обновить таблицу pg_statistic
. В противном случае могут возникнуть проблемы производительности.
postgres=> analyze;
ANALYZE
Следующие шаги
- Убедившись, что целевая база данных работает должным образом, можно удалить старый сервер базы данных.
- Только для Базы данных Azure для PostgreSQL на отдельном сервере. Если вы хотите использовать ту же конечную точку базы данных, что и исходный сервер, то после удаления старого сервера базы данных-источника можно создать реплику чтения с именем старого сервера базы данных. После установления состояния стабильной репликации можно будет остановить реплику, что сделает сервер реплики независимым сервером. Дополнительные сведения см. в разделе Репликация.
Внимание
Настоятельно рекомендуется протестировать новую обновленную версию PostgreSQL, прежде чем использовать ее непосредственно для рабочей среды. Это включает сравнение параметров сервера между источником более старой версии и целевым объектом новой версии. Убедитесь, что они совпадают, и проверьте новые параметры, которые были добавлены в новой версии. Сведения о различиях между версиями можно найти здесь.