Ar galiu atšaukti jau įvykdytą sandorį? (duomenų praradimas)

Aš padariau neteisingą UPDATE ir praradau kai kuriuos duomenis.

Ar jau dabar galiu grįžti atgal?

Bet kokia pagalba?

 ROLLBACK 

sako NOTICE: there is no transaction in progress .

33
18 сент. nustatyta SSS 18 rugsėjis 2012-09-18 10:29 '12, 10:29 2012-09-18 10:29
ответ 1 atsakymas

Ne, negalite anuliuoti, anuliuoti ar anuliuoti įsipareigojimo.

STOP DATABASE!

(Pastaba: jei ištrynėte duomenų katalogą iš failų sistemos, NENURODYTI duomenų bazės. Toliau pateiktos rekomendacijos taikomos atsitiktinai nutraukus DELETE scenarijų ar pan., O ne rm -rf /data/directory scenarijų).

Jei šie duomenys buvo svarbūs, STOP JŪSŲ DUOMENŲ BAZĖ, o ne iš naujo paleiskite. Jei norite, kad kontrolinis taškas pg_ctl stop -m immediate naudokite „ pg_ctl stop -m immediate .

Po užbaigimo negalite atšaukti sandorio. Jums reikės atkurti duomenis iš atsarginių kopijų arba naudoti laiko atkūrimo laiką, kuris turi būti nustatytas prieš įvykus nelaimingam atsitikimui.

Jei neturite jokio PITR / WAL archyvavimo, neturite atsarginių kopijų, turite realių problemų.

Skubus švelninimas

Baigę duomenų bazę, turite padaryti viso duomenų katalogo failų sistemos lygį - aplanką, kuriame yra base , pg_clog ir kt. Kopijuoti viską į naują vietą. Negalima nieko daryti su kopijavimu naujoje vietoje, tai vienintelė viltis atkurti duomenis, jei neturite atsarginių kopijų. Jei įmanoma, atlikite kitą kopiją bet kokioje keičiamoje laikmenoje ir atjunkite šią atmintį nuo kompiuterio. Atminkite, kad jums reikia visiškai kiekvienos duomenų katalogo dalies, įskaitant pg_xlog ir kt. Nėra jokių klausimų.

Tiesiog, kaip padaryti kopiją, priklauso nuo operacinės sistemos, kurioje dirbate. Kai dir duomenys priklauso nuo to, kokią OS naudojate ir kaip įdiegėte PostgreSQL.

Kai kurių duomenų buvimas

Jei greitai sustabdysite savo duomenų bazę, galite tikėtis susigrąžinti kai kuriuos duomenis iš lentelių. Taip yra todėl, kad „PostgreSQL“ naudoja daugiapakopę lygiagretumo kontrolę (MVCC), kad galėtų kontroliuoti prieigą prie jos saugyklos. Kartais jis parašys naujas eilutes, kurias atnaujinsite lentelėje, paliekant senas, bet pažymėtas kaip „ištrintas“. Po kurio laiko pasirodo „ autovaccum“ ir stygos įrašomos kaip laisvos vietos, taigi galite jas perrašyti vėliau su „ INSERT arba „ UPDATE . Taigi senosios UPDATE d linijų versijos vis dar gali būti, pateikiamos, bet nėra.

Be to, Pg įrašoma dviem etapais. Pirmieji duomenys įrašomi į priekinį rašymo žurnalą (WAL). Tik po to, kai jis buvo įrašytas į WAL ir nukentėjo diske, jis buvo nukopijuotas į krūvą (pagrindinės lentelės), galbūt perrašant senus senus duomenis. WAL turinys nukopijuojamas į pagrindinius bgwriter krūvos ir periodinius kontrolės taškus. Pagal numatytuosius nustatymus kontroliniai taškai atsiranda kas 5 minutes. Jei sugebėsite sustabdyti duomenų bazę, kol atsitiks kontrolinis taškas, ir sustabdykite jį nužudant, ištraukdami kištuką į mašiną arba naudodami „ pg_ctlimmediate režimu, galite užfiksuoti duomenis prieš kontrolinį punktą, todėl senieji duomenys labiau tikėtina, kad bus ant krūvos.

Dabar, kai failų sistemos lygmeniu atlikote visą „dir“ duomenų kopiją, galite pradėti kurti duomenų bazės atsarginę kopiją, jei jums to reikia; duomenys vis tiek išnyks, bet jūs padarėte viską, kas įmanoma, kad sau suteiktumėte vilties, kad ji bus atkurta. Atsižvelgiant į pasirinkimą, tikriausiai paliksiu duomenų bazę saugiai.

Atkūrimas

Dabar jums gali tekti samdyti ekspertą į įmontuotas „PostgreSQL“ versijas, kad padėtų jums atlikti duomenų atkūrimą. Būkite pasirengę mokėti profesionalą už savo laiką, galbūt šiek tiek laiko.

Aš paskelbiau šį sąrašą „Pg“ adresų sąraše, o Viktoras Jegorovas yra susijęs su depesz paštu adresu pg_dirtyread , kuris yra panašus į norimą, nors jis neatgauna TOAST ed duomenų, todėl tai yra ribota programa. Išbandykite, jei jums pasisekė.

Žiūrėkite: pg_dirtyread apie github .

Ištrinau tai, ką parašiau šiame skyriuje, nes šis įrankis yra pasenęs.

Taip pat žr. „ PostgreSQL“ eilutės saugojimo pagrindus

Įspėjimas

Žr. Mano dienoraščio įrašą „ PostgreSQL duomenų bazės pažeidimų prevencija“ .


Jei naudojate dviejų fazių fiksavimą , galite turėti ROLLBACK PREPARED , kad būtų galima atlikti transliaciją, kuri buvo paruošta atlikti, bet ne visiškai įsipareigoti. Kalbant apie artimiausią, galite atšaukti jau užbaigtą operaciją ir netaikyti jūsų situacijai.

73
18 сент. atsakymas, kurį pateikė Craig Ringer 2012-09-18 10:50 '12 10:50 2012-09-18 10:50

Peržiūrėkite kitus klausimus apie žymes arba Užduokite klausimą