Ejercicio: Migrar bases de datos PostgreSQL locales a Azure Database for PostgreSQL

Completado

En este ejercicio, migrará una base de datos PostgreSQL a Azure. Migrará una base de datos PostgreSQL existente que se ejecuta en una máquina virtual a Azure Database for PostgreSQL.

Trabaja como desarrollador de bases de datos para la organización AdventureWorks. AdventureWorks ha vendido bicicletas y piezas de bicicleta directamente a los consumidores finales y distribuidores durante más de una década. Sus sistemas almacenan información en una base de datos que se ejecuta actualmente con PostgreSQL en una máquina virtual de Azure. Como parte de un ejercicio de la racionalización de hardware, AdventureWorks desea trasladar la base de datos a una base de datos administrada por Azure. Se le pidió realizar esta migración.

Importante

Azure Database Migration Service no se admite en el entorno de espacio aislado de Azure gratuito. Puede seguir estos pasos en su propia suscripción personal o, simplemente, puede seguir leyendo para entender cómo migrar la base de datos.

Configuración del entorno

Ejecute estos comandos de la CLI de Azure en Cloud Shell para crear una máquina virtual, con PostgreSQL, con una copia de la base de datos de AdventureWorks. Los últimos comandos imprimirán la dirección IP de la máquina virtual nueva.

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

Estos comandos tardarán unos 5 minutos en completarse. No es necesario que espere, puede seguir con los pasos que aparecen a continuación.

Creación de servidores flexibles de Azure Database for PostgreSQL

  1. Abra una nueva pestaña en un explorador web y navegue hasta Azure Portal.

  2. En la barra de búsqueda, escriba Servidores flexibles de Azure Database for PostgreSQL.

  3. En la página Servidores flexibles de Azure Database for PostgreSQL, seleccione + Crear.

  4. En la página Servidor flexible, escriba los detalles siguientes y seleccione Revisar y crear:

    Propiedad Valor
    Resource group migrate-postgresql
    Nombre de servidor adventureworksnnn, donde nnn es un sufijo que elige para que el nombre del servidor sea único
    Location Seleccione la ubicación más cercana.
    Versión de PostgreSQL 13
    Proceso y almacenamiento Seleccione Configurar servidor, seleccione el plan de tarifa Básico y, luego, Aceptar
    Nombre de usuario administrador awadmin
    Contraseña Pa55w.rdDemo
    Confirmación de la contraseña Pa55w.rdDemo
  5. En la página Revisar y crear, seleccione Crear. Espere a que se cree el servicio antes de continuar.

  6. Una vez creado el servicio, seleccione Ir al recurso.

  7. Seleccione Seguridad de la conexión.

  8. En la página Seguridad de la conexión, establezca Permitir el acceso a servicios de Azure en .

  9. En la lista de reglas de firewall, agregue una regla con el nombre VM y establezca el valor DIRECCIÓN IP INICIAL y DIRECCIÓN IP FINAL en la dirección IP de la máquina virtual que ejecuta el servidor PostgreSQL creado anteriormente.

  10. Seleccione Agregar dirección IP del cliente actual para permitir que la máquina cliente se conecte a la base de datos.

  11. Guarde y espere a que se actualicen las reglas de firewall.

  12. En el símbolo del sistema de Cloud Shell, ejecute el comando siguiente para crear una base de datos en el servicio Azure Database for PostgreSQL. Reemplace [nnn] por el sufijo que usó al crear el servicio Azure Database for PostgreSQL. Reemplace [resource group] por el nombre del grupo de recursos que especificó para el servicio:

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    Si la base de datos se crea correctamente, debería ver un mensaje similar al siguiente:

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

Exportación del esquema que se va a usar en la base de datos de destino

Ahora se conectará a la máquina virtual de PostgreSQL existente mediante la instancia de Cloud Shell para exportar el esquema de la base de datos.

  1. Ejecute este comando de la CLI de Azure para ver la dirección IP de la máquina virtual existente.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. Conéctese al servidor de base de datos anterior mediante SSH. Escriba Pa55w.rdDemo como la contraseña.

    ssh azureuser@$SQLIP
    
  3. Ejecute el siguiente comando para conectarse a la base de datos de la máquina virtual. La contraseña del usuario azureuser en el servidor PostgreSQL que se ejecuta en la máquina virtual es Pa55w.rd:

    psql adventureworks
    
  4. Conceda el permiso de replicación a azureuser:

    ALTER ROLE azureuser REPLICATION;
    
  5. Cierre la utilidad psql con el comando \q.

  6. En el símbolo del sistema de Bash, ejecute el siguiente comando para exportar el esquema de la base de datos adventureworks a un archivo denominado adventureworks_schema.sql.

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

