Вось збой, які я бачыў двойчы, у двух розных рухавіках. Экспарт запускаецца а 10:00 і запісвае найвышэйшую адзнаку часу апошняга змянення, якую ўбачыў. Адна транзакцыя, што пачалася а 09:58, усё яшчэ адкрытая, фіксуецца а 10:03 і нясе адзнаку часу з моманту свайго пачатку. Наступны экспарт запытвае толькі радкі, навейшыя за 10:00, і ніколі яе не бачыць. Памер перадачы быў выдатны, а даныя — памылковыя.

Прайдзіце экспарт, які страціў радок

Прасочвайце парадак падзей, а не SQL. Прыкладанне запісвае час змянення радка пры пачатку транзакцыі, а не пры яе фіксацыі. Экспартэр чытае вадзяны знак па сценным гадзінніку, пакуль транзакцыя яшчэ адкрытая. Затым транзакцыя фіксуецца з часам змянення, старэйшым за захаваны вадзяны знак. Наступная партыя спажыўца пачынаецца пасля вадзянога знака, таму радок застаецца за курсорам і больш ніколі не будзе выбраны.

Нішто не запісвае памылку, бо нішто не зламалася. Менавіта гэта робіць гэты клас збояў дарагім: дэльта-паток хуткі, колькасці радкоў выглядаюць праўдападобна, а згублены радок усплывае праз тыдні як заяўка на зверку, якую ніхто не можа ўзнавіць.

Паслядоўныя нумары маюць такую ж форму заганы з іншай прычыны. Манатонны ID кажа вам пра парадак выдзялення значэнняў, а не пра парадак фіксацыі транзакцый. Транзакцыя, якая ўзяла нізкі нумар, можа зафіксавацца пасля той, што ўзяла высокі, таму курсор, заснаваны на парадку выдзялення, таксама можа пакінуць дзірку.

Пяць абяцанняў, якія паток павінен выканаць

Перш чым выбіраць транспарт, папрасіце ў сістэмы-крыніцы дамову з пяці пунктаў. Калі якогасьці пункта не хапае, у вас эўрыстыка, а не паток змен.

  • Пакрыццё: устаўкі, абнаўленні і выдаленні, кожнае з устойлівым ключом, патрэбным для прымянення.
  • Мяжа: што азначае значэнне курсора і што ўтрымлівае ўзгодненая партыя.
  • Узгодненасць: як чытаюцца злучаныя табліцы, не змешваючы несумяшчальныя станы крыніцы.
  • Захаванне: колькі часу адключаны спажывец можа аднаўляць працу са сваёй захаванай пазіцыі.
  • Перайніцыялізацыя: падтрыманы поўны здымак на выпадак, калі гэтая пазіцыя больш не сапраўдная.

Падтрыманы механізм можа задаволіць усе пяць. Дакументацыя SQL Server пра адсочванне змен — адзін канкрэтны апублікаваны прыклад: ён вызначае мінімальную сапраўдную версію, запісвае выдаленні разам са зменамі і апісвае транзакцыю здымка, якая ахоплівае праверку, захоп версіі і звязаныя запыты змен. Гэта прыклад таго, што трэба патрабаваць ад крыніцы, а не сінтаксіс, які можна ўставіць у іншы рухавік.

Праектуйце кантрольную кропку як частку канвеера

Захаваная пазіцыя спажыўца — гэта сапраўдная машына станаў, таму апішыце яе як такую. Курсор можа прасоўвацца толькі праз працоўны працэс, які ўжо прымяніў партыю і зафіксаваў мэтавую транзакцыю.

cursor  = durable_checkpoint()          # last fully applied position
batch   = extract(cursor, upper_bound)  # one consistent batch
apply(batch)                            # idempotent at the target
commit()
checkpoint(batch.upper_bound)           # only now

Калі дастаўка зрываецца на паўдарозе, зверыце тую ж партыю, а не выдумляйце новую пазіцыю крыніцы. Паўторнае выманне з больш свежай верхняй мяжой — гэта шлях, якім частковае прымяненне становіцца пастаяннай прагалінай. Люстраное правіла дзейнічае і з другога боку: ідэмпатэнтнае прымяненне на мэце прадухіляе дублікаты і нічога не робіць для змены, якую выманне ніколі не бачыла.

Выдаленні патрабуюць запісаў, а не высноў

Параўнанне радкоў, якія яшчэ існуюць, не можа сказаць спажыўцу, якія ключы зніклі. Крыніца, якая ніколі не запісвае выдаленні, пакідае вам два недасканалыя варыянты: трымаць гісторыю ключоў дастаткова доўга для параўнання або выконваць яўную поўную зверку па раскладанні. Абодва — праектныя рашэнні з коштам, і ні адно не існуе, пакуль хтосьці за яго не адказвае.

Захаванне — такое ж рашэнне. Кожны падтрыманы паток змен мае акно; укажыце яго ў дамове і папярэджвайце, калі кантрольная кропка спажыўца набліжаецца да яго. Спажывец, які прачнуўся пасля двухтыднёвага перапынку, павінен прачытаць ясную памылку "патрабуецца перайніцыялізацыя", а не моўчкі атрымаць частковую партыю.

Затым памерце, ці каштуе дэльта намаганняў

Вярнуцца да параўнання кожнага ключа і хэша часам правільна, і варта ведаць, колькі гэта каштуе. Вы ўсё яшчэ перадаяце звесткі пра кожны радок, хэшы не даюць узгодненага здымка па табліцах, а схема хэшаў прыносіць свае пытанні пра прадстаўленне і калізіі. Менш байтаў з правяральнай мяжой — гэта мэта; менш байтаў, якія моўчкі губляюць зафіксаваную змену, — зусім не дэльта.

Слупок апошняга змянення — гэта падказка. Курсор, які перажывае позні каміт, выдаленне і доўгі перапынак, — гэта дамова.

Падобныя артыкулы