Šredingerio Paradoksas MySQL

Jei kada nors gilinotės į fiziką ir ypač į kvantinę mechaniką, tikriausiai girdėjote apie keistą reiškinį pavadintą Šredingerio paradoksu arba Šredingerio kate. Trumpai tariant, Šredingerio katė yra minties eksperimentas, kurį 1935 m. atliko austrų-airių fizikas Erwinas Šredingeris diskusijoje su Albertu Einšteinu: eksperimentas iliustruoja hipotetinę katę, kuri vienu metu gali būti laikoma ir gyva ir mirusia.

Kaip Šredingerio Paradoksas Susijęs su MySQL?

Kaip jau minėta aukščiau, Šredingerio paradoksas iliustruoja kažką, kas tuo pačiu metu gali būti laikoma gyvu ir mirusiu objektu, todėl gali kilti klausimas, kaip šis eksperimentas yra susijęs su MySQL? Viskas yra gana paprasta: tokia problema gali atsirasti po to, kai viduryje MySQL atliekamų operacijų nutrūksta maitinimas: pavyzdžiui, taip gali atsitikti tada, kai į duomenų bazę yra importuojami duomenys ir importavimo procesas nepasibaigia todėl, nes dingsta elektra ar internetas. ACID savybės čia gali padėti, tačiau gali ir nebūti ypač naudingos. ACID savybės skirtos garantuoti duomenų vientisumą nepaisant maitinimo sutrikimų ir kitų problemų, tačiau jei po nepavykusios operacijos su MySQL atliekate tam tikras kitas operacijas, gali būti, kad problema visai ne ACID. Tikriausiai čia jūs susidūrėte su šiek tiek kitokia problema: Šredingerio paradoksu MySQL.

Norėdami įsitikinti, kad susidūrėte su Šredingerio paradoksu MySQL, atlikite šiuos veiksmus:

  1. Įvykdykite SHOW TABLES; užklausą Jūsų MySQL serveryje ir paieškokite lentelės – jos neturėtų būti sąraše.
  2. Pabandykite sukurti tą pačią lentelę iš naujo su CREATE TABLE užklausa. MySQL turėtų pateikti klaidą, kad lentelė jau egzistuoja:
    ERROR 1050 (42S01): Table 'demo_table' already exists
  3. Pabandykite ištrinti lentelę panaudodami DROP TABLE užklausą. MySQL turėtų pateikti klaidą, kad tokios lentelės nėra:
    ERROR 1146 (42S02): Table 'demo_table' doesn't exist

Jei lentelės sukurti negalite, lentelės ištrinti nepavyksta, bet Jūs matote su lentele asocijuotus failus /var/lib/mysql direktorijoje, tikriausiai susidūrėte su Šredingerio lentele MySQL.

Taip gali būti todėl, kad duomenų direktorijoje nėra duomenų failo, bet lentelės formatas (dar vadinamas apibrėžimu) – .frm failas – egzistuoja arba atvirkščiai. Trumpai tariant, atrodo, kad InnoDB vis dar turi tokios lentelės įrašą ibdata1 faile.

Kaip Atsikratyti Šredingerio Lentelių MySQL?

Dabar turėtumėte būti įsitikinę, kad susidūrėte su Šredingerio paradoksu – lentele – MySQL, ir laikas jos atsikratyti. Norėdami tai padaryti, atlikite šiuos veiksmus:

  1. Sukurkite lentelę su tuo pačiu pavadinimu kitame MySQL serveryje.
  2. Nukopijuokite lentelės .frm failą į duomenų bazės katalogą serveryje, kuriame egzistuoja Šredingerio lentelė. Įsitikinkite, kad failo nuosavybės teisės ir leidimai yra tokie, kokių reikia.
  3. Įvykdykite SHOW TABLES užklausą: lentelių sąraše turėtumėte pamatyti ir Šredingerio lentelę. Dabar visos operacijos turėtų veikti korektiškai (t.y lentelę turėtų būti galima ištrinti).

Turėkite omenyje, kad ištrinti kataloge esančių .ibd failų nepavyks, nes MySQL papraščiausiai juos atkurs.

Yra ir kitas būdas išspręsti šią problemą (prieš atlikdami šiuos veiksmus įsitikinkite, kad turite savo duomenų atsargines kopijas):

  1. Ištrinkite visas duomenų bazes, išskyrus mysql.
  2. Išjunkite MySQL.
  3. Ištrinkite ibdata1 ir ib_logfile* failus.
  4. Iš naujo paleiskite MySQL. ibdata1 ir ib_logfile* failų turiniai turėtų būti atstatyti.
  5. Atkurkite duomenų bazę.

Norėdami įsitikinti, kad nesusidurtumėte su Šredingerio paradoksu ateityje, įsitikinkite, kad viduryje MySQL vykdomų operacijų nenutrūktų maitinimas.

Santrauka

Susidurimas su Šredingerio lentelėmis MySQL ekosistemoje gali būti tikrai varginanti problema. Paprastai šią problemą sukelia maitinimo nutraukimas, kai MySQL vykdo tam tikras operacijas – tokių būdu duomenų kataloge pritrūksta duomenų failo, tačiau lentelės apibrėžimo – .frm – failai egzistuoja arba atvirkščiai. Laimei, šias problemas yra gana lengva išspręsti ir išvengti jų pasikartojimo.

Leave a Reply

Your email address will not be published. Required fields are marked *