Usar una importación personalizada para configurar la replicación desde bases de datos externas grandes

En esta página, se describe el proceso para configurar la replicación externa del servidor mediante una importación personalizada. Estos pasos son la mejor opción cuando necesitas replicar desde una base de datos externa grande.

Debes completar todos los pasos de esta página. Cuando termines, puedes administrar y supervisar la réplica de la misma manera que lo harías con cualquier otra instancia de Cloud SQL.

Este proceso solo es compatible con servidores externos configurados para usar la replicación basada en un identificador de transacciones global (GTID). Antes de que se pueda iniciar la replicación, debes cargar los datos del servidor externo a la réplica de Cloud SQL. Si no usas la replicación basada en GTID, Cloud SQL no puede identificar la posición exacta del registro binario desde la cual comenzar la replicación. Si no puedes usar la replicación basada en GTID, debes configurar tu herramienta de volcado para establecer un bloqueo global de solo lectura durante el proceso de volcado.

Antes de comenzar

Antes de comenzar, debes configurar el servidor externo, crear la instancia de representación de origen y configurar la réplica de Cloud SQL.

Actualiza los permisos del usuario de replicación

El usuario de replicación del servidor externo está configurado a fin de aceptar conexiones de cualquier host (%). Debes actualizar esta cuenta de usuario para que solo se pueda usar con la réplica de Cloud SQL. Abre una terminal en el servidor de la base de datos de origen e ingresa los siguientes comandos:

Cliente mysql

    UPDATE mysql.user
    SET Host='NEW_HOST' WHERE Host='OLD_HOST' AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE ON *.*
    TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

Ejemplo

UPDATE mysql.user
SET Host='192.0.2.0' WHERE Host='%' AND User='replicationUser';
GRANT REPLICATION SLAVE, EXECUTE ON *.*
TO 'gcp_user'@'gmail.com';
FLUSH PRIVILEGES;
Propiedad Descripción
NEW_HOST Especifica la IP saliente de la réplica de Cloud SQL.
OLD_HOST Es el valor actual asignado a Host que deseas cambiar.
USERNAME La cuenta de usuario de replicación en el servidor externo.
GCP_USERNAME El nombre de usuario para la cuenta de usuario de GCP.
HOST El nombre de host de la cuenta de usuario de GCP.

Configura la réplica de Cloud SQL como una instancia principal

Debido a que las instancias de réplica de Cloud SQL son de solo lectura, para realizar una importación personalizada, debes ascender la réplica de Cloud SQL a una instancia independiente. Una vez que se complete la importación inicial de datos, desciende de nivel la instancia a una réplica.

Realiza un volcado y una importación personalizados

En esta sección, te mostramos cómo crear el archivo de volcado y, luego, importarlo en la réplica eventual de Cloud SQL mediante mydumper, o las utilidades del cliente mysqldump..

Cuando vuelcas los datos, es posible que debas excluir las bases de datos genéricas de MySQL, incluidas mysql y sys, si existen en la instancia de origen. De lo contrario, la importación de datos fallará. Consulta ¿Cómo excluir (o incluir) bases de datos?

Pueden usar mydumper y myloader

Para crear un archivo de volcado y, luego, importarlo a Cloud SQL, haz lo siguiente:

  1. Crea un archivo de volcado de la base de datos del servidor externo mediante mydumper.

       $ mydumper -u USERNAME -p PASSWORD \
                  --threads=16 -o ./backup \
                  -h HOST \
                  --no-locks \
                  --regex '^(?!(mysql\.|sys\.))'
    Propiedad Descripción
    USERNAME Es el nombre de la cuenta de usuario de replicación o la cuenta de usuario en el servidor externo que tiene permisos de lectura para la base de datos.
    PASSWORD Contraseña del usuario de replicación.
    HOST La dirección IPv4 o de DNS del servidor externo.
  2. Importa los datos a la instancia de Cloud SQL mediante myloader.

     $ myloader -u REPLICA_USERNAME -p REPLICA_PASSWORD \
                --threads=16 \
                -d ./backup -h HOST -o
    Propiedad Descripción
    REPLICA_USERNAME La cuenta de usuario en la instancia de Cloud SQL.
    REPLICA_PASSWORD Contraseña del usuario de la instancia de Cloud SQL.
    HOST La IPv4 para la instancia de Cloud SQL.
  3. Anota la información de GTID o binlog del volcado de datos. Necesitas esta información cuando configuras la replicación con los procedimientos almacenados.

    Para obtener la información de GTID o binlog del volcado de datos, ejecuta el siguiente comando:

      sudo cat ./backup/metadata

