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

Sikkerhedskopier MySQL Amazon RDS

RDS tillader ikke engang masterbrugeren SUPER privilegium, og dette er påkrævet for at udføre FLUSH TABLES WITH READ LOCK . (Dette er en uheldig begrænsning af RDS).

Den fejlagtige sætning genereres af --master-data mulighed, hvilket naturligvis er nødvendigt, hvis du vil kunne lære de præcise binlog-koordinater, hvor sikkerhedskopieringen begynder. FLUSH TABLES WITH READ LOCK anskaffer en global læselås på alle tabeller, som gør det muligt for mysqldump at START TRANSACTION WITH CONSISTENT SNAPSHOT (som det gør med --single-transaction ) og derefter SHOW MASTER STATUS for at få de binære logkoordinater, hvorefter den frigiver den globale læselås, fordi den har en transaktion, der vil holde de synlige data i en tilstand, der stemmer overens med den pågældende logposition.

RDS bryder denne mekanisme ved at afvise SUPER privilegium og giver ingen åbenlys løsning.

Der er nogle hacky-muligheder tilgængelige for korrekt at omgå dette, og ingen af ​​dem kan være særligt attraktive:

  • lav backup i en periode med lav trafik. Hvis binlog-koordinaterne ikke har ændret sig mellem det tidspunkt, du starter sikkerhedskopieringen, og efter sikkerhedskopieringen er begyndt at skrive data til outputfilen eller destinationsserveren (forudsat at du brugte --single-transaction ), så vil dette virke, fordi du ved, at koordinaterne ikke ændrede sig, mens processen kørte.

  • observer binlog-positionen på masteren lige før du starter sikkerhedskopieringen, og brug disse koordinater med CHANGE MASTER TO . Hvis din masters binlog_format er indstillet til ROW så burde dette virke, selvom du sandsynligvis skal springe forbi et par indledende fejl, men du skal ikke efterfølgende have nogen fejl. Dette virker, fordi rækkebaseret replikering er meget deterministisk og vil stoppe, hvis den forsøger at indsætte noget, der allerede er der, eller slette noget, der allerede er væk. Når du har passeret fejlene, vil du være ved de sande binlog-koordinater, hvor det konsistente øjebliksbillede faktisk startede.

  • som i det forrige punkt, men efter at have gendannet sikkerhedskopien, prøv at bestemme den korrekte position ved at bruge mysqlbinlog --base64-output=decode-rows --verbose at læse masterens binlog på de koordinater, du har opnået, kontrollere din nye slave for at se, hvilke af begivenhederne der allerede skal være udført, før snapshottet rent faktisk startede, og bruge koordinaterne bestemt på denne måde til at CHANGE MASTER TO .

  • brug en ekstern proces til at opnå en læselås på hver eneste tabel på serveren, som vil stoppe alle skrivninger; Bemærk, at binlog-positionen fra SHOW MASTER STATUS er stoppet med at stige, start sikkerhedskopieringen, og slip disse låse.

Hvis du bruger nogen af ​​disse metoder bortset fra måske den sidste, er det især vigtigt, at du laver tabelsammenligninger for at være sikker på, at din slave er identisk med masteren, når den kører. Hvis du rammer efterfølgende replikeringsfejl... så var det ikke.

Sandsynligvis den sikreste mulighed -- men måske også den mest irriterende da det ser ud til at det ikke burde være nødvendigt -- er at begynde med at lave en RDS-læse-replika af din RDS-master. Når den først er oppe og synkroniseret til masteren, kan du stoppe replikering på RDS læse replikaen ved at udføre en RDS-leveret lagret procedure, CALL mysql.rds_stop_replication som blev introduceret i RDS 5.6.13 og 5.5.33 som ikke kræver SUPER privilegium.

Med RDS replika-slaven stoppet, tag din mysqldump fra RDS læse replikaen, som nu vil have et uforanderligt datasæt på sig som et specifikt sæt masterkoordinater. Gendan denne sikkerhedskopi til din off-site slave, og brug derefter RDS-læs replikaens masterkoordinater fra SHOW SLAVE STATUS Exec_Master_Log_Pos og Relay_Master_Log_File som din CHANGE MASTER TO koordinater.

Værdien vist i Exec_Master_Log_Pos på en slave er starten på den næste transaktion eller begivenhed, der skal behandles , og det er præcis her, din nye slave skal begynde at læse på masteren.

Derefter kan du tage RDS-læse-replikaen ud af drift, når din eksterne slave er oppe og køre.



  1. SYSDATE-funktion i Oracle

  2. Sådan fungerer LOG2() i MariaDB

  3. Mysql:Vælg rækker fra en tabel, der ikke er i en anden

  4. Kaldning af lagret funktion eller procedure vil ikke indsætte og fortsætte ændringer