Importación del esquema a la base de datos de destino

  1. Ejecute el comando siguiente para conectarse al servidor azureadventureworks[nnn]. Reemplace las dos instancias de [nnn] por el sufijo del servicio. Tenga en cuenta que el nombre de usuario tiene el sufijo @adventureworks[nnn]. En la solicitud de contraseña, escriba Pa55w.rdDemo.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. Ejecute los comandos siguientes para crear un usuario con el nombre azureuser y establezca la contraseña para este usuario en Pa55w.rd. La tercera instrucción proporciona al usuario azureuser los privilegios necesarios para crear y administrar objetos en la base de datos azureadventureworks. El rol azure_pg_admin permite al usuario azureuser instalar y usar extensiones en la base de datos.

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. Cierre la utilidad psql con el comando \q.

  4. Importe el esquema de la base de datos adventureworks en la base de datos azureadventureworks que se ejecuta en el servicio Azure Database for PostgreSQL. Realiza la importación como azureuser, por lo que debe escribir la contraseña Pa55w.rd cuando se le pida.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    Verá una serie de mensajes a medida que se crea cada elemento. El script debe completarse sin errores.

  5. Ejecute el comando siguiente. El script findkeys.sql genera otro script SQL denominado dropkeys.sql que quitará todas las claves externas de las tablas de la base de datos azureadventureworks. En breve, ejecutará el script dropkeys.sql:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. Ejecute el comando siguiente. El script createkeys.sql genera otro script SQL denominado addkeys.sql que volverá a crear todas las claves externas. Ejecutará el script addkeys.sql una vez que haya migrado la base de datos:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. Ejecute el script dropkeys.sql:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    Verá una serie de mensajes ALTER TABLE mostrados, ya que se quitan las claves externas.

  8. Vuelva a iniciar la utilidad psql y conéctese a la base de datos azureadventureworks.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. Ejecute la siguiente consulta para buscar los detalles de las claves externas restantes:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    Esta consulta debe devolver un conjunto de resultados vacío. Sin embargo, si todavía existen claves externas, para cada clave externa, ejecute el siguiente comando:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. Una vez que haya quitado las claves externas restantes, ejecute la siguiente instrucción SQL para mostrar los desencadenadores en la base de datos:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    Esta consulta también debe devolver un conjunto de resultados vacío, lo que indica que la base de datos no contiene ningún desencadenador. Si la base de datos contiene desencadenadores, tendría que deshabilitarlos antes de migrar los datos y volver a habilitarlos después.

  11. Cierre la utilidad psql con el comando \q.