Utilizar mysqldump

  1. Crea un volcado mediante mysqldump:

    mysqldump

    mysqldump \
        --host=EXTERNAL_HOST \
        --port=EXTERNAL_PORT \
        --user=USERNAME\
        --password=PASSWORD \
        --databases=DATABASE_LIST  \
        --hex-blob \
        --master-data=EXTERNAL_DATA  \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        GTID_PURGED \
        ADD_DROP_TABLE \
        ROUTINES \
        COMPRESS \
        GZIP
    Propiedad Descripción
    EXTERNAL_HOST La dirección IPv4 o de DNS del servidor externo.
    EXTERNAL_PORT El puerto para el servidor externo. Si el servidor externo se aloja en Cloud SQL, es 3306.
    USERNAME Es el nombre de la cuenta de usuario de replicación o la cuenta de usuario en el servidor externo que tiene permisos de lectura para la base de datos.
    USER_PASSWORD Contraseña del usuario de replicación.
    DATABASE_LIST Lista separada por espacios de todas las bases de datos en el servidor externo, excepto las bases de datos del sistema (sys, mysql, performance_schema y information_schema). Usa el comando SHOW DATABASES de MySQL para enumerar tus bases de datos.
    EXTERNAL_DATA Si el servidor de la base de datos de origen no admite GTID y tienes permiso para acceder al bloqueo global de operaciones de lectura en él, usa --master-data=1. De lo contrario, no uses esta propiedad.
    GTID_PURGED Si tu servidor externo admite GTID, usa --set-gtid-purged=on, de lo contrario, no uses esta propiedad.
    ADD_DROP_TABLE Si deseas agregar una declaración DROP TABLE antes de cada declaración CREATE TABLE, incluye --add-drop-table.
    ROUTINES Si quieres mostrar las rutinas almacenadas, como procedimientos y funciones, en el resultado de las bases de datos de volcado, incluye --routines.
    COMPRESS Si deseas comprimir toda la información enviada entre la réplica de Cloud SQL y el servidor externo, usa --compress.
    GZIP Si deseas comprimir aún más el archivo de volcado, usa | gzip. Si tu base de datos contiene datos que no se comprimen de forma correcta, como datos binarios no comprimibles o imágenes JPG, no lo uses.

    Ejemplo

    mysqldump \
        --host=192.0.2.1 \
        --port=3306 \
        --user=replicationUser \
        --password \
        --databases guestbook journal \
        --hex-blob \
        --master-data=1 \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --compress \
        | gzip
  2. Anota la información de GTID o binlog del volcado de datos. Necesitas esta información para configurar la replicación con los procedimientos almacenados de Cloud SQL.

    Para GTID, busca una línea similar a la siguiente:

       SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';

    Para el binlog, busca una línea similar a la siguiente:

       CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
  3. Quita las siguientes líneas del archivo de volcado que requieren privilegios avanzados. Debido a que los usuarios de Cloud SQL no tienen privilegios avanzados, estas líneas hacen que la importación falle.

    Para la replicación basada en GTID: Quita la declaración SET GTID_PURGED junto con la declaración de configuración de la variable de sesión en el volcado. Por ejemplo:

       ...
       SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
       SET @@SESSION.SQL_LOG_BIN= 0;
       ...
       SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';
       ...
       SET @@SESSION.SQL_LOG_BIN=@MYSQLDUMP_TEMP_LOG_BIN;

    Para la replicación basada en registros binarios, quita la declaración CHANGE MASTER. Por ejemplo:

       ...
       CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
        ...
  4. Importa los datos a la réplica de Cloud SQL con la CLI de mysql:

    mysql

    mysql -h REPLICA_HOST -u REPLICA_USER \
    -p REPLICA_DATABASE_NAME RESULT_FILE
    Propiedad Descripción
    REPLICA_HOST Host en el que se encuentra el servidor MySQL.
    REPLICA_USER Nombre de usuario de MySQL para usar cuando te conectas al servidor.
    REPLICA_DATABASE_NAME Nombre de la base de datos en la que se encuentran los datos.
    RESULT_FILE El nombre del archivo de volcado que se importará.

    Ejemplo

      mysql -h 255.255.255.255 -u replica_username -p replica_db < result.sql
    

