En este tutorial se muestran dos formas de clonar una base de datos MySQL que se ejecuta en Compute Engine. Un método usa capturas de disco persistente. El otro método usa la exportación e importación nativas de MySQL, transfiriendo el archivo de exportación mediante Cloud Storage. Cloud Storage es el Google Cloud servicio de almacenamiento de objetos. Ofrece una forma sencilla, segura, duradera y de alta disponibilidad de almacenar archivos.
La clonación es el proceso de copiar una base de datos en otro servidor. La copia es independiente de la base de datos de origen y se conserva como una copia de un momento concreto. Puedes usar una base de datos clonada para varios fines sin sobrecargar el servidor de producción ni poner en riesgo la integridad de los datos de producción. Algunas de estas finalidades son las siguientes:
- Realizar consultas analíticas.
- Pruebas de carga o de integración de tus aplicaciones.
- Extraer datos para rellenar almacenes de datos.
- Realizar experimentos con los datos.
Cada método de clonación descrito en este tutorial tiene ventajas e inconvenientes. El método ideal para ti depende de tu situación. En la siguiente tabla se destacan algunos aspectos clave.
Problema | Método 1: Capturas de disco | Método 2: Exportar e importar mediante Cloud Storage |
---|---|---|
Espacio en disco adicional necesario en instancias de MySQL | No se necesita espacio en disco adicional | Espacio adicional necesario para almacenar el archivo de exportación al crear y restaurar |
Carga adicional en las instancias de MySQL de origen durante la clonación | Sin carga adicional | Carga adicional en la CPU y las E/S al crear y subir el archivo de exportación |
Duración de la clonación | Relativamente rápido para bases de datos grandes | Relativamente lento para bases de datos grandes |
Puede clonar instancias de MySQL externas aGoogle Cloud | No | Sí |
complejidad | Una secuencia compleja de comandos para adjuntar discos clonados | Un conjunto de comandos relativamente sencillo para clonar |
Puede aprovechar los sistemas de copias de seguridad que ya tenga | Sí, si el sistema de copias de seguridad usa Google Cloud capturas de disco | Sí, si el sistema de copia de seguridad exporta archivos a Cloud Storage |
Granularidad de la clonación | Solo se pueden clonar discos completos | Solo se puede clonar la base de datos especificada |
Coherencia de datos | Coherente en el momento de la captura | Coherente en el momento de la exportación |
Puede usar Cloud SQL como origen | No | Sí, si se usa la misma versión |
Puede usar Cloud SQL como destino | No | Sí |
En este tutorial se da por hecho que conoces la línea de comandos de Linux y la administración de bases de datos MySQL.
Configuración del entorno
Para completar este tutorial, debes configurar tu entorno de computación con lo siguiente:
- Una instancia de MySQL en Compute Engine (llamada
mysql-prod
) que representa tu servidor de base de datos de producción. - Un disco adicional (llamado
mysql-prod-data
) conectado a tu servidor de producción para almacenar tu base de datos de producción. - Una copia de la base de datos
Employees
importada enmysql-prod
para simular la base de datos de producción que quieres clonar. - Una instancia de MySQL en Compute Engine (llamada
mysql-test
) que represente tu servidor de base de datos de pruebas. Clonas tu base de datos en este servidor.
En el siguiente diagrama se muestra esta arquitectura.
Crea la instancia de VM de producción
Para simular un entorno de producción, configura una instancia de VM de Compute Engine que ejecute MySQL en Debian Linux.
La instancia de máquina virtual de este tutorial usa dos discos: un disco de 50 GB para el SO y las cuentas de usuario, y un disco de 100 GB para el almacenamiento de la base de datos.
En Compute Engine, usar discos independientes no ofrece ninguna ventaja de rendimiento. El rendimiento del disco se determina en función de la capacidad de almacenamiento total de todos los discos conectados a una instancia y del número total de vCPUs de la instancia de la máquina virtual. Por lo tanto, la base de datos y el archivo de registro pueden residir en el mismo disco.
Abre Cloud Shell.
Selecciona la zona que prefieras:
ZONE=us-east1-b REGION=us-east1 gcloud config set compute/zone "${ZONE}"
Crea una instancia de Compute Engine:
gcloud compute instances create mysql-prod \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --boot-disk-size=50GB \ --boot-disk-device-name=mysql-prod \ --create-disk="mode=rw,size=100,type=pd-standard,name=mysql-prod-data,device-name=mysql-prod-data"
Este comando otorga a la instancia acceso completo a las Google Cloud APIs, crea un disco secundario de 100 GB y lo asocia a la instancia. Ignora la advertencia de rendimiento del disco porque no necesitas un rendimiento alto para este tutorial.
Configurar el disco adicional
El segundo disco conectado a la instancia de producción se usa para almacenar tu base de datos de producción. Este disco está vacío, por lo que debes particionarlo, formatearlo y montarlo.
En la consola de Google Cloud , ve a la página Instancias de VM.
Asegúrate de que aparezca una marca de verificación verde check junto al nombre de tu instancia
mysql-prod
, lo que indica que la instancia está lista.Haz clic en el botón SSH situado junto a la instancia
mysql-prod
. El navegador abre una conexión de terminal a la instancia.En la ventana del terminal, muestra una lista de los discos conectados a tu instancia:
lsblk
El resultado es el siguiente:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk └─sda1 8:1 0 50G 0 part / sdb 8:16 0 100G 0 disk
El disco llamado
sdb
(100 GB) es tu disco de datos.Formatea el disco
sdb
y crea una sola partición con un sistema de archivos ext4:sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard \ /dev/sdb
Crea el directorio de datos de MySQL para que sea el punto de montaje del disco de datos:
sudo mkdir -p /var/lib/mysql
Para montar automáticamente el disco en el punto de montaje que has creado, añade una entrada al archivo
/etc/fstab
:echo "UUID=`sudo blkid -s UUID -o value /dev/sdb` /var/lib/mysql ext4 discard,defaults,nofail 0 2" \ | sudo tee -a /etc/fstab
Monta el disco:
sudo mount -av
Elimina todos los archivos del disco de datos para que MySQL pueda usarlo como directorio de datos:
sudo rm -rf /var/lib/mysql/*
Instalar el servidor MySQL
Debes descargar e instalar MySQL Community Edition. El directorio de datos de MySQL se crea en el disco adicional.
En la sesión SSH conectada a
mysql-prod
, descarga e instala el paquete de configuración de MySQL:wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
Cuando se te pida, selecciona la opción MySQL Server & Cluster y, a continuación, mysql-5.7.
En la lista, selecciona la opción Aceptar para completar la configuración del paquete.
Actualiza la caché del repositorio e instala los paquetes de mysql-community:
sudo apt-get update sudo apt-get install -y mysql-community-server mysql-community-client
Cuando se te avise de que el directorio de datos ya existe, selecciona Aceptar.
Cuando se te pida que proporciones una contraseña raíz, crea e introduce una contraseña. Anota la contraseña o guárdala temporalmente en un lugar seguro.
Descargar e instalar la base de datos de ejemplo
En la sesión SSH conectada a la instancia
mysql-prod
, instala git:sudo apt-get install -y git
Clona el repositorio de GitHub que contiene las secuencias de comandos de la base de datos
Employees
:git clone https://github.com/datacharmer/test_db.git
Cambia el directorio al directorio del script de la base de datos
Employees
:cd test_db
Ejecuta la secuencia de comandos de creación de la base de datos
Employees
:mysql -u root -p -q < employees.sql
Cuando se te solicite, introduce la contraseña raíz que creaste anteriormente.
Para verificar que la base de datos de muestra funciona, puedes ejecutar una consulta que cuente el número de filas de la tabla
employees
:mysql -u root -p -e "select count(*) from employees.employees;"
Cuando se te solicite, introduce la contraseña raíz que creaste anteriormente.
El resultado es el siguiente:
+----------+ | count(*) | +----------+ | 300024 | +----------+
Crear la instancia de VM de prueba
En esta sección, crearás una instancia de VM de MySQL llamada mysql-test
como destino de la base de datos clonada. La configuración de esta instancia es idéntica a la de la instancia de producción. Sin embargo, no crearás un segundo disco de datos, sino que lo adjuntarás más adelante en este tutorial.
Abre Cloud Shell.
Crea la instancia de MySQL de prueba:
gcloud compute instances create mysql-test \ --machine-type=n1-standard-2 \ --scopes=cloud-platform \ --boot-disk-size=50GB \ --boot-disk-device-name=mysql-test
Puedes ignorar la advertencia de rendimiento del disco porque no necesitas un rendimiento alto para este tutorial.
Instalar el servidor MySQL en la instancia de VM de prueba
También debes descargar e instalar MySQL Community Edition en la instancia de máquina virtual mysql-test
.
En la sesión SSH conectada a
mysql-test
, descarga e instala el paquete de configuración de MySQL:wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
Cuando se te pida, selecciona la opción MySQL Server & Cluster y, a continuación, mysql-5.7.
En la lista, selecciona la opción Aceptar para completar la configuración del paquete.
Actualiza la caché del repositorio e instala los paquetes de mysql-community:
sudo apt-get update sudo apt-get install -y mysql-community-server mysql-community-client
Cuando se te pida que proporciones una contraseña raíz, crea e introduce una contraseña. Anota la contraseña o guárdala temporalmente en un lugar seguro.
Clonar la base de datos mediante capturas de disco de Compute Engine
Una forma de clonar una base de datos MySQL que se ejecuta en Compute Engine es almacenar la base de datos en un disco de datos independiente y usar capturas de disco persistente para crear un clon de ese disco.
Las capturas de discos persistentes te permiten obtener una copia de los datos del disco en un momento determinado. Programar capturas de disco es una forma de crear copias de seguridad de tus datos automáticamente.
En esta sección del tutorial, harás lo siguiente:
- Haz una instantánea del disco de datos del servidor de producción.
- Crea un disco a partir de la instantánea.
- Monta el nuevo disco en el servidor de prueba.
- Reinicia el servidor MySQL en la instancia de prueba para que el servidor use el nuevo disco como disco de datos.
En el siguiente diagrama se muestra cómo se clona una base de datos mediante copias de disco.
Crear la captura del disco
Abre Cloud Shell.
Crea una captura de tu disco de datos en la misma zona que la instancia de VM:
gcloud compute disks snapshot mysql-prod-data \ --snapshot-names=mysql-prod-data-snapshot \ --zone="${ZONE}"
Al cabo de unos minutos, se creará la captura.
Adjunta la instantánea del disco a la instancia de prueba
Debes crear un disco de datos a partir de la captura que has creado y, a continuación, adjuntarlo a la instancia mysql-test
.
Abre Cloud Shell.
Crea un disco persistente con el contenido de la captura del disco de producción:
gcloud beta compute disks create mysql-test-data \ --size=100GB \ --source-snapshot=mysql-prod-data-snapshot \ --zone="${ZONE}"
Acopla el disco nuevo a tu instancia
mysql-test
con permisos de lectura y escritura:gcloud compute instances attach-disk mysql-test \ --disk=mysql-test-data --mode=rw
Montar el nuevo disco de datos en Linux
Para usar el disco de datos clonado como directorio de datos de MySQL, debes detener la instancia de MySQL y montar el disco.
En la sesión SSH conectada a
mysql-test
, detén el servicio MySQL:sudo service mysql stop
En la ventana del terminal, muestra una lista de los discos conectados a tu instancia:
lsblk
El resultado es el siguiente:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk └─sda1 8:1 0 50G 0 part / sdb 8:16 0 100G 0 disk
El disco llamado
sdb
(100 GB) es tu disco de datos.Monta el disco de datos de MySQL en el directorio de datos de MySQL:
sudo mount -o discard,defaults /dev/sdb /var/lib/mysql
Si montas este disco, se ocultarán los archivos de configuración y los espacios de tablas de MySQL, y se sustituirán por el contenido del disco.
Con este comando, el disco se monta temporalmente y no se vuelve a montar al iniciar el sistema. Si quieres montar el disco al arrancar el sistema, crea una entrada
fstab
. Para obtener más información, consulta la sección Configurar el disco adicional de este tutorial.
Iniciar MySQL en la instancia de prueba
En la sesión SSH conectada a
mysql-test
, inicia el servicio MySQL:sudo service mysql start
Para verificar que la base de datos clonada funciona, ejecuta una consulta que cuente el número de filas de la tabla
employees
:mysql -u root -p -e "select count(*) from employees.employees;"
Cuando se te solicite, introduce la contraseña raíz del servidor de la base de datos
mysql-prod
. La contraseña raíz de la instancia de producción es obligatoria porque todo el directorio de datos de MySQL es un clon del directorio de datos de la instanciamysql-prod
, por lo que se copian todas las bases de datos, los usuarios de las bases de datos y sus contraseñas.+----------+ | count(*) | +----------+ | 300024 | +----------+
El número de filas es el mismo que en la instancia de
mysql-prod
.
Ahora que has visto cómo clonar una base de datos mediante copias de referencia de discos persistentes, puedes probar a clonar una base de datos mediante la exportación y la importación. Para completar el tutorial de este segundo método, debes desmontar el disco clonado.
Desmonta el disco clonado
Para desmontar el disco clonado que has creado mediante capturas de disco, sigue estos pasos:
En la sesión SSH conectada a tu instancia
mysql-test
, detén el servicio MySQL:sudo service mysql stop
Desmonta el disco de datos clonado del directorio de datos de MySQL:
sudo umount /var/lib/mysql
Reinicia el servicio MySQL:
sudo service mysql start
Clonar mediante la exportación y la importación
Otro método para clonar una base de datos de MySQL que se ejecuta en Compute Engine es usar las funciones de exportación (con mysqldump
) e importación integradas de MySQL. Con este método, se transfiere el archivo de exportación mediante Cloud Storage.
En esta sección del tutorial se usan recursos que has creado en la sección Clonar la base de datos con copias de disco de Compute Engine de este tutorial. Si no has completado esa sección, debes hacerlo antes de continuar.
En esta sección del tutorial, harás lo siguiente:
- Crea un segmento de Cloud Storage.
- Exporta la base de datos de la instancia de producción y escríbela en Cloud Storage.
- Importa el archivo de exportación a la instancia de prueba leyéndolo desde Cloud Storage.
En el siguiente diagrama se muestra cómo se clona una base de datos transfiriendo una exportación mediante Cloud Storage.
Como se puede dar acceso a Cloud Storage a sistemas externos a Google Cloud , puedes usar este método para clonar bases de datos de instancias de MySQL externas.
Crea un segmento de Cloud Storage
Debes crear un segmento de Cloud Storage que almacene los archivos de exportación mientras los transfieres de la instancia mysql-prod
a la instancia mysql-test
.
Abre Cloud Shell.
Crea un segmento de Cloud Storage en la misma región que tus instancias de VM:
gcloud storage buckets create "gs://$(gcloud config get-value project)-bucket" --location="${REGION}"
Exportar la base de datos
En tu entorno de producción, es posible que ya hagas copias de seguridad con mysqldump
archivos de exportación. Puedes usar estas copias de seguridad como base para clonar tu base de datos.
En este tutorial, crearás un archivo de exportación con mysqldump
, que no afectará a ninguna programación de copias de seguridad completas o incrementales.
En la sesión SSH conectada a la instancia
mysql-prod
, exporta la base de datosEmployees
y transmítela a un objeto de Cloud Storage en el segmento que has creado anteriormente:mysqldump --user=root -p --default-character-set=utf8mb4 --add-drop-database --verbose --hex_blob \ --databases employees |\ gcloud storage cp - "gs://$(gcloud config get-value project)-bucket/employees-dump.sql"
Cuando se te solicite, introduce la contraseña raíz del servidor de bases de datos
mysql-prod
.Utiliza el conjunto de caracteres
utf8mb4
en la exportación para evitar problemas de codificación de caracteres.La opción
--add-drop-database
se usa para que las instruccionesDROP DATABASE
yCREATE DATABASE
se incluyan en la exportación.
Importar el archivo exportado
En la sesión SSH conectada a la instancia
mysql-test
, transmite el archivo exportado desde tu segmento de Cloud Storage a la aplicación de línea de comandosmysql
:gcloud storage cat "gs://$(gcloud config get-value project)-bucket/employees-dump.sql" |\ mysql --user=root -p --default-character-set=utf8mb4
Cuando se te solicite, introduce la contraseña raíz del servidor de bases de datos
mysql-test
.Utiliza el conjunto de caracteres
utf8mb4
en la importación para evitar problemas de codificación de caracteres.Para verificar que la base de datos clonada funciona, ejecuta una consulta que cuente el número de filas de la tabla
employees
:mysql -u root -p -e "select count(*) from employees.employees;"
Cuando se te solicite, introduce la contraseña raíz del servidor de bases de datos
mysql-test
.+----------+ | count(*) | +----------+ | 300024 | +----------+
El número de filas es el mismo que en la instancia de
mysql-prod
.
Usar Cloud SQL como destino de la clonación
Si tu base de datos de destino está alojada en Cloud SQL y la base de datos de origen está en Compute Engine, el único mecanismo admitido para clonar es exportar la base de datos a Cloud Storage y, a continuación, importarla en Cloud SQL.
Como se explica en la documentación de Cloud SQL, Cloud SQL solo puede importar el archivo exportado si no contiene ningún activador, procedimiento almacenado, vista o función.
Si tu base de datos depende de alguno de estos elementos, debes excluirlo de la exportación mediante los argumentos de línea de comandos --skip-triggers
y --ignore-table [VIEW_NAME]
y, a continuación, volver a crearlo manualmente después de la importación.
Crear una instancia de Cloud SQL para MySQL
Abre Cloud Shell.
Crea una instancia de Cloud SQL para MySQL que ejecute la misma versión de base de datos que tu instancia de
mysql-prod
:gcloud sql instances create mysql-cloudsql \ --tier=db-n1-standard-2 --region=${REGION} --database-version MYSQL_5_7
Al cabo de unos minutos, se creará tu base de datos de Cloud SQL.
Cambia la contraseña del usuario raíz por un valor conocido:
gcloud sql users set-password root \ --host=% --instance=mysql-cloudsql --prompt-for-password
Cuando se te pida que proporciones una contraseña raíz, crea e introduce una contraseña. Anota la contraseña o guárdala temporalmente en un lugar seguro.
Exportar la base de datos
Para exportar la base de datos en un formato adecuado para importarla en Cloud SQL, debes excluir las vistas de la base de datos.
En la sesión SSH conectada a la instancia
mysql-prod
, define una variable de entorno que contenga un conjunto de argumentos de línea de comandos para el comandomysqldump
de forma que ignore las vistas de la base de datosEmployees
:DATABASE_NAME=employees IGNORE_TABLES_ARGS="`mysql -u root -p -s -s -e \" SELECT CONCAT('--ignore-table ${DATABASE_NAME}.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA = '${DATABASE_NAME}'; \"`"
Cuando se te solicite, introduce la contraseña raíz del servidor de bases de datos
mysql-prod
.Consulta el contenido de las variables para comprobar que se han definido correctamente:
echo "${IGNORE_TABLES_ARGS}"
--ignore-table employees.current_dept_emp --ignore-table employees.dept_emp_latest_date
Exporta la base de datos
Employees
, excluyendo los activadores y las vistas, y transmítela directamente a un objeto de Cloud Storage en el segmento que has creado anteriormente:mysqldump --user=root -p --default-character-set=utf8mb4 --add-drop-database --verbose \ --hex-blob --skip-triggers --set-gtid-purged=OFF \ $IGNORE_TABLES_ARGS \ --databases employees |\ gcloud storage cp - "gs://$(gcloud config get-value project)-bucket/employees-cloudsql-import.sql"
Cuando se te solicite, introduce la contraseña raíz del servidor de bases de datos
mysql-prod
.
Actualizar los permisos de un objeto
Deben definirse los permisos correctos en el segmento de Cloud Storage y en el objeto de exportación para que la cuenta de servicio de Cloud SQL pueda leerlos.
Estos permisos se definen automáticamente cuando se usa la consola de Google Cloud para importar el objeto, o bien se pueden definir mediante comandos de gcloud
.
Abre Cloud Shell.
Define una variable de entorno que contenga la dirección de la cuenta de servicio de tu instancia de Cloud SQL:
CLOUDSQL_SA="$(gcloud sql instances describe mysql-cloudsql --format='get(serviceAccountEmailAddress)')"
Añade la cuenta de servicio a la política de gestión de identidades y accesos (IAM) del segmento como lector y escritor:
gcloud storage buckets add-iam-policy-binding "gs://$(gcloud config get-value project)-bucket/" \ --member=user:"${CLOUDSQL_SA}" --role=roles/storage.objectUser
Importar la base de datos exportada
Abre Cloud Shell.
Importa el archivo exportado en tu instancia de Cloud SQL:
gcloud sql import sql mysql-cloudsql \ "gs://$(gcloud config get-value project)-bucket/employees-cloudsql-import.sql"
Cuando se te solicite, introduce
y
.Para verificar que la base de datos clonada funciona, ejecuta una consulta que cuente el número de filas de la tabla
employees
:echo "select count(*) from employees.employees;" |\ gcloud sql connect mysql-cloudsql --user=root
Cuando se te pida, introduce la contraseña raíz del servidor de la base de datos
mysql-cloudsql
.El resultado es el siguiente:
Connecting to database with SQL user [root].Enter password: count(*) 300024
El número de filas es el mismo que en la instancia de
mysql-prod
.
Información adicional para sistemas de producción
Las siguientes categorías ofrecen prácticas recomendadas adicionales para sus sistemas de producción.
Usar capturas de disco
En el caso de las copias de seguridad físicas (como las capturas de disco), la documentación de MySQL recomienda que pauses las escrituras en la base de datos antes de hacer una captura. Para ello, usa el comando FLUSH TABLES WITH READ LOCK
. Cuando se haya completado la captura, puedes usar UNLOCK TABLES
para reiniciar las escrituras.
En el caso de las bases de datos que usan tablas InnoDB, te recomendamos que hagas la instantánea directamente sin ejecutar primero el comando FLUSH TABLES WITH READ LOCK
. De esta forma, la base de datos puede seguir funcionando sin que se produzcan efectos negativos, pero es posible que la instantánea se encuentre en un estado incoherente. Sin embargo, si esto ocurre, el motor InnoDB puede volver a compilar las tablas a un estado coherente cuando se inicie el clon.
En las bases de datos que usan tablas MyISAM, al ejecutar el comando FLUSH TABLES WITH READ LOCK
se bloquean todas las escrituras en las tablas, lo que hace que tu base de datos sea de solo lectura
hasta que ejecutes el comando UNLOCK TABLES
.
Si haces una captura sin vaciar y bloquear primero las tablas, existe el riesgo de que la base de datos recién clonada contenga datos incoherentes o esté dañada.
Por lo tanto, para obtener una instantánea coherente de las bases de datos que usan tablas MyISAM, te recomendamos que ejecutes FLUSH TABLES WITH READ LOCK
en una réplica de lectura y hagas una instantánea de esa réplica para que no se vea afectado el rendimiento de la base de datos principal (maestra).
Usar el comando mysqldump
Para crear un archivo de exportación que sea coherente con la base de datos de origen, el comando mysqldump
bloquea todas las tablas durante la operación de exportación. Esto significa que las escrituras en la base de datos se bloquean mientras se exporta.
Por lo tanto, te recomendamos que ejecutes el comando mysqldump
en una réplica de lectura de la base de datos principal para que esta no se bloquee.