sql >> Base de Datos >  >> RDS >> Mysql

Copia de seguridad MySQL Amazon RDS

RDS no permite ni siquiera al usuario maestro el SUPER privilegio, y esto es necesario para ejecutar FLUSH TABLES WITH READ LOCK . (Esta es una limitación desafortunada de RDS).

La declaración fallida está siendo generada por --master-data opción, que es, por supuesto, necesaria si desea poder aprender las coordenadas precisas del binlog donde comienza la copia de seguridad. FLUSH TABLES WITH READ LOCK adquiere un bloqueo de lectura global en todas las tablas, lo que permite que mysqldump START TRANSACTION WITH CONSISTENT SNAPSHOT (como lo hace con --single-transaction ) y luego SHOW MASTER STATUS para obtener las coordenadas del registro binario, después de lo cual libera el bloqueo de lectura global porque tiene una transacción que mantendrá los datos visibles en un estado consistente con esa posición del registro.

RDS rompe este mecanismo al negar el SUPER privilegio y no proporciona una solución obvia.

Hay algunas opciones de piratería disponibles para solucionar esto correctamente, ninguna de las cuales puede ser particularmente atractiva:

  • haga la copia de seguridad durante un período de poco tráfico. Si las coordenadas binlog no han cambiado entre el momento en que inicia la copia de seguridad y después de que la copia de seguridad haya comenzado a escribir datos en el archivo de salida o en el servidor de destino (suponiendo que haya utilizado --single-transaction ) entonces esto funcionará porque sabe que las coordenadas no cambiaron mientras se ejecutaba el proceso.

  • observe la posición binlog en el maestro justo antes de iniciar la copia de seguridad y use estas coordenadas con CHANGE MASTER TO . Si el binlog_format de su maestro está establecido en ROW entonces esto debería funcionar, aunque probablemente tendrá que pasar por alto algunos errores iniciales, pero no debería tener ningún error posteriormente. Esto funciona porque la replicación basada en filas es muy determinista y se detendrá si intenta insertar algo que ya está ahí o eliminar algo que ya no está. Una vez pasados ​​los errores, estará en las verdaderas coordenadas binlog donde realmente comenzó la instantánea consistente.

  • como en el elemento anterior, pero, después de restaurar la copia de seguridad, intente determinar la posición correcta usando mysqlbinlog --base64-output=decode-rows --verbose para leer el binlog del maestro en las coordenadas que obtuvo, verificando su nuevo esclavo para ver cuál de los eventos ya debe haberse ejecutado antes de que la instantánea realmente comenzara, y usando las coordenadas determinadas de esta manera para CHANGE MASTER TO .

  • use un proceso externo para obtener un bloqueo de lectura en todas y cada una de las tablas del servidor, lo que detendrá todas las escrituras; observe que la posición binlog de SHOW MASTER STATUS ha dejado de aumentar, inicie la copia de seguridad y libere esos bloqueos.

Si usa cualquiera de estos enfoques, además del último, es especialmente importante que haga comparaciones de tablas para asegurarse de que su esclavo sea idéntico al maestro una vez que se esté ejecutando. Si encuentra errores de replicación subsiguientes... entonces no lo fue.

Probablemente la opción más segura, pero también la más molesta ya que parece que no debería ser necesario, es comenzar creando una réplica de lectura RDS de su maestro RDS. Una vez que esté activo y sincronizado con el maestro, puede detener la replicación en la réplica de lectura de RDS ejecutando un procedimiento almacenado proporcionado por RDS, CALL mysql.rds_stop_replication que se introdujo en RDS 5.6.13 y 5.5.33 que no requiere el SUPER privilegio.

Con el esclavo de réplica RDS detenido, tome su mysqldump de la réplica de lectura RDS, que ahora tendrá un conjunto de datos inalterable a partir de un conjunto específico de coordenadas maestras. Restaure esta copia de seguridad en su esclavo fuera del sitio y luego use las coordenadas maestras de la réplica de lectura RDS de SHOW SLAVE STATUS Exec_Master_Log_Pos y Relay_Master_Log_File como su CHANGE MASTER TO coordenadas

El valor que se muestra en Exec_Master_Log_Pos en un esclavo es el inicio de la siguiente transacción o evento a procesar , y ahí es exactamente donde su nuevo esclavo debe comenzar a leer en el maestro.

Luego, puede retirar la réplica de lectura de RDS una vez que su esclavo externo esté en funcionamiento.