También puedes importar el archivo de volcado mediante un bucket de Google Cloud. Consulta Importa datos de un archivo de volcado de SQL a Cloud SQL

Desciende de nivel la instancia de Cloud SQL

Para descender de nivel a la instancia de Cloud SQL a una réplica de Cloud SQL, usa el método demoteMaster en la instancia.

  1. Prepara un archivo JSON de solicitud con el nombre de la instancia que deseas descender de nivel.

    Fuente JSON

     {
        "demoteMasterContext": {
          "masterInstanceName": SOURCE_REPRESENTATION_INSTANCE_NAME,
          "skipReplicationSetup": true
          }
     }
    Propiedad Descripción
    SOURCE_REPRESENTATION_INSTANCE_NAME Es el nombre de la instancia de representación de origen.

    Ejemplo

       {
         "demoteMasterContext": {
           "masterInstanceName": "cloudsql-source-instance",
           "skipReplicationSetup": true
         }
       }
  2. Abre una terminal y usa los siguientes comandos para invocar a demoteMaster:

    curl

      gcloud auth login
      ACCESS_TOKEN="$(gcloud auth print-access-token)"
      curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
        --header 'Content-Type: application/json' \
        --data @JSON_PATH \
        -X POST \
      https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE-NAME/demoteMaster
    Propiedad Descripción
    JSON_PATH La ruta de acceso al archivo JSON.
    PROJECT_ID Es el ID de tu proyecto en Google Cloud.
    INSTANCE-NAME El nombre de la instancia que deseas descender de nivel.

    Ejemplo

       gcloud auth login
       ACCESS_TOKEN="$(gcloud auth print-access-token)"
       curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @./source.json \
         -X POST \
       https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-replica-instance/demoteMaster

Qué deberías ver cuando termines

Para asegurarte de que las instancias se configuraron de forma correcta, ve a la página Instancias de Cloud SQL.

Deberías ver tu instancia de representación de origen y la réplica de Cloud SQL. Son similares a las siguientes:

ID de instancia Tipo IP pública
(-) source-representation-instance Primaria externa de MySQL 10.68.48.3:3306
replica-instance Réplica de lectura de MySQL 34.66.48.59

Inicia la replicación en la instancia de Cloud SQL

