Бул — мен эки ар башка кыймылдаткычта эки жолу көргөн ишке ашпоочулук. Экспорт 10:00дө иштеп, көргөн эң жогорку акыркы өзгөртүү убакыт белгисин жазат. 09:58де башталган бир транзакция дагы эле ачык, 10:03тө коммиттелет жана өзү башталган учурдун убакыт белгисин алып жүрөт. Кийинки экспорт 10:00дөн жаңы саптарды гана сурайт жана аны эч качан көрбөйт. Өткөрүү көлөмү эң сонун болду, ал эми маалымат туура эмес болчу.

Бир сапты жоготкон экспортту байкаңыз

SQLди эмес, окуялардын тартибин байкаңыз. Колдонмо саптын өзгөрүү убактысын транзакция башталганда жазат, коммиттелгенде эмес. Экспорттоочу транзакция ачык турганда дубал саатынын суу белгисин окуйт. Анан транзакция сакталган суу белгисинен эскирээк өзгөрүү убактысы менен коммиттелет. Керектөөчүнүн кийинки партиясы суу белгисинен кийин башталат, ошондуктан сап курсордун артында калат жана эч качан кайра тандалбайт.

Эч нерсе ката жазбайт, анткени эч нерсе ишке ашкан жок. Бул ушул класстагы катаны кымбат кылат: дельта агымы тез, сап саны ишенимдүү көрүнөт, ал эми жоголгон сап жумалардан кийин эч ким кайталай албаган салыштыруу билети катары чыгат.

Тартип номерлеринде башка себептен ушул эле формадагы кемчилик бар. Монотондуу ID маанилердин бөлүштүрүлүү тартибин айтат, транзакциялардын коммиттелиш тартибин эмес. Төмөнкү номер алган транзакция жогорку номер алгандан кийин коммиттелиши мүмкүн, ошондуктан бөлүштүрүү тартибине негизделген курсор да тешик калтырышы мүмкүн.

Агым аткарууга тийиш беш убада

Транспортту тандоодон мурун баштапкы системадан беш пункттан турган келишим сураңыз. Кайсы бир пункт жетишпесе, сизде өзгөрүүлөр агымы эмес, эвристика бар.

  • Камтуу: киргизүүлөр, жаңыртуулар жана жок кылуулар, ар бири колдонуу үчүн керектүү туруктуу ачкыч менен.
  • Чек: курсордун мааниси эмнени билдирет жана ырааттуу партия эмнени камтыйт.
  • Ырааттуулук: шайкеш келбеген булак абалдарын аралаштырбай байланыштуу таблицалар кантип окулат.
  • Сактоо: ажыратылган керектөөчү сакталган ордунан канча убакыт уланта алат.
  • Кайра инициализация: ал орун мындан ары жарактуу болбогондо колдоого алынган толук snapshot.

Колдоого алынган механизм бешеөнү тең канааттандыра алат. SQL Serverдин өзгөрүүлөрдү көзөмөлдөө документтери бир конкреттүү жарыяланган мисал: ал минималдуу жарактуу версияны аныктайт, өзгөрүүлөр менен катар жок кылууларды да жазат жана текшерүүнү, версияны тартууну жана байланыштуу өзгөрүү суроолорун камтыган snapshot транзакциясын сүрөттөйт. Бул булактан эмнени талап кылуу керектигинин мисалы, башка кыймылдаткычка чаптоого боло турган синтаксис эмес.

Көзөмөл чекитин куурчактын бөлүгү катары долбоорлоңуз

Керектөөчүнүн сакталган орду — чыныгы абал машинасы, ошондуктан аны ошондой жазыңыз. Курсор партияны мурунтан колдонуп, максаттуу транзакцияны коммиттеген жумуш агымы аркылуу гана алдыга жыла алат.

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

Жеткирүү жарым жолдо ишке ашпаса, жаңы булак ордун ойлоп табуунун ордуна ошол эле партияны салыштырыңыз. Жаңыраак жогорку чек менен кайра алуу — жарым-жартылай колдонуунун туруктуу боштукка айлануу жолу. Күзгү эрежеси экинчи тарапта да иштейт: максатта идемпотенттик колдонуу кайталоолорду алдын алат жана алуу эч качан көрбөгөн өзгөрүү үчүн эч нерсе кылбайт.

Жок кылууларга жазуу керек, тыянак эмес

Дагы бар саптарды салыштыруу керектөөчүгө кайсы ачкычтар жоголгонун айта албайт. Жок кылууларды эч качан жазбаган булак сизге эки толук эмес вариантты калтырат: diff үчүн ачкыч тарыхын жетиштүү узак сактоо же график боюнча ачык толук салыштырууну иштетүү. Экөө тең чыгымдуу дизайн чечимдери жана эч бири ээси жок болсо жашабайт.

Сактоо да ушундай чечим. Ар бир колдоого алынган өзгөрүүлөр агымынын терезеси бар; аны келишимде көрсөтүңүз жана керектөөчүнүн көзөмөл чекити ага жакындаганда эскертиңиз. Эки жумалык үзгүлтүктөн кийин ойгонгон керектөөчү үнсүз жарым-жартылай партия алуунун ордуна "кайра инициализация керек" деген ачык катаны окушу керек.

Анан дельтанын татыктуу болгонун өлчөңүз

Ар бир ачкыч менен хэшти салыштырууга кайтуу кээде туура жана анын канча турганын билүү керек. Сиз дагы эле ар бир сап тууралуу маалыматты өткөрүп жатасыз, хэштер таблицалар аралык ырааттуу snapshot бербейт, ал эми хэш схемасы сунуштоо жана кагылышуулар тууралуу өз суроолорун алып келет. Текшериле турган чек менен азыраак байт — максат; коммиттелген өзгөрүүнү үнсүз түшүрүп кеткен азыраак байт такыр дельта эмес.

Акыркы өзгөртүү мамычасы — белги. Кеч коммитти, жок кылууну жана узак үзгүлтүктү башынан өткөргөн курсор — келишим.

Тектеш макалалар