Blog de Amazon Web Services (AWS)

Cómo migrar la base de datos MySQL a Amazon Aurora

Por Angie Nobre, Sr. Database Specialist en AWS

 

MySQL es la base de datos relacional de código abierto más popular del mercado. Se ha ganado un gran mercado debido a la facilidad de implementación y desarrollo.

 

 

Fuente: https://db-engines.com/en/ranking

Si bien la implementación es muy respetada debido a la facilidad de desarrollo, la administración de motores de código abierto es costosa durante el mantenimiento del ciclo de vida del entorno, desde la aplicación de parches, la ejecución de copias de seguridad, la supervisión y la configuración de alta disponibilidad para cumplir con la disponibilidad de entornos de misión crítica.

 

Beneficios de los servicios administrados para bases

Los servicios administrados agregan instalaciones clave para la disponibilidad, durabilidad y seguridad de los datos. Las tareas importantes y críticas para garantizar la protección y el rendimiento están disponibles y automatizadas a través de servicios administrados. Tareas tales como:

  • Instalación del sistema operativo
  • Parches del sistema operativo
  • Instalación del software de la base
  • Parche de la base de datos
  • Backup, así como su retención.
  • Monitoreo
  • Snapshots
  • Alta disponibilidad
  • Replicación de datos para la protección ante desastres

Funcionalidades críticas y fundamentales para el funcionamiento de bases de datos críticas con seguridad y escalabilidad.

 

¿Por qué migrar su base de datos MySQL a Aurora?

Amazon Aurora es una base de datos relacional que admite MySQL y PostgreSQL y está diseñada para la nube que combina el rendimiento y la disponibilidad de bases de datos comerciales avanzadas con la simplicidad y la economía de las bases de datos de código abierto.

Por lo tanto, sigue paso a paso migrar una base de datos MySQL a un servicio con mayor escalabilidad, pero también con un tiempo de inactividad muy corto para la aplicación, y utilizando herramientas nativas de copia de seguridad MySQL.

 

 

Para copiar su MySQL generaremos una copia de seguridad y la copiaremos en Amazon S3, desde S3 restauraremos a Amazon Aurora, y realizaremos una replicación de su origen a Amazon Aurora.

 

Configuración de la infraestructura de laboratorio:

1. Ejecutar Cloudformation:

Región de AWS elegida

Enlace para crear

N.Virginia (us-east-1)

Ohio (us-east-2)

Oregon (us-west-2)

South America (sa-east-1)

Haga clic en Siguiente.

2. Seleccione, un par de claves para la instancia de EC2, si no tiene és posible crear igual que el cloudformation aquí.

 

 

3. En la siguiente pantalla, haz clic en Siguiente en la parte inferior de la página.

 

 

4. Marque «I acknowledge that AWS Cloudformation..» y cree la pila.

 

 

5. Vaya a la consola de EC2 para iniciar sesión en su máquina MySQL. En instancias en ejecución, busque la máquina llamada mysql-source.

 

 

6. Conéctese a la instancia.

 

 

7. Reemplazar la contraseña raíz por una que desee, si no cambia el archivo /tmp/mysqlfile, será ‘tim3t0change’, si lo desea, edite el archivo con root.

Bash

sudo mysqld --user=mysql --init-file=/tmp/mysqlfile &

mysql -u root -p

(se você não alterou o arquivo a senha será “Tim3t0change”)

 

 

Cómo extraer la copia de seguridad de la base de datos MySQL:

1. Compruebe la base de datos MySQL fuente si bin_logging está habilitado:

Bash

mysql -u root -p

mysql> show variables like '%server_id%';

+----------------+-------+

| Variable_name  | Value |

+----------------+-------+

| server_id      | 0     |

| server_id_bits | 32    |

+----------------+-------+

2 rows in set (0.00 sec)




mysql> show variables like '%log_bin%';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| log_bin                         | OFF   |

| log_bin_basename                |       |

| log_bin_index                   |       |

| log_bin_trust_function_creators | OFF   |

| log_bin_use_v1_row_events       | OFF   |

| sql_log_bin                     | ON    |

+---------------------------------+-------+

6 rows in set (0.00 sec)




mysql> show variables like '%version%';

+-------------------------+------------------------------+

| Variable_name           | Value                        |

+-------------------------+------------------------------+

| innodb_version          | 5.6.48                       |

| protocol_version        | 10                           |

| slave_type_conversions  |                              |

| version                 | 5.6.48-log                   |

| version_comment         | MySQL Community Server (GPL) |

| version_compile_machine | x86_64                       |

| version_compile_os      | Linux                        |

+-------------------------+------------------------------+

7 rows in set (0.00 sec)




mysql> quit

2. Deshabilite la sesión que mantuvo el cambio de contraseña:

Bash

sudo kill -9 `ps -ef | grep mysql | grep -v grep | awk '{print $2}'`

