Migrate offline, from an Azure VM or an on-premises PostgreSQL server to Azure Database for PostgreSQL, with the migration service
07/28/2025
This article guides you in migrating a PostgreSQL instance from your on-premises or Azure virtual machines (VMs) to Azure Database for PostgreSQL flexible server in offline mode.
The migration service in Azure Database for PostgreSQL is a fully managed service integrated into the Azure portal and Azure CLI. It's designed to simplify your migration journey to the Azure Database for PostgreSQL flexible server.
Prerequisites
Perform the migration
Monitor the migration
Check the migration when completed
Prerequisites
To begin the migration, you need the following prerequisites:
Before starting the migration with the Azure Database for PostgreSQL migration service, it is important to fulfill the following prerequisites, specifically designed for offline migration scenarios.
The SKU chosen for the Azure Database for PostgreSQL should correspond with the specifications of the source database to ensure compatibility and adequate performance.
When migrating across PostgreSQL versions (major or minor), ensure compatibility between your database and application by reviewing the release notes for potential breaking changes.
Configure network setup
Network setup is crucial for the migration service to function correctly. Ensure that the source PostgreSQL server can communicate with the target Azure Database for PostgreSQL server. The following network configurations are essential for a successful migration.
To facilitate connectivity between the source and target PostgreSQL instances, it's essential to verify and potentially modify the pg_hba.conf file of the source server. This file includes client authentication and must be configured to allow the target PostgreSQL to connect to the source. Changes to the pg_hba.conf file, typically require a restart of the source PostgreSQL instance to take effect.
The pg_hba.conf file is located in the data directory of the PostgreSQL installation. This file should be checked and configured, if the source database is an on-premises PostgreSQL server or a PostgreSQL server hosted on an Azure VM.
Enable extensions
To ensure a successful migration by using the migration service in Azure Database for PostgreSQL, you might need to verify extensions to your source PostgreSQL instance. Extensions provide functionality and features that might be required for your application. Make sure that you verify the extensions on the source PostgreSQL instance before you initiate the migration process.
In the target instance of Azure Database for PostgreSQL flexible server, enable supported extensions that are identified in the source PostgreSQL instance.
These parameters aren't automatically migrated to the target environment, and must be manually configured.
Match server parameter values from the source PostgreSQL database to the Azure Database for PostgreSQL by accessing the Server parameters page in the Azure portal, and manually updating the values accordingly.
Save the parameter changes and restart the Azure Database for PostgreSQL to apply the new configuration, if necessary.
Check users and roles
When migrating to Azure Database for PostgreSQL, it's essential to address the migration of users and roles separately, as they require manual intervention:
Manual migration of users and roles: Users and roles must be manually migrated to the Azure Database for PostgreSQL. To facilitate this process, you can use the pg_dumpall utility with the --globals-only flag to export global objects, such as roles and users. Execute the following command, replacing <<username>> with the actual username, and <<filename>> with your desired output file name:
Restriction on superuser roles: Azure Database for PostgreSQL doesn't support superuser roles. Therefore, users with superuser privileges must have those privileges removed before migration. Ensure that you adjust the permissions and roles accordingly.
By following these steps, you can ensure that user accounts and roles are correctly migrated to the Azure Database for PostgreSQL without encountering issues related to superuser restrictions.
Disable high availability (reliability) and read replicas in the target
Disabling high availability (reliability) and reading replicas in the target environment is essential. These features should be enabled only after the migration is completed.
By following these guidelines, you can help ensure a smooth migration process, without the added variables introduced by high availability and read replicas. Once the migration is complete and the database is stable, you can proceed to enable these features to enhance the availability and scalability of your database environment in Azure.
Perform the migration
You can migrate by using Azure portal or Azure CLI.
This article guides you using the Azure portal to migrate your PostgreSQL database from an Azure VM or an on-premises PostgreSQL server to an Azure Database for PostgreSQL. The Azure portal allows you to perform various tasks, including database migration. Following the steps outlined in this tutorial, you can seamlessly transfer your database to Azure and take advantage of its powerful features and scalability.
Configure the migration task
The migration service comes with a simple, wizard-based experience on the Azure portal.
Select your Azure Database for PostgreSQL flexible server.
In the resource menu, select Migration.
Select Create to go through a wizard-based series of tabs to perform a migration to a flexible server from on-premises or Azure VM.
Note
The first time you use the migration service, an empty grid appears with a prompt to begin your first migration.
If migrations to your flexible server target have already been created, the grid now contains information about attempted migrations.
Setup
You need to provide multiple details related to the migration, like the migration name, source server type, option, and mode.
Migration name is the unique identifier for each migration to this flexible server target. This field accepts only alphanumeric characters and doesn't accept any special characters except a hyphen (-). The name can't start with a hyphen and should be unique for a target server. No two migrations to the same flexible server target can have the same name.
Source server type - Depending on your PostgreSQL source, you can select Azure Virtual Machine or On-premise server.
Migration option - Allows you to perform validations before triggering a migration. You can pick any of the following options:
Validate - Checks your server and database readiness for migration to the target.
Validate and migrate — Performs validation before triggering a migration. If there are no validation failures, the migration is initiated.
Choosing the Validate or Validate and migrate option is always a good practice for performing premigration validations before running the migration.
To learn more about the premigration validation, visit premigration.
Migration mode allows you to pick the mode for the migration. Offline is the default option. In this case, we'll use the default.
Select Next: Runtime server.
Runtime server
The migration runtime server is a specialized feature within the migration service in Azure Database for PostgreSQL, designed to act as an intermediary server during migration. It's a separate Azure Database for PostgreSQL flexible server instance that isn't the target server, but is used to facilitate the migration of databases from a source environment that is only accessible via a private network.
The Source server tab prompts you to give details related to the source selected in the Setup tab, which is the source of the databases.
Server name - Provide the name of the host or the IP address of the source PostgreSQL server.
Port - Port number of the source server.
Administrator login - Name of the administrator user of the source PostgreSQL server.
Password - Password of the administrator login provided to connect to source PostgreSQL server.
SSL mode - Supported values are preferred and required. When the SSL at the source PostgreSQL server is OFF, use prefer. If the SSL at the source server is ON, use the require. SSL values can be determined in postgresql.conf file of the source server.
Test connection — Performs the connectivity test between the target and source. Once the connection is successful, you can proceed to the next tab. These test aims to identify any connectivity issues that might exist between the target and source servers, including verification of authentication using the credentials supplied. Establishing a test connection takes a few seconds.
After the successful test connection, select Next: Target server.
Target server
The Target server tab displays metadata for the flexible server target, such as the subscription name, resource group, server name, location, and PostgreSQL version.
Administrator login - Name of the administrator user of the target PostgreSQL server.
Password - Password of the administrator login provided to connect to target PostgreSQL server.
Custom FQDN or IP address: The custom FQDN or IP address field is optional, and can be used when the target is behind a custom DNS server or has custom DNS namespaces, making it accessible only via specific FQDNs or IP addresses. For example, this could include entries like production-flexible-server.example.com, 198.1.0.2, or a PostgreSQL FQDN such as production-flexible-server.postgres.database.azure.com, if the custom DNS server contains the DNS zone postgres.database.azure.com or forward queries for this zone to 168.63.129.16, where the FQDN is resolved in the Azure public or private DNS zone.
Test connection — Performs the connectivity test between the source and target. Once the connection is successful, you can proceed to the next tab. These test aims to identify any connectivity issues that might exist between the source and target servers, including verification of authentication using the credentials supplied. Establishing a test connection takes a few seconds.
After the successful test connection, select the Next: Databases to validate or migrate
Databases to validate or migrate
Under the Databases to validate or migrate tab, you can choose a list of user databases to migrate from your source PostgreSQL server.
After selecting the databases, select Next: Summary.
Summary
The Summary tab summarizes all the source and target details for creating the validation or migration. Review the details and select Start validation and migration.
Cancel the validation or migration
You can cancel any ongoing validations or migrations. The workflow must be in the In progress status so that it can be canceled. You can't cancel a validation or migration in the Succeeded or Failed state.
Canceling a validation stops further validation activity, and the validation moves to a Canceled state.
Canceling a migration stops further migration activity on your target server and moves to a Canceled state. The cancel action returns all changes the migration service makes on your target server.
This article explores using the Azure CLI to migrate your PostgreSQL database from an Azure virtual machine or an on-premises PostgreSQL instance to an Azure Database for PostgreSQL. The Azure CLI provides a powerful and flexible command-line interface that allows you to perform various tasks, including database migration. Following the steps outlined in this article, you can seamlessly transfer your database to Azure and take advantage of its powerful features and scalability.
Once the CLI is installed, open the command prompt and log into your Azure account using the below command.
az login
Configure the migration task
To begin the migration, create a JSON file with the migration details. The JSON file contains the following information:
Edit the below placeholders << >> in the JSON lines and store them in the local machine as <<filename>>.json where the CLI is being invoked. In this tutorial, we have saved the file in c:/migration-CLI/migration_body.json
When configuring the JSON properties for the migration to Azure Database for PostgreSQL flexible server, if your source environment is an Azure Virtual Machine, you can specify the source type using the "sourceType":"AzureVM" property. This helps the migration service understand the environment from which the data is being migrated.
Run the following command to check if any migrations are running. The migration name is unique across the migrations within the Azure Database for PostgreSQL flexible server target.
az postgres flexible-server migration list --subscription <subscription_id> --resource-group <resource_group> --name <target_server> --filter all
In the above steps, there are no migrations performed so we start with the new migration by running the following command.
Run the following command to see the status of the migration initiated in the previous step. You can check the status of the migration by providing the migration name.
az postgres flexible-server migration show --subscription <subscription_id> --resource-group <resource_group> --name <target_server> --migration-name <migration>
The progress and status of the migration is shown in Azure CLI.
You can also see the progress and status in Azure portal.
You can cancel any ongoing migration attempts using the cancel command. This command stops the particular migration attempt, and rolls back all changes that it could have made on your target server. Following is the CLI command to cancel migration that has an "In progress" status.
After you select the Start validation and migration button, a notification appears, in a few seconds, to say that the validation or migration creation is successful. You're automatically redirected to the flexible server's Migration page. The entry shows Status as In progress. The workflow takes 2 to 3 minutes to set up the migration infrastructure and check network connections.
The grid that displays the migrations has the following columns: Name, Status, Migration mode, Migration type, Source server, Source server type, Databases, Duration, and Start time. The entries are displayed sorted by Start time in descending order, with the most recent entry on the top. You can use the Refresh button in the toolbar, to refresh the status of the validation or migration run.
Migration details
Select the migration name in the grid to see the associated details.
Remember that in the previous steps, when you created this migration, you configured the migration option as Validate and migrate. In this scenario, validations are performed first, before migration starts. After the Performing prerequisite steps substate is completed, the workflow moves into the substate of Validation in progress.
If validation has errors, the migration moves into a Failed state.
If validation is complete without error, the migration starts, and the workflow moves into the substate of Migrating data.
Validation details are available at the instance and database level.
Validation details for instance
Contains validation related to the connectivity check, source version, that is, PostgreSQL version >= 9.5, and server parameter check, whether the extensions are enabled in the server parameters of the Azure Database for PostgreSQL flexible server.
Validation and migration details for databases
It contains validation of the individual databases related to extensions and collations support in Azure Database for PostgreSQL flexible server.
You can see the Validation status and Migration status under the migration details page.
Some possible migration statuses:
Migration statuses
Status
Description
In progress
The migration infrastructure setup is underway, or the actual data migration is in progress.
Canceled
The migration is canceled or deleted.
Failed
The migration has failed.
Validation failed
The validation has failed.
Succeeded
The migration has succeeded and is complete.
Migration substatuses
Substatus
Description
Performing prerequisite steps
Infrastructure setup is underway for data migration.
Validation in progress
Validation is in progress.
Migrating data
Data migration is in progress.
Completing migration
Migration is in the final stages of completion.
Completed
Migration has been completed.
Failed
Migration has failed.
Validation substatuses
Substatus
Description
Failed
Validation has failed.
Succeeded
Validation is successful.
Warning
Validation is in warning.
Check the migration when completed
After completing the databases, you need to manually validate the data between source and target and verify that all the objects in the target database are successfully created.
After migration, you can perform the following tasks:
Verify the data on your flexible server and ensure it's an exact copy of the source instance.
Post verification, enable the high availability option on your flexible server as needed.
Change the SKU of the flexible server to match the application needs. This change needs a database server restart.
If you change any server parameters from their default values in the source instance, copy those server parameter values in the flexible server.
Copy other server settings, such as tags, alerts, and firewall rules (if applicable), from the source instance to the flexible server.
Make changes to your application to point the connection strings to a flexible server.
Monitor the database performance closely to see if it requires performance tuning.
Azure Database for PostgreSQL Flexible Server supports effective data migration from PostgreSQL servers. This module covers both online and offline migration methods and tools, helping you choose the right approach for your scenario. Learn practical techniques for managing migrations efficiently, ideal for minimizing downtime and maintaining productivity.
Administer an SQL Server database infrastructure for cloud, on-premises and hybrid relational databases using the Microsoft PaaS relational database offerings.
Ask Learn
Preview
Ask Learn is an AI assistant that can answer questions, clarify concepts, and define terms using trusted Microsoft documentation.