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 elbinlog_format
de su maestro está establecido enROW
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 paraCHANGE 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.