En este paso, se usan procedimientos almacenados de Cloud SQL. Los procedimientos almacenados de Cloud SQL se instalan después de llamar a la solicitud demoteMaster. Se quitan después de llamar a promoteReplica. Si deseas obtener más información, consulta Procedimientos almacenados para la administración de replicación.

  1. Accede a la instancia de réplica. Para obtener más información, consulta Conéctate con un cliente de base de datos desde una máquina local.
  2. Usa el procedimiento almacenado mysql.resetMaster para restablecer la configuración de la replicación.

     mysql> call mysql.resetMaster();
  3. Configura la replicación. Este paso requiere la información GTID o binlog que escribiste antes.

    GTID

    1. Configura el campo gtid_purged con el procedimiento almacenado mysql.skipTransactionWithGtid(GTID_TO_SKIP).
    Propiedad Descripción
    GTID_TO_SKIP El valor de conjunto GTID para configurar.

    Por ejemplo:

        mysql> call mysql.skipTransactionWithGtid('32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496');

    1. Ejecuta el procedimiento almacenado mysql.setupExternalSourceAutoPosition(HOST, PORT, USER_NAME, USER_PASSWORD, MASTER_AUTO_POSITION, USE_SSL, USE_SSL_CLIENT_AUTH).
    Propiedad Descripción
    HOST Extremo de origen.
    PORT Es el puerto de origen.
    USER_NAME Usuario de origen.
    USER_PASSWORD Contraseña del usuario de origen.
    MASTER_AUTO_POSITION Valor del parámetro master_auto_position. Los valores posibles son los siguientes: 0 y 1.
    USE_SSL Si se debe usar la replicación basada en SSL. Los valores posibles son los siguientes: true y false. Si es true, debes configurar el campo caCertificate en la solicitud DemoteMaster.
    USE_SSL_CLIENT_AUTH Si se debe usar la autenticación de cliente SSL. Los valores posibles son los siguientes: true y false. Si es true, debes configurar los campos clientKey y clientCertificates en la solicitud demoteMaster.
        mysql> call mysql.setupExternalSourceAutoPosition('1.1.1.1', 3306, \
        'USERNAME', 'PASSWORD', \
        /* master_auto_position= */ 1,false, false); \

    binlog

    Ejecuta el procedimiento almacenado mysql.setupExternalSource(HOST, PORT, USER_NAME, USER_PASSWORD, SOURCE_LOG_NAME, SOURCE_LOG_POS, USE_SSL, USE_SSL_CLIENT_AUTH).

    Propiedad Descripción
    HOST Extremo de origen.
    PORT Es el puerto de origen.
    USER_NAME Usuario de origen.
    USER_PASSWORD Contraseña del usuario de origen.
    SOURCE_LOG_NAME El nombre del registro binario de la instancia de base de datos de origen que contiene la información de replicación
    SOURCE_LOG_POS La ubicación en el registro binario mysql_binary_log_file_name en el que la replicación comienza a leer la información de replicación.
    USE_SSL Si se debe usar la replicación basada en SSL. Los valores posibles son los siguientes: true y false. Si es true, debes configurar el campo caCertificate en la solicitud DemoteMaster.
    USE_SSL_CLIENT_AUTH Si se debe usar la autenticación de cliente SSL. Los valores posibles son los siguientes: true y false. Si es true, debes configurar los campos clientKey y clientCertificates en la solicitud demoteMaster.
        mysql> call mysql.setupExternalSource('1.1.1.1', 3306, \
        'user_name', 'password', 'mysql-bin-changelog.033877', 360, \
        false, false);
  4. Usa el procedimiento almacenado mysql.startReplication() para iniciar la réplica desde la base de datos externa.

       mysql> call mysql.startReplication();
  5. Verifica el estado de la réplica. Asegúrate de que los campos Slave_IO_Running y Slave_SQL_Running digan YES.

       mysql> show slave status\G

    El resultado de este comando es similar al siguiente:

       *************************** 1. row ***************************
                       Slave_IO_State: Waiting for master to send event
                          Master_Host: 1.1.1.1
                          Master_User: user_name
                          Master_Port: 3306
                        Connect_Retry: 60
                      Master_Log_File: mysql-bin-changelog.000001
                  Read_Master_Log_Pos: 1
                       Relay_Log_File: relay-log.000002
                        Relay_Log_Pos: 1
                Relay_Master_Log_File: mysql-bin-changelog.000001
                     Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
                      Replicate_Do_DB:
                  Replicate_Ignore_DB:
                   Replicate_Do_Table:
               Replicate_Ignore_Table:
              Replicate_Wild_Do_Table:
          Replicate_Wild_Ignore_Table: mysql.%
                           Last_Errno: 0
                           Last_Error:
                         Skip_Counter: 0
                  Exec_Master_Log_Pos: 412
                      Relay_Log_Space: 752
                      Until_Condition: None
                       Until_Log_File:
                        Until_Log_Pos: 0
                   Master_SSL_Allowed: No
                   Master_SSL_CA_File:
                   Master_SSL_CA_Path:
                      Master_SSL_Cert:
                    Master_SSL_Cipher:
                       Master_SSL_Key:
                Seconds_Behind_Master: 0
        Master_SSL_Verify_Server_Cert: No
                        Last_IO_Errno: 0
                        Last_IO_Error:
                       Last_SQL_Errno: 0
                       Last_SQL_Error:
          Replicate_Ignore_Server_Ids:
                     Master_Server_Id: 1509941531
                          Master_UUID: 1cb2c80e-90f0-11eb-9ea3-02389b1c2e6f
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all r
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp:
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set:
                Executed_Gtid_Set: 478af53c-bd24-11eb-be72-42010a80002a:1-226
                    Auto_Position: 0
       1 row in set (0.00 sec)