3. Habilite binlog editando el archivo /usr/my.cnf:

Edite con el usuario root. (sudo vi /usr/mi.cnf o sudo vim /usr/mi.cnf).

log_bin=mysql-bin

server_id=2133421

innodb_flush_log_at_trx_commit=1

sync_binlog=1

4. Start do MySQL:

[ec2-user]# sudo service mysql start

5. Confirmando la modificación de los parámetros:

Bash

[ec2-user]# mysql -u root -p

mysql> show binary logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |       120 |

+------------------+-----------+

1 row in set (0.00 sec)




mysql> show variables like '%log_bin%';

+---------------------------------+--------------------------------+

| Variable_name                   | Value                          |

+---------------------------------+--------------------------------+

| log_bin                         | ON                             |

| log_bin_basename                | /var/lib/mysql/mysql-bin       |

| log_bin_index                   | /var/lib/mysql/mysql-bin.index |

| log_bin_trust_function_creators | OFF                            |

| log_bin_use_v1_row_events       | OFF                            |

| sql_log_bin                     | ON                             |

+---------------------------------+--------------------------------+

6 rows in set (0.00 sec)




mysql> show variables like '%server_id%';

+----------------+---------+

| Variable_name  | Value   |

+----------------+---------+

| server_id      | 2133421 |

| server_id_bits | 32      |

+----------------+---------+

2 rows in set (0.00 sec)


6. Añandir una nueva tabla:

mysql>

create database novo;

use novo;

create table novo.employee (empid  int NOT NULL, name varchar(255) NOT NULL, age int NOT NULL, PRIMARY KEY (empid));

insert into employee (empid, name, age) values(1, "Joe Doe",17);

insert into employee (empid, name, age) values(2, "Bob Mansel",25);

insert into employee (empid, name, age) values(3, "Mary Wilson",32);

commit;

7. Para generar la copia de seguridad de la base de datos MySQL, necesita al menos Percona XtraBackup 2.3 o 2.4:

Bash

[ec2-user]# sudo mkdir -p /mnt/backup

[ec2-user]# sudo chmod 755 /mnt/backup

[ec2-user]# sudo su -

[root]# xtrabackup --backup --user=root --password=Tim3t0change --stream=tar    --target-dir=/mnt/backup | gzip - | split -d --bytes=4096MB    - /mnt/backup/MySQL_Source.tar.gz

[root]# ls -ltr /mnt/backup/

 

 

Al final, tendrá el mensaje de pago correctamente:

xtrabackup: Transaction log of lsn (134718594119) to (134718594119) was copied.

200901 19:32:43 completed OK!

 

Cómo copiar los archivos generados por la copia de seguridad en S3:

1. Con la copia de seguridad completada correctamente, debe copiar los archivos en un depósito.

El bucket fue creado por CloudFormation, compruebe en la consola S3.

El nombre comienza con ’01-mysql-migration-.. ‘y termina con’ -raw ‘

 

 

2. Cargue la copia de seguridad en el depósito identificado anteriormente en S3:

cd /mnt/backup

[root]# aws s3 sync . s3://<nome do seu bucket>/backup/

 

 

Cómo crear la directiva y desplazarse para permitirle restaurar desde S3:

  1. En IAM, cree una política que permita a Aurora acceder a los archivos de copia de seguridad de S3:

 

 

2. Seleccione Policies y Create policy:

 

 

3. Editar como JSON.

 

 

4. Copie el siguiente permiso reemplazándolo por el nombre del depósito en el que copió la copia de seguridad

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "s3:ListBucket",

                "s3:GetBucketLocation"

            ],

            "Resource": [

                "arn:aws:s3:::<nome do seu bucket>"

            ]

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:GetObject"

            ],

            "Resource": [

                "arn:aws:s3:::<nome do seu bucket>/backup*"

            ]

        }

    ]

}

Name: AllowAuroraRestoreMySQL

 

 

5. Seleccione Crear directiva.

 

 

6.

  1. En IAM, Role:

 

 

7. Seleccione Create role. En AWS Service, seleccione RDS.

 

 

8. Select your use case “RDS – Add Role to Database”:

 

 

9. Haga clic en Next: permissions.

10. Seleccione la policy con el permiso de S3 creado en el paso anterior:

 

 

11. Defina un nombre y seleccione create role.

Role name: RDSAuroraLoadFromS3

 

 

 

Cómo restaurar MySQL a Aurora:

1. En esta pantalla, haga clic en Restore Aurora DB cluster from S3, debajo de la opción principal.

 

 

Si tiene en esta otra pantalla, también hay una opción Restore from S3.

 

 

2. Seleccione su bucket ’01-mysql-migration-… -raw’ y backup de prefijo:

 

 

3. Seleccione la opción del motor Aurora y la versión compatible con MySQL en nuestro caso (MySQL 5.6) 1.23.0:

 

 

