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 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:
SHOW TABLES;
užklausą Jūsų MySQL serveryje ir paieškokite lentelės – jos neturėtų būti sąraše.CREATE TABLE
užklausa. MySQL turėtų pateikti klaidą, kad lentelė jau egzistuoja:ERROR 1050 (42S01): Table 'demo_table' already exists
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.
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:
.frm
failą į duomenų bazės katalogą serveryje, kuriame egzistuoja Šredingerio lentelė. Įsitikinkite, kad failo nuosavybės teisės ir leidimai yra tokie, kokių reikia.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):
mysql
.ibdata1
ir ib_logfile*
failus.ibdata1
ir ib_logfile*
failų turiniai turėtų būti atstatyti.Norėdami įsitikinti, kad nesusidurtumėte su Šredingerio paradoksu ateityje, įsitikinkite, kad viduryje MySQL vykdomų operacijų nenutrūktų maitinimas.
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.
Dive deep into ways to best index your data and learn how to mysql if…
Dive deep into ways to load big data sets into MySQL with BreachDirectory. From MySQL…
Can the SQL EXPLAIN statement be a DoS vector and how to mitigate this threat?…
What is Cross Site Scripting, how does it work, and how can developers prevent it?…
BreachDirectory explains the risks of compressed files with a password on them for your infrastructure…
There have been rumors about a data breach targeting Schneider Electric. Did a data breach…