Ejercicio: Migrar una base de datos MySQL local a Azure Database for MySQL
En este ejercicio, migrará una base de datos MySQL a Azure. Migrará una base de datos MySQL existente que se ejecuta en una máquina virtual a Azure Database for MySQL.
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 MySQL 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 MySQL, 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-mysql \
--location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>
az vm create \
--resource-group migrate-mysql \
--name mysqlvm \
--admin-username azureuser \
--admin-password Pa55w.rdDemo \
--image Ubuntu2204 \
--public-ip-address-allocation static \
--public-ip-sku Standard \
--size Standard_B2ms
az vm open-port \
--resource-group migrate-mysql \
--name mysqlvm \
--priority 200 \
--port '22'
az vm open-port \
--resource-group migrate-mysql \
--name mysqlvm \
--priority 300 \
--port '3306'
az vm run-command invoke \
--resource-group migrate-mysql \
--name mysqlvm \
--command-id RunShellScript \
--scripts "
# MySQL installation
sudo apt-get update && sudo apt-get upgrade -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server
# Disable Ubuntu Firewall bind mysql
sudo ufw disable
sudo bash << EOF
echo "bind-address=0.0.0.0" >> /etc/mysql/mysql.conf.d/mysqld.cnf
echo "log-bin" >> /etc/mysql/mysql.conf.d/mysqld.cnf
echo "server-id=99" >> /etc/mysql/mysql.conf.d/mysqld.cnf
EOF
sudo service mysql stop
sudo service mysql start
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop
# Add a password to mysql root user
sudo mysqladmin -u root password Pa55w.rd
# Use mysql to create users and an empty adventureworks
sudo mysql -u root -pPa55w.rd -e \"CREATE USER azureuser IDENTIFIED BY 'Pa55w.rd';GRANT ALL PRIVILEGES ON *.* TO azureuser;CREATE DATABASE adventureworks;\"
# Use mysql to import the adventureworks database
sudo mysql --user=azureuser --password=Pa55w.rd --database=adventureworks < /home/azureuser/workshop/migration_samples/setup/mysql/adventureworks/adventureworks.sql
sudo service mysql restart"
MYSQLIP="$(az vm list-ip-addresses \
--resource-group migrate-mysql \
--name mysqlvm \
--query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
--output tsv)"
echo $MYSQLIP
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 la base de datos de Azure para la base de datos y el servidor MySQL
La primera fase del proyecto necesita crear una base de datos de Azure para MySQL con el fin de hospedar la base de datos nueva de la empresa.
Abra una nueva pestaña en un explorador web y navegue hasta Azure Portal.
Seleccione + Crear un recurso.
En el cuadro Buscar en Marketplace, escriba Azure Database for MySQLy presione ENTRAR.
En la página Azure Database for MySQL, seleccione Crear.
En la página Seleccionar opción de implementación de Azure Database for MySQL, en Servidor flexible, seleccione Crear.
En la página Crear servidor MySQL, escriba los detalles siguientes y seleccione Revisar y crear:
Propiedad Valor Resource group migrate-mysql Nombre de servidor adventureworksnnn, donde nnn es un sufijo que elige para que el nombre del servidor sea único Origen de datos None Location Seleccione la ubicación más cercana. Versión 5.7 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 En la página Revisar y crear, seleccione Crear. Espere a que se cree el servicio antes de continuar.
Una vez creado el servicio, seleccione Ir al recurso.
Seleccione Seguridad de la conexión.
En la página Seguridad de la conexión, establezca Permitir el acceso a servicios de Azure en Sí.
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 MySQL. Es la dirección IP que aparece en la última línea en la instancia de Cloud Shell.
Seleccione Agregar dirección IP del cliente actual para permitir también que la máquina cliente acceda a la base de datos.
Guarde y espere a que se actualicen las reglas de firewall.
En el símbolo del sistema de Cloud Shell, ejecute el comando siguiente para crear una base de datos nueva en el servicio Azure Database for MySQL. Reemplace [nnn] por el sufijo que usó al crear el servicio Azure Database for MySQL. Reemplace [resource group] por el nombre del grupo de recursos que especificó para el servicio:
az MySQL db create \ --name azureadventureworks \ --server-name adventureworks[nnn] \ --resource-group migrate-mysql
Si la base de datos se crea correctamente, debería ver un mensaje similar al siguiente:
{ "charset": "latin1", "collation": "latin1_swedish_ci", "id": "/subscriptions/nnnnnnnnnnnnnnnnnnnnnnnnnnnnn/resourceGroups/nnnnnn/providers/Microsoft.DBforMySQL/servers/adventureworksnnnn/databases/azureadventureworks", "name": "azureadventureworks", "resourceGroup": migrate-mysql, "type": "Microsoft.DBforMySQL/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 MySQL existente mediante la instancia de Cloud Shell para exportar el esquema de la base de datos.
Ejecute este comando de la CLI de Azure para ver la dirección IP de la máquina virtual existente.
MYSQLIP="$(az vm list-ip-addresses \ --resource-group migrate-mysql \ --name mysqlvm \ --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \ --output tsv)" echo $MYSQLIP
Conéctese al servidor de base de datos anterior mediante SSH. Escriba Pa55w.rdDemo como la contraseña.
ssh azureuser@$MYSQLIP
Exporte el esquema para la base de datos de origen mediante la utilidad mysqldump:
mysqldump -u azureuser -pPa55w.rd adventureworks --no-data > adventureworks_mysql_schema.sql
Importación del esquema a la base de datos de destino
En la instancia de Cloud Shell, 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.
mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo
Ejecute los comandos siguientes para crear un usuario con el nombre azureuser y establezca la contraseña para este usuario en Pa55w.rd. La segunda instrucción proporciona al usuario azureuser los privilegios necesarios para crear objetos en la base de datos azureadventureworks.
GRANT SELECT ON *.* TO 'azureuser'@'localhost' IDENTIFIED BY 'Pa55w.rd'; GRANT CREATE ON *.* TO 'azureuser'@'localhost';
Ejecute los comandos siguientes para crear una base de datos adventureworks.
CREATE DATABASE adventureworks;
Use el comando quit para cerrar la utilidad mysql.
Importe el esquema adventureworks al servicio Azure Database for MySQL. Realiza la importación como azureuser, por lo que debe escribir la contraseña Pa55w.rd cuando se le pida.
mysql -h adventureworks[nnnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo adventureworks < adventureworks_mysql_schema.sql
Realización de una migración en línea con Database Migration Service
Vuelva a Azure Portal.
Haga clic en Todos los servicios, en Suscripciones y, a continuación, en su suscripción.
En la página de la suscripción, en Configuración, haga clic en Proveedores de recursos.
En el cuadro Filtrar por nombre, escriba DataMigration y haga clic en Microsoft.DataMigration.
Si Microsoft.DataMigration no está registrado, haga clic en Registrar y espere a que Estado cambie a Registrado. Puede que sea necesario hacer clic en Actualizar para ver el cambio de estado.
Seleccione Crear un recurso, en el cuadro Buscar en Marketplace, escriba Azure Database Migration Service y, luego, presione ENTRAR.
En la página Azure Database Migration Service, seleccione Crear.
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-mysql Nombre del servicio de migración adventureworks_migration_service Ubicación Seleccione la ubicación más cercana. Modo de servicio Azure Plan de tarifa Premium con 4 núcleos virtuales En la página Redes, seleccione la red virtual MySQLvnet/mysqlvmSubnet. Esta red se creó como parte de la configuración.
Seleccione Revisar y crear y, luego, Crear. Espere mientras se crea Database Migration Service. Esta operación puede tardar unos minutos.
En Azure Portal, vaya a la página de Database Migration Service.
Seleccione Nuevo proyecto de migración.
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 MySQL Base de datos para MySQL Azure Database for MySQL Elegir el tipo de actividad Migración de datos en línea Cuando se inicie el Asistente para migración, escriba los detalles siguientes en la página Selección del origen.
Propiedad Valor Nombre de servidor de origen nn.nn.nn.nn (la dirección IP de la máquina virtual de Azure que ejecuta MySQL) Puerto del servidor 3306 Nombre de usuario azureuser Contraseña Pa55w.rd. Seleccione Siguiente: Selección del destino>>.
En la página Selección del destino, escriba estos detalles.
Propiedad Valor Nombre del servidor de destino adventureworks[nnn].MySQL.database.azure.com Nombre de usuario awadmin@adventureworks[nnn] Contraseña Pa55w.rdDemo Seleccione Siguiente: Selección de las bases de datos>>.
En la página Selección de las bases de datos, asegúrese de que tanto la Base de datos de origen como la Base de datos de destino estén establecidas en adventureworks y, luego, seleccione Siguiente: Configuración de los valores de la migración.
En la página Configuración de los valores de la migración, seleccione Siguiente: Resumen>>.
En la página Resumen de la migración, en el cuadro Nombre de la actividad, escriba AdventureWorks_Migration_Activity y luego, seleccione Iniciar la migración.
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.
Modificación de los datos y migración total a la base de datos nueva
Vuelva a la página AdventureWorks_Migration_Activity en Azure Portal.
Seleccione la base de datos adventureworks.
En la página adventureworks, compruebe que el estado de todas las tablas esté marcado como COMPLETADO.
Seleccione Sincronización de datos incrementales. Compruebe que el estado de cada tabla esté marcado como Sincronizando.
Vuelva a la instancia de Cloud Shell.
Ejecute el comando siguiente para conectarse a la base de datos adventureworks en ejecución mediante MySQL en la máquina virtual:
mysql -pPa55w.rd adventureworks
Ejecute las instrucciones SQL siguientes para mostrar y luego quitar los pedidos 43659, 43660 y 43661 de la base de datos.
SELECT * FROM salesorderheader WHERE salesorderid IN (43659, 43660, 43661); SELECT * FROM salesorderdetail WHERE salesorderid IN (43659, 43660, 43661); DELETE FROM salesorderheader WHERE salesorderid IN (43659, 43660, 43661); DELETE FROM salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
Use el comando quit para cerrar la utilidad mysql.
Vuelva a la página adventureworks en Azure Portal y, luego, seleccione Actualizar. Desplácese a la página para ver las tablas salesorderheader y salesorderdetail. Compruebe que la tabla salesorderheader indica que se eliminaron 3 filas y que se quitaron 29 filas de la tabla sales.salesorderdetail. Si no se aplica ninguna actualización, compruebe que hay Cambios pendientes para la base de datos.
Seleccione Iniciar migración total.
En la página Migración total completa, seleccione Confirmar y, luego, seleccione Aplicar. Espere hasta que el estado cambie a Completado.
Vuelva a Cloud Shell.
Ejecute el comando siguiente para conectarse a la base de datos azureadventureworksen ejecución mediante el servicio Azure Database for MySQL.
mysql -h adventureworks[nnn].MySQL.database.azure.com -u awadmin@adventureworks[nnn] -pPa55w.rdDemo adventureworks
Ejecute las instrucciones SQL siguientes para mostrar los pedidos 43659, 43660 y 43661 y sus detalles. El propósito de estas consultas es mostrar que se han transferido los datos:
SELECT * FROM salesorderheader WHERE salesorderid IN (43659, 43660, 43661); SELECT * FROM salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
La primera consulta debería devolver 3 filas. La segunda consulta debería devolver 29 filas.
Use el comando quit para cerrar la utilidad mysql.
Use el comando exit para cerrar la conexión SSH.
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.
- Con Cloud Shell, ejecute este comando para eliminar el grupo de recursos:
az group delete --name migrate-mysql