4. Seleccione el rol con permiso para acceder al bucket:

 

 

5. Configure el DB cluster identifier de datos: «builders», usuario «admin» y contraseña:

 

 

6. Seleccione el tipo de instancia:

 

 

7. Seleccione la VPC y el grupo de seguridad para la base de datos:

 Seleccione la misma VPC introducida en la formación Cloud.

Y el grupo de subred creado: mysql-dbsubnetgroup-<hash>

Grupo de seguridad: lab-mysql-migration

Acceso público: no

 

 

8. En adicional configuration, coloque un database denominado lab:

 

 

9. Pulse el Create database:

 

 

10. Realizar un seguimiento del estado

 

 

11. Compruebe de nuevo después de un tiempo estará en estado Disponible y el banco restaurado:

 

 

12. Compruebe el endpoint de write de la base de datos:

 

 

Cómo configurar la replicación de MySQL a Aurora:

1. En la consola de RDS, seleccione Events para verificar el filename y position de replicación:

 

 

2. Cree el usuario de replicación en su base de datos MySQL Source:
En su instancia de EC2 mysql-source

[root@ip-9-0-3-249 datadir]# mysql -u root -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.6.48-log MySQL Community Server (GPL)


Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create user 'repl'@'%' identified by 'aurorarepl';

Query OK, 0 rows affected (0.00 sec)

mysql> grant replication client,replication slave on *.* to 'repl'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> GRANT USAGE ON *.* TO 'repl'@'%';

mysql> SHOW MASTER STATUS;

 

 

3. Anote el file (Archivo) y el Position (Posición).

4. En la consola de RDS, seleccione Eventos para verificar el nombre y la posición del archivo de replicación

 

 

5. En las bases de datos, copie el Endpint name Writer que se utilizará para conectar:

 

 

6. Conectarse a la instancia de Aurora MySQL:

[root@ip-9-0-3-249 datadir]# mysql -h <endpoint-write-aurora> -u admin -p

mysql> show variables like '%version%';

+-------------------------+------------------------------+

| Variable_name           | Value                        |

+-------------------------+------------------------------+

| aurora_version          | 1.23.0                       |

| innodb_version          | 1.2.10                       |

| protocol_version        | 10                           |

| slave_type_conversions  |                              |

| version                 | 5.6.10                       |

| version_comment         | MySQL Community Server (GPL) |

| version_compile_machine | x86_64                       |

| version_compile_os      | Linux                        |

+-------------------------+------------------------------+



mysql> call mysql.rds_set_external_master('<hostname da sua EC2>',3306,'repl','aurorarepl','mysql-bin.000001',<your db positon>,0);



mysql> call mysql.rds_start_replication;

 

 

mysql> SHOW SLAVE STATUS\G;

 

 

7. Todavía conectado a Aurora hacer una consulta en la nueva tabla.employee:

Mysql>

select * from novo.employee;

 

 

8. Estos 3 registros vinieron de copia de seguridad ahora vamos a insertar nuevos registros en su origen.

9. Cree eventos en su base de datos Source:

En su instancia mysql de mysql-source mysql:

[root@ip-9-0-3-249 datadir]# mysql -u root -p

Enter password:

use novo

insert into novo.employee (empid, name, age) values(4, "Manuel Garcia",37);

insert into novo.employee (empid, name, age) values(5, "Antonio Flores",48);

insert into novo.employee (empid, name, age) values(6, "Alex Palacios",29);

commit;

 

 

10. Verificar replicación:
Vuelva a conectar a la instancia de Aurora MySQL:

[root]# mysql -h <endpoint-write-aurora> -u admin -p

mysql> select * from novo.employee;

 

 

Los cambios en el origen se han aplicado al destino de Aurora, y a partir de este momento, las aplicaciones se pueden convertir en Aurora.

Supervise la actualización de replicación hasta que esté sincronizada y dirija la aplicación a Aurora.

El valor de Seconds_Behind_Master debe ser 0 para que ya no tenga registros que aplicar.

 

Resumen

En este post describimos cómo migrar sus bases de datos MySQL a Aurora usando una copia de seguridad inicial y replicación nativa de MySQL. Puede utilizar percona xtrabackup para extraer la copia de seguridad y, a continuación, realizar una replicación entre el origen MySQL y Aurora MySQL.
Hemos demostrado cómo puede generar Aurora a partir de una copia de seguridad de MySQL en S3 con la facilidad de señalar una ruta en Amazon S3. El servicio RDS sube a la base de datos con la copia de seguridad e indica qué registro bin se aplica por última vez para utilizar para la replicación, lo que facilita la visibilidad y elimina la pérdida de datos.

 

Este artículo fue traducido del Blog de AWS en Portugués.

 


Sobre la autora

Angie Nobre, es Sr. Database Specialist en AWS.