Realización de una migración en línea con Database Migration Service

  1. Vuelva a Azure Portal.

  2. Seleccione Todos los servicios, Suscripciones y, después, su suscripción.

  3. En la página de la suscripción, en Configuración, seleccione Proveedores de recursos.

  4. En el cuadro Filtrar por nombre, escriba DataMigration y, luego, seleccione Microsoft.DataMigration.

  5. Si Microsoft.DataMigration no está registrado, seleccione Registrar y espere a que el Estado cambie a Registrado. Puede que sea necesario seleccionar Actualizar para ver el cambio de estado.

  6. Seleccione Crear un recurso, en el cuadro Buscar en Marketplace, escriba Azure Database Migration Service y, luego, presione ENTRAR.

  7. En la página Azure Database Migration Service, seleccione Crear.

  8. En la página Crear el servicio de migración, escriba los detalles que se indican a continuación y, luego, seleccione Siguiente: Redes >>.

    Propiedad Valor
    Selección de un grupo de recursos migrate-postgresql
    Nombre del servicio adventureworks_migration_service
    Ubicación Seleccione la ubicación más cercana.
    Modo de servicio Azure
    Plan de tarifa Prémium con 4 núcleos virtuales
  9. En la página Redes, seleccione la red virtual postgresqlvnet/posgresqlvmSubnet. Esta red se creó como parte de la configuración.

  10. Seleccione Revisar y crear y, luego, Crear. Espere mientras se crea Database Migration Service. Esta operación puede tardar unos minutos.

  11. Una vez creado el servicio, seleccione Ir al recurso.

  12. Seleccione Nuevo proyecto de migración.

  13. En la página Nuevo proyecto de migración, escriba los detalles siguientes y, luego, seleccione Crear y ejecutar una actividad.

    Propiedad Valor
    Nombre de proyecto adventureworks_migration_project
    Tipo de servidor de origen PostgreSQL
    Base de datos de destino de PostgreSQL Azure Database para PostgreSQL
    Elegir el tipo de actividad Migración de datos en línea
  14. Cuando se inicie el Asistente para migración, en la página Seleccionar origen, escriba los detalles siguientes y, a continuación, seleccione Siguiente: Seleccionar destino>>.

    Propiedad Valor
    Nombre de servidor de origen nn.nn.nn.nn (la dirección IP de la máquina virtual de Azure que ejecuta PostgreSQL)
    Puerto del servidor 5432
    Base de datos adventureworks
    Nombre de usuario azureuser
    Contraseña Pa55w.rd.
    Certificado de servidor de confianza Selected
    Cifrar conexión Selected
  15. En la página Seleccionar destino, escriba los detalles siguientes y, a continuación, seleccione Siguiente: Seleccionar bases de datos>>.

    Propiedad Valor
    Azure PostgreSQL adventureworks[nnn]
    Base de datos azureadventureworks
    Nombre de usuario azureuser@adventureworks[nnn]
    Contraseña Pa55w.rd.
  16. En la página Seleccionar bases de datos, seleccione la base de datos adventureworks y asígnela a azureadventureworks. Anule la selección de la base de datos postgres. Seleccione Siguiente: Seleccionar tablas>>.

  17. En la página Seleccionar tablas, seleccione Siguiente: Configurar los valores de la migración>>.

  18. En la página Configurar los valores de la migración, expanda la lista desplegable adventureworks, expanda la lista desplegable Configuración avanzada de la migración en línea, compruebe que la opción Maximum number of instances to load in parallel (Número máximo de instancias que se van a cargar en paralelo) está establecida en 5 y, después, seleccione Siguiente: Resumen>>.

  19. En la página Resumen, en el cuadro Nombre de la actividad, escriba AdventureWorks_Migration_Activity y, luego, seleccione Iniciar migración.

  20. En la página AdventureWorks_Migration_Activity, seleccione Actualizar a intervalos de 15 segundos. Verá el estado de la operación de migración a medida que progresa. Espere hasta que la columna DETALLES DE LA MIGRACIÓN cambie a A punto para la migración total.

  21. Vuelva a la instancia de Cloud Shell.

  22. Ejecute el siguiente comando para volver a crear las claves externas en la base de datos azureadventureworks. Ha generado el script addkeys.sql anterior:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    Verá una serie de instrucciones ALTER TABLE a medida que se agregan las claves externas. Es posible que vea un error relacionado con la tabla SpecialOfferProduct, que se puede omitir por ahora. Esto se debe a una restricción ÚNICA que no se transfiere correctamente. En el mundo real, debe recuperar los detalles de esta restricción de la base de datos de origen mediante la siguiente consulta:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    Después, puede restablecer manualmente esta restricción en la base de datos de destino en Azure Database for PostgreSQL.

    No debería haber ningún otro error.

Modificación de los datos y migración total a la base de datos nueva

  1. Vuelva a la página AdventureWorks_Migration_Activity en Azure Portal.

  2. Seleccione la base de datos adventureworks.

  3. En la página adventureworks, compruebe que el valor Carga completa efectuada es 66 y que todos los demás valores son 0.

  4. Vuelva a la instancia de Cloud Shell.

  5. Ejecute el comando siguiente para conectarse a la base de datos adventureworks en ejecución mediante PostgreSQL en la máquina virtual:

    psql adventureworks
    
  6. Ejecute las instrucciones SQL siguientes para mostrar y luego quitar los pedidos 43659, 43660 y 43661 de la base de datos. Tenga en cuenta que la base de datos implementa una eliminación en cascada en la tabla salesorderheader, que elimina automáticamente las filas correspondientes de la tabla salesorderdetail.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. Cierre la utilidad psql con el comando \q.

  8. Vuelva a la página adventureworks en Azure Portal y seleccione Actualizar. Compruebe que se han aplicado 32 cambios.

  9. Seleccione Iniciar transición.

  10. En la página Migración total completa, seleccione Confirmar y, luego, seleccione Aplicar. Espere hasta que el estado cambie a Completado.

  11. Vuelva a Cloud Shell.

  12. Ejecute el comando siguiente para conectarse a la base de datos azureadventureworks en ejecución mediante el servicio Azure Database for PostgreSQL:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    La contraseña es Pa55w.rd.

  13. Ejecute las siguientes instrucciones SQL para mostrar los pedidos y los detalles del pedido en la base de datos. Salga después de la primera página de cada tabla. El propósito de estas consultas es mostrar que se han transferido los datos:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. Ejecute las instrucciones SQL siguientes para mostrar los pedidos 43659, 43660 y 43661 y sus detalles.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    Ambas consultas deben devolver 0 filas.

  15. Cierre la utilidad psql con el comando \q.

Limpieza de los recursos que creó

Importante

Si siguió estos pasos en su propia suscripción personal, puede eliminar los recursos de manera individual o eliminar el grupo de recursos para borrar todo el conjunto de recursos. Los recursos que se dejan en ejecución pueden costarle mucho dinero.

  1. Con Cloud Shell, ejecute este comando para eliminar el grupo de recursos:
az group delete --name migrate-postgresql