Mysql
 sql >> Database >  >> RDS >> Mysql

Eseguire il backup di MySQL Amazon RDS

RDS non consente nemmeno all'utente master il SUPER privilegio, e questo è necessario per eseguire FLUSH TABLES WITH READ LOCK . (Questa è una sfortunata limitazione di RDS).

L'istruzione non riuscita viene generata da --master-data opzione, che è, ovviamente, necessaria se vuoi essere in grado di apprendere le coordinate precise del binlog in cui inizia il backup. FLUSH TABLES WITH READ LOCK acquisisce un blocco di lettura globale su tutte le tabelle, che consente a mysqldump di START TRANSACTION WITH CONSISTENT SNAPSHOT (come fa con --single-transaction ) e poi SHOW MASTER STATUS per ottenere le coordinate del log binario, dopodiché rilascia il blocco di lettura globale perché ha una transazione che manterrà i dati visibili in uno stato coerente con quella posizione del log.

RDS rompe questo meccanismo negando il SUPER privilegio e non fornendo una soluzione alternativa ovvia.

Sono disponibili alcune opzioni hacky per aggirare correttamente questo problema, nessuna delle quali potrebbe essere particolarmente interessante:

  • eseguire il backup durante un periodo di traffico ridotto. Se le coordinate del binlog non sono cambiate tra il momento in cui avvii il backup e dopo che il backup ha iniziato a scrivere i dati nel file di output o nel server di destinazione (supponendo che tu abbia usato --single-transaction ) allora funzionerà perché sai che le coordinate non sono cambiate mentre il processo era in esecuzione.

  • osservare la posizione del binlog sul master subito prima di avviare il backup e utilizzare queste coordinate con CHANGE MASTER TO . Se il binlog_format del tuo master è impostato su ROW quindi questo dovrebbe funzionare, anche se probabilmente dovrai saltare alcuni errori iniziali, ma non dovresti avere successivamente alcun errore. Funziona perché la replica basata su riga è molto deterministica e si interromperà se tenta di inserire qualcosa che è già presente o di eliminare qualcosa che è già andato. Una volta superati gli errori, sarai alle vere coordinate del binlog in cui è iniziata effettivamente l'istantanea coerente.

  • come nell'elemento precedente, ma, dopo aver ripristinato il backup, provare a determinare la posizione corretta utilizzando mysqlbinlog --base64-output=decode-rows --verbose per leggere il binlog del master alle coordinate che hai ottenuto, controllando il tuo nuovo slave per vedere quali eventi devono essere già stati eseguiti prima che lo snapshot iniziasse effettivamente, e usando le coordinate così determinate per CHANGE MASTER TO .

  • utilizzare un processo esterno per ottenere un blocco di lettura su ogni singola tabella sul server, che interromperà tutte le scritture; osserva che la posizione del binlog da SHOW MASTER STATUS ha smesso di aumentare, avvia il backup e rilascia quei blocchi.

Se si utilizza uno di questi approcci diversi dall'ultimo, è particolarmente importante eseguire confronti tra tabelle per essere certi che lo slave sia identico al master una volta che è in esecuzione. Se hai riscontrato errori di replica successivi... non lo era.

Probabilmente l'opzione più sicura, ma forse anche la più fastidiosa poiché sembra che non dovrebbe essere necessario, è iniziare creando una replica di lettura RDS del master RDS. Una volta che è attivo e sincronizzato con il master, è possibile interrompere la replica sulla replica di lettura RDS eseguendo una stored procedure fornita da RDS, CALL mysql.rds_stop_replication che è stato introdotto in RDS 5.6.13 e 5.5.33 che non richiede il SUPER privilegio.

Con lo slave di replica RDS fermo, prendi il tuo mysqldump dalla replica di lettura RDS, che ora avrà un set di dati immutabile su di esso a partire da un set specifico di coordinate principali. Ripristina questo backup sul tuo slave fuori sede e quindi utilizza le coordinate master della replica di lettura RDS da SHOW SLAVE STATUS Exec_Master_Log_Pos e Relay_Master_Log_File come tuo CHANGE MASTER TO coordinate.

Il valore mostrato in Exec_Master_Log_Pos su uno slave è l'inizio della transazione successiva o evento da elaborare , ed è proprio lì che il tuo nuovo schiavo deve iniziare a leggere sul master.

Quindi puoi disattivare la replica di lettura RDS una volta che lo slave esterno è attivo e funzionante.