Incidentu reaģēšana

MySQL replikācijas kļūda 1062 un 1032: kā droši salabot apstājušos repliku

Replica_SQL_Running rāda No, un Last_SQL_Error min dublētu ierakstu vai ierakstu, ko nevar atrast. Notikuma izlaišana atjauno replikāciju minūtes laikā. Vai replika pēc tam joprojām ir pareiza, ir cits jautājums.

· 11 min lasīšanai · AG Data komanda

MySQL replikācijas kļūda 1062 ir klasisks iemesls, kāpēc replika apstājas: replika mēģina ievietot rindu un atklāj, ka rinda ar tādu pašu atslēgu tur jau ir. Tās dvīne, kļūda 1032, ir pretēja: avots atjaunināja vai izdzēsa rindu, kuras replikā nav. Abas izskatās pēc mazām, lokālām problēmām, un abas var "salabot" dažās sekundēs, izlaižot notikumu. Bet abas nozīmē vienu un to pašu nepatīkamo lietu: replikas dati bija novirzījušies no avota jau pirms kļūdas parādīšanās.

1. solis: pārliecinieties, kas apstājās

Sāciet ar SHOW REPLICA STATUS:

SHOW REPLICA STATUS\G
-- look at: Replica_IO_Running, Replica_SQL_Running,
--          Last_SQL_Errno, Last_SQL_Error, Last_SQL_Error_Timestamp

Ja Replica_IO_Running ir Yes, bet Replica_SQL_Running ir No, replika joprojām saņem avota izmaiņas, bet ir pārtraukusi tās piemērot. Tieši par šo situāciju ir šis raksts. Ja abi pavedieni darbojas un replika vienkārši atpaliek, tā ir aizkave, nevis bojājums; skatiet mūsu ceļvedi par MySQL replikācijas aizkavi.

Daudzpavedienu replikā noderīgās detaļas atrodas Performance Schema tabulā replication_applier_status_by_worker:

SELECT CHANNEL_NAME, WORKER_ID,
       LAST_ERROR_NUMBER, LAST_ERROR_MESSAGE, LAST_ERROR_TIMESTAMP,
       APPLYING_TRANSACTION
FROM performance_schema.replication_applier_status_by_worker
WHERE LAST_ERROR_NUMBER <> 0;

APPLYING_TRANSACTION dod tās transakcijas GTID, kuru piemēroja kļūdainais darba pavediens. Pierakstiet to; tas būs vajadzīgs.

Ko 1062 un 1032 patiesībā nozīmē

Servera kļūdu sarakstā 1062 ir ER_DUP_ENTRY ("Duplicate entry ... for key ...") un 1032 ir ER_KEY_NOT_FOUND ("Can't find record in ..."). Replikā avots transakciju jau ir veiksmīgi apstiprinājis. Tātad pati transakcija ir kārtībā; nav kārtībā replikas datu kopija. Tipiski ceļi līdz tam:

2. solis: apskatiet transakciju, pirms lemjat

Atrodiet transakciju pēc tās GTID ar SHOW RELAYLOG EVENTS replikā, SHOW BINLOG EVENTS avotā vai ar mysqlbinlog ap kļūdas laiku. Pēc tam salīdziniet skarto rindu avotā un replikā. MySQL rokasgrāmata iesaka pirms jebkā izlaišanas uzdot trīs jautājumus:

3. solis: izvēlieties risinājumu

A variants: izlabojiet repliku un ļaujiet transakcijai piemēroties. Ja replikā ir lieka rinda, kuras avotā nekad nav bijis (tipiski 1062 pēc tiešas rakstīšanas), un pareizā ir avota versija, šīs rindas noņemšana vai labošana replikā un START REPLICA ļauj sākotnējai transakcijai piemēroties tīri. Tas ir tīrākais iznākums, jo nekas netiek izlaists. Ja šī replika vēlāk var kļūt par avotu, uzmanieties, lai labojums neierakstītos replikas binārajā žurnālā kā jauna transakcija; saplānojiet to kopā ar topoloģijas atbildīgo.

B variants: izlaidiet transakciju ar GTID. Ja gtid_mode=ON, transakciju izlaiž, apstiprinot tukšu transakciju ar tās GTID. Rokasgrāmata saka, ka vispirms jāaptur abi replikācijas pavedieni:

STOP REPLICA;
SET GTID_NEXT = '3e11fa47-71ca-11e1-9e33-c80aa9429562:23';  -- the failing GTID
BEGIN;
COMMIT;
SET GTID_NEXT = 'AUTOMATIC';
START REPLICA;

Tagad replika uzskata šo GTID par izpildītu un ignorē īsto transakciju, kad tā pienāk. Ja replikā ieslēgta binārā žurnalēšana, šī tukšā transakcija paliek tās binārajā žurnālā un nonāk replikācijas plūsmā, ja replika vēlāk kļūst par avotu; rokasgrāmata apraksta, kā no tā izvairīties ar FLUSH LOGS un PURGE BINARY LOGS. Metode nav piemērota, ja kanālā ieslēgts ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS.

C variants: izlaišana bez GTID. Pozīciju replikācijā sql_replica_skip_counter liek nākamajam START REPLICA izlaist notikumus:

STOP REPLICA;
SET GLOBAL sql_replica_skip_counter = 1;
START REPLICA;

Tas skaita notikumus, nevis transakcijas, un turpina līdz notikumu grupas beigām, lai neapstātos tās vidū. To nevar izmantot, ja gtid_mode=ON, un nākamais START REPLICA to atiestata uz 0.

D variants: pārbūvējiet repliku. Ja kļūdas atkārtojas vai konsekvences pārbaude rāda plašas atšķirības, pārtrauciet lāpīt. Pārbūvējiet repliku no svaigas, konsekventas avota rezerves kopijas. Tas ir arī labs brīdis pārliecināties, ka rezerves kopijas tiešām atjaunojas; mūsu ceļvedis par rezerves kopiju un atjaunošanas testēšanu apraksta, kā.

Izlaišana salabo replikāciju, nevis datus. Pēc B vai C varianta replika atkal darbojas, bet joprojām atšķiras no avota vismaz ar rindu, kas izraisīja kļūdu, plus pašu izlaisto transakciju. Uztveriet izlaišanu kā pagaidu pasākumu un ieplānojiet konsekvences pārbaudi.

Divi iestatījumi, kurus labāk neaiztikt

Pēc labojuma: pārbaudiet konsekvenci un novērsiet nākamo

Galvenās atziņas

MySQL Replikācija GTID Incidentu reaģēšana
Sadarbība ar mums

Replika apstājās, un nezināt, vai drīkst izlaist?

Mēs diagnosticējam salūzušu MySQL un MariaDB replikāciju, atjaunojam replikas sinhronitāti un iestatām pārbaudes, kas nobīdi pamana laikus. Pirmā reakcija uz kritiskiem incidentiem 15 minūšu laikā, 24/7.

Sazināties Vairāk no emuāra