Continúa con la replicación

Una vez que inicies la réplica desde el servidor externo, deberás supervisar la réplica y, luego, completar la migración. Para obtener más información, consulta Supervisa la réplica.

Solucionar problemas

Problema Soluciona problemas
Lost connection to MySQL server during query when dumping table. Es posible que el origen haya dejado de estar disponible o que el volcado contenga paquetes demasiado grandes.

Asegúrate de que la instancia principal externa esté disponible para conectarse. También puedes modificar los valores de las marcas net_read_timeout y net_write_timeout en la instancia de origen para detener el error. Para obtener más información sobre los valores permitidos para estas marcas, consulta Configura marcas de base de datos.

Si deseas obtener más información sobre el uso de marcas de mysqldump para la migración de importaciones administradas, consulta Marcas de sincronización iniciales permitidas y predeterminadas.

La migración inicial de los datos se realizó de forma correcta, pero no se están replicando los datos. Una causa raíz podría ser que la base de datos de origen haya definido marcas de replicación que den como resultado que no se repliquen algunos o todos los cambios de la base de datos.

Asegúrate de que las marcas de replicación, como binlog-do-db, binlog-ignore-db, replicate-do-db o replicate-ignore-db, no estén configuradas de manera conflictiva.

Ejecuta el comando show master status en la instancia principal para ver la configuración actual.

La migración inicial de los datos se realizó de forma correcta, pero la réplica de datos dejó de funcionar después de un tiempo. Solución:

  • Verifica las métricas de réplica para la instancia de réplica en la sección Cloud Monitoring de la consola de Google Cloud.
  • Los errores del subproceso de IO de MySQL o el de SQL se pueden encontrar en Cloud Logging en los archivos mysql.err log.
  • El error también se puede encontrar cuando te conectas a la instancia de réplica. Ejecuta el comando SHOW SLAVE STATUS y verifica los siguientes campos en el resultado:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full. El disco de datos de la instancia de réplica está lleno.

Aumenta el tamaño del disco de la instancia de réplica. Puedes aumentar el tamaño del disco de forma manual o habilitar el aumento de almacenamiento automático.

Revisa los registros de replicación

Cuando verificas la configuración de la replicación, se generan registros.

Puedes ver estos registros mediante los siguientes pasos:

  1. Ve al Visor de registros en la consola de Google Cloud.

    Ir al visor de registros

  2. Selecciona la réplica de Cloud SQL del menú desplegable Instancia.
  3. Selecciona el archivo de registro replication-setup.log.

Si la réplica de Cloud SQL no puede conectarse al servidor externo, confirma lo siguiente:

  • Cualquier firewall en el servidor externo se configura para permitir conexiones desde la dirección IP saliente de la réplica de Cloud SQL.
  • Tu configuración de SSL/TLS es correcta.
  • Tu usuario de repetición, host y contraseña son correctos.

¿Qué sigue?