Tutorial: Migrate online from Amazon RDS for PostgreSQL to Azure Database for PostgreSQL with the migration service Preview
This article explores how to migrate your PostgreSQL database from Amazon RDS for PostgreSQL to Azure Database for PostgreSQL online.
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 Azure Database for PostgreSQL server.
- Prerequisites
- Perform the migration
- Monitor the migration
- Cutover
- Check the migration when completed
Prerequisites
To complete 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 online migration scenarios.
- Verify the source version
- Install test_decoding - Source Setup
- Configure target setup
- Enable CDC as a source
- Configure network setup
- Enable extensions
- Check server parameters
- Check users and roles
Verify the source version
The source PostgreSQL server version must be 9.5 or later.
If the source PostgreSQL version is less than 9.5, upgrade it to 9.5 or higher before you start the migration.
Install test_decoding - Source Setup
- test_decoding receives WAL through the logical decoding mechanism and decodes it into text representations of the operations performed.
- In Amazon RDS for PostgreSQL, the test_decoding plugin is preinstalled and ready for logical replication. This allows you to easily set up logical replication slots and stream WAL changes, facilitating use cases such as change data capture (CDC) or replication to external systems.
- For more information about the test-decoding plugin, see the PostgreSQL documentation
Configure target setup
- Before migrating, Azure Database for PostgreSQL – Flexible server must be created.
- SKU provisioned for Azure Database for PostgreSQL – Flexible server should match with the source.
- To create a new Azure Database for PostgreSQL, visit Create an Azure Database for PostgreSQL
Enable CDC as a source
test_decoding
logical decoding plugin captures the changed records from the source.- To allow the migration user to access replication privileges, execute the following command:
GRANT rds_replication TO <<username>>;
In the source, PostgreSQL instance, modify the following parameters by creating a new parameter group:
- Set
rds.logical_replication = 1
- Set
max_replication_slots
to a value greater than one; the value should be greater than the number of databases selected for migration. - Set
max_wal_senders
to a value greater than one. It should be at least the same asmax_replication_slots
, plus the number of senders already used on your instance. - The
wal_sender_timeout
parameter ends inactive replication connections longer than the specified number of milliseconds. The default for an AWS RDS for PostgreSQL instance is30000 milliseconds (30 seconds)
. Setting the value to 0 (zero) disables the timeout mechanism and is a valid setting for migration.
- Set
In the target Flexible Server, to prevent the Online migration from running out of storage to store the logs, ensure that you have sufficient tablespace space using a provisioned managed disk. To achieve this, disable the server parameter
azure.enable_temp_tablespaces_on_local_ssd
for the duration of the migration, and restore it to the original state after the migration.
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.
For information about network setup, visit Network guide for migration service.
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.
For more information, see Extensions in Azure Database for PostgreSQL.
Note
A restart is required when you make any changes to the shared_preload_libraries
parameter.
Check server parameters
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" section 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 their associated 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 user accounts. Execute the following command, replacing<<username>>
with the actual username and<<filename>>
with your desired output file name:pg_dumpall --globals-only -U <<username>> -f <<filename>>.sql
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 has been completed.
By following these guidelines, you can help ensure a smooth migration process without the added variables introduced by HA 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 the Azure portal or the Azure CLI.
The Azure portal provides a simple and intuitive wizard-based experience that guides you through migration. Following the steps outlined in this tutorial, you can seamlessly transfer your database to Azure Database for PostgreSQL - Flexible Server and take advantage of its powerful features and scalability.
To migrate with the Azure portal, you first configure the migration task, connect to the source and target, and then perform the migration.
Configure the migration task
The migration service comes with a simple, wizard-based experience on the Azure portal. Here's how to start:
Open your web browser and go to the portal. Enter your credentials to sign in. The default view is your service dashboard.
Go to your Azure Database for PostgreSQL Flexible Server target.
In the Flexible Server's Overview tab, on the left menu, scroll down to Migration and select it.
Select the Create button to migrate from Amazon RDS for PostgreSQL to Azure Database for PostgreSQL - Flexible Server. If this is your first time using the migration service, an empty grid appears with a prompt to begin your first migration.
If you've already created migrations to your Azure Database for PostgreSQL target, the grid contains information about attempted migrations.
Select the Create button. Then, you go through a wizard-based series of tabs to create a migration into this Azure Database for PostgreSQL target from the PostgreSQL source instance.
Setup
The first tab is the Setup tab, where the user needs to provide migration details like migration name source type to initiate the migrations.
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 the corresponding source type, such as a cloud-based PostgreSQL service, an on-premises setup, or a virtual machine.
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.
- Migrate - Skips validations and starts migrations.
- Validate and Migrate—Performs validation before triggering a migration. The migration is triggered only if there are no validation failures.
Choosing the Validate or Validate and Migrate option is always a good practice when performing premigration validations before running the migration. To learn more about the premigration validation, refer to this documentation.
- Migration mode allows you to pick the mode for the migration. Offline is the default option.
Select the Next: Connect to the Source button.
Select Runtime Server
The migration Runtime Server is a specialized feature within the migration service, 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.
For more information about the Runtime Server, visit the Migration Runtime Server.
Connect to source
The Connect to Source tab prompts you to provide details related to the Source selected in the Setup Tab, which is the Source of the databases.
- Server Name - Provide the Hostname or the IP address of the source PostgreSQL instance
- Port - Port number of the Source server
- Server admin login name - Username of the source PostgreSQL server
- Password - Password of the Source PostgreSQL server
- SSL Mode—The supported values are preferred and required. When the SSL at the Source PostgreSQL server is OFF, use SSLMODE=prefer. If the SSL at the source server is ON, use SSLMODE=require. SSL values can be determined in the Postgresql.conf file.
- Test Connection—Performs the connectivity test between the target and the Source. Once the connection is successful, users can proceed with the next step. Otherwise, we need to identify the networking issues between the target and the Source and verify the username/password for the Source. Establishing a test connection takes a few minutes.
After the successful test connection, select the Next: Select Migration target
Select migration target
The select migration target tab displays metadata for the Flexible Server target, such as the subscription name, resource group, server name, location, and PostgreSQL version.
- Admin username - Admin username of the target PostgreSQL server
- Password - Password of the target PostgreSQL server
- Custom FQDN/IP (Optional): The custom FQDN/IP 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
flexibleserver.example.com
,198.1.0.2
, or a PostgreSQL FQDN such asflexibleserver.postgres.database.azure.com
, if the custom DNS server contains the DNS zonepostgres.database.azure.com
or forwards queries for this zone to168.63.129.16
, where the FQDN is resolved in the Azure public or private DNS zone. - Test Connection - Performs the connectivity test between the target and Source. Once the connection is successful, users can proceed with the next step. Otherwise, we need to identify the networking issues between the target and the Source and verify the username/password for the target. Test connection takes a few minutes to establish a connection between the target and the source.
After the successful test connection, select the Next: Select Database(s) for Migration
Select databases for migration
Under this tab, a list of user databases is inside the source server selected in the setup tab. You can select and migrate up to eight databases in a single migration attempt. If there are more than eight user databases, the migration process is repeated between the source and target servers for the next set of databases.
After selecting the databases, select the Next: Summary
Summary
The Summary tab summarizes all the Source and target details for creating the validation or migration. Review the details and select the start button.
Monitor the migration
After you select the start button, a notification will appear in a few seconds saying that the validation or migration creation is successful. You'll then be automatically redirected to the Migration page of Flexible Server, which has a new entry for the recently created validation or migration.
The grid that displays the migrations has these columns: Name, Status, Migration mode, Migration type, Source server, Source server type, Databases, Duration, and Start time. The entries are displayed in the descending order of the start time, with the most recent entry at the top. You can use the refresh button to refresh the status of the validation or migration. Select the migration name in the grid to see the associated details.
When the validation or migration is created, it moves to the InProgress state and PerformingPreRequisiteSteps substrate. The workflow takes 2-3 minutes to set up the migration infrastructure and network connections.
Migration details
In the Setup tab, we have selected the migration option as Migrate and Validate. In this scenario, validations are performed first before migration starts. After the PerformingPreRequisiteSteps 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 completes without error, the migration starts, and the workflow moves into the substate of Migrating Data.
You can see the results of validation and migration at the instance and database level.
Some possible migration states:
Migration states
State | Description |
---|---|
InProgress | 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. |
WaitingForUserAction | Applicable only for online migration. Waiting for user action to perform cutover. |
Migration substates
Substate | Description |
---|---|
PerformingPreRequisiteSteps | Infrastructure setup is underway for data migration. |
Validation in Progress | Validation is in progress. |
MigratingData | Data migration is in progress. |
CompletingMigration | Migration is in the final stages of completion. |
Completed | Migration has been completed. |
Failed | Migration has failed. |
Validation substates
Substate | Description |
---|---|
Failed | Validation has failed. |
Succeeded | Validation is successful. |
Warning | Validation is in warning. |
Cutover
If there are both Migrate and Validate and Migrate, completing the Online migration requires another step—the user must take a Cutover action. After the copy/clone of the base data is complete, the migration moves to the WaitingForUserAction
state and the WaitingForCutoverTrigger
substate. In this state, the user can trigger the cutover from the portal by selecting the migration.
Before initiating cutover, it's important to ensure that:
Writes to the Source are stopped -
Latency
value is 0 or close to 0. TheLatency
information can be obtained from the migration details screen as shown below:latency
value decreases to 0 or close to 0The
latency
value indicates when the target last synced with the Source. At this point, writing to the Source can be stopped, and cutover can be initiated. In case there's heavy traffic at the Source, it's recommended to stop writes first so thatLatency
can come close to 0, and then a cutover is initiated. The Cutover operation applies all pending changes from the Source to the Target and completes the migration. If you trigger a "Cutover" even with nonzeroLatency,
the replication stops until that point in time. All the data is on the Source until the cutover point is applied to the target. Say a latency was 15 minutes at the cutover point, so all the changed data in the last 15 minutes are applied to the target. Time depends on the backlog of changes occurring in the last 15 minutes. Hence, it's recommended that the Latency go to zero or near zero before triggering the cutover.The migration moves to the
Succeeded
state when theMigrating Data
substate or the cutover (in Online migration) finishes successfully. If there's a problem at theMigrating Data
substate, the migration moves into aFailed
state.
Check the migration when complete
After completing the databases, you need to manually validate the data between the source, and the 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.