MariaDB replikering: Tjek af data

Efter et stykke tid, vil du sikkert gerne vide om alt bliver replikeret korrekt til din slave og fikse eventuelle forskelle i data mellem master og slave. Her er percona-toolkit et rigtig godt værktøj

Bemærk i nedenstående kodeblokke: Når du ser ordet MASTER i første linie, skal blokken eksekveres på din master server, og vise versa når der står SLAVE.

Installér percona-toolkit

Vi skal bruge to værktøjer, nemlig pt-table-checksum og pt-table-sync. Begge tools er tilgængelige i percona-toolkit

Læs evt. også her “Configuring percona repository on Debian and Ubuntu

Tjek data med pt-table-checksum

Opret en checksum bruger

Opret en bruger til formålet. Denne bruger vil også blive brugt til at forbinde til din slave. Hvis du ikke replikerer mysql databasen, skal du derfor huske at oprette denne bruger både på master og slave:

Man kan sagtens give privilegier til en database der ikke er oprettet endnu. Databasen percona oprettes automatisk første gang du afvikler pt-table-checksum. 

Brug af pt-table-checksum

Sådan kunne det se ud når du tjekker din replikering for uoverensstemmelser i data mellem master og slave:

Første gang jeg afprøvede pt-table-checksum, som i ovennævnte eksempel, fik jeg et fantastisk fint resultat. Alt så ud til at være replikeret til slaven… Lige indtil jeg læste en af de første linier:

pt-table-checksum diffs cannot be detected because no slaves were found

Det den fortæller her er, at den ikke kan konstatere forskel i data mellem master og slave, fordi den ganske enkelt ikke kan finde slaven.

Så først skal du sikre dig at pt-table-checksum kan få information om din slave via din master. Det skal helst se således ud:

Hvis SHOW SLAVE HOSTS ikke returnerer noget information, skal du sætte report_host i my.cnf på slaven. Du sætter den til et hostnavn eller ip som kan bruges til at forbinde fra masteren:

Sådanne… vi prøver igen. Men ak og ve:

Replica [hostnavn] has binlog_format MIXED which could cause pt-table-checksum to break replication. Please read “Replicas using row-based replication” in the LIMITATIONS section of the tool’s documentation. If you understand the risks, specify –no-check-binlog-format to disable this check.

Og under LIMITATIONS finder vi følgende:

pt-table-checksum requires statement-based replication, and it sets binlog_format=STATEMENT on the master, but due to a MySQL limitation replicas do not honor this change. Therefore, checksums will not replicate past any replicas using row-based replication that are masters for further replicas.

Det her er altså kun et problem hvis min slave er “relay” for andre slaver. Det er ikke tilfældet, så jeg skulle roligt kunne tilføje --no-check-binlog-format:

Nå… fejl igen:

Replication filters are set on these hosts: [hostnavn]
slave_skip_errors = 1062,1146
Please read the –check-replication-filters documentation to learn how to solve this problem. at /usr/bin/pt-table-checksum line 9825.

Skal jeg være helt ærligt, er jeg ikke helt klar over konsekvensen af at sætte –no-check-replication-filters. Men jeg gjorde det:

… og nu kører den 🙂

I output skal du holde høje med kolonnerne diff og skipped. De skulle gerne være 0 (nul) hele vejen igennem, medmindre der er difference i data mellem master og slave.

Bug i version 3.0.4

Hvis du bruger pt-table-checksum version 3.0.4 og output ikke viser fejl, når den burde, er du sandsynligvis ramt af denne bug:

https://bugs.launchpad.net/percona-toolkit/+bug/1715801

Løsningen er at tilføje --set-vars binlog_format=statement

Du kan se mit spørgsmål/svar i den forbindelse på StackOverflow: https://stackoverflow.com/questions/4609…

Synkronisér med pt-table-sync

Når du med pt-table-checksum har fundet differencer mellem master og slave, kan du udbedre det med pt-table-sync. Husk at vi her tager udgangspunkt i et simpelt master -> slave setup. Derudover forudsætter eksemplet her, at det er slaven der mangler data i forhold til masteren.

Opret en sync bruger

Allerførst skal du oprette en bruger til formålet. Udfør følgende på din master og husk at erstatte bruger, vært og adgangskode med dine egne værdier:

Brug af pt-table-sync

Find et tidspunkt hvor Seconds_Behind_Master er 0 (nul), hvis det er muligt.

Først beder jeg pt-table-sync om at skrive de sql queries der skal til for at slaven kan føres up-to-date. Jeg udelader --execute og bruger i stedet --print. Output skrives til en sql fil så jeg kan vurdere de ændringer pt-table-sync mener der skal til. Derefter kan jeg vælge at eksekvere filen. :

Erstat 10.0.0.49 med den interne ip på din slave, eller slavens hostnavn. Erstat pt_checksum og password med dine egne værdier for den bruger du oprettede.

Hvis --databases udelades vil den medtage alt. Du bør derfor angive de databaser der skal synkroniseres.

Overfør sync.sql til din slave, f.eks. med scp:

Hvor bruger er din ssh bruger og host er ip eller hostnavn på slaven.

Indlæs data på slaven

På slaven kan du nu stoppe synkronisering midlertidigt, mens du indlæser data. Bemærk --default-character-set som jeg har medtaget fordi databasen i dette tilfælde har latin1 som standard karaktersæt. Uden den parameter vil fejlen “Incorrect string value” opstå når data indlæses.