Portál AbcLinuxu, 1. listopadu 2024 00:12


Dotaz: postgres - import nekonzistentnich dat

24.2.2022 14:40 gent
postgres - import nekonzistentnich dat
Přečteno: 1196×
Odpovědět | Admin
Cau,

dostal jsem za ukol zmigrovat jednu aplikaci (Python/django+postgres) ze stareho serveru na novy. Na starem serveru bezi postgres 8, na novy server jsem dal postgres 11.

Pokud na starem serveru dumpnu DB a pokousim se ji naimportovat na novy server, dostavam cca 20 chyb (jde o 2 opakujici se chyby - "duplicate id already exists" a "not a valid UTF sequence") - z cehoz usuzuju, ze jsou chyby (flip bity) na starych discich. Pokud z dumpu smazu "chybove" radky, import se povede a aplikace jede OK.

Posledni zaloha na starem serveru je ze zacatku roku 2021 - ta je (zda se) "konzistentni" a jde naimportovat na novy seerver bez chyb.

Tak me napadlo, ze DB postavim tak, ze nejdriv naimportuju "konzistentni" dump z roku 2021 a pak to prezehlim aktualnim dumpem, aby se prihrali jen rozdily/neexistujici zaznamy od roku 2021.

A tady jsem narazil - jelikoz nejdou pustit 2 dumpy pres sebe tak, aby se dohraly z posledniho dumpu jen neexistujici zaznamy.

Nemate nekdo nejaky napad, jak toto realizovat? (treba vypnout transakce v dumpu, nebo udelat nejaky specialni dump, ktery bude existujici zaznamy v tabulce ignorovat )

Na SO jsem nasel "reseni" s pouzitim temp. tabulek, coz se mi moc nelibi a nechavam si to jako posledni moznost.

Diky za pripadne napady, s PSQL delam jen okrajove ;)

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.2.2022 18:11 j
Rozbalit Rozbalit vše Re: postgres - import nekonzistentnich dat
Odpovědět | | Sbalit | Link | Blokovat | Admin
"ze jsou chyby (flip bity) na starych discich."

To bych dost pochyboval. Chyby budou spis logickyho razu v datech. Je to pomerne typicka vec, kdyz ten kdo dela aplikaci netusi jak funguje databaze. To bys totiz tu tabazi nespis vubec nespustil - kazda aspon trochu svepravna pouziva na datovy soubory minimalne nejaky kontrolni soucty.

Pokud znas strukturu tak neni problem vadny data prece opravit. Variatne je proste smaznout, v databazich byva hromada historickych dat ktera stejne uz nikdy nikoho zajimat nebudou.

Takze ... dumpni si zalohu a podivej se, jestli tam jsou ty radky, ktery ti hlasej chybu a porovnej je. Pokud tam vubec nejsou, tak druha moznost je, ze je rucne oprav v tom dumpu. Posledni moznost je samozrejme vyhodnotit ta data jako jiz nepotrebna, a tudiz se bez nich obejit (pro predstavu, to ze si pred 20ti lety nekomu delal nejakou nabidku, a on si pak nic nekoupil, je typicka vec, bez ktery se svet nezbori).

Samo tady pozor, protoze tim ze ty zaznamy odstranis muzes vyrobit jeste mnohem horsi veci, takze je treba znat strukturu tech dat a co kde na co navazuje.

---

Dete s tim guuglem dopice!
AraxoN avatar 28.2.2022 14:48 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: postgres - import nekonzistentnich dat
Odpovědět | | Sbalit | Link | Blokovat | Admin
Postgres v staršej verzii musel mať nejakú bugu, kedy to dovolilo v nejakom okrajovom prípade vytvoriť rovnaké záznamy nad unique indexom. Stretli sme sa s tým niekoľkokrát aj my - dump prebehol v poriadku, import do novej, prázdnej DB, už nie z dôvodu duplicity. Ostalo len manuálne opraviť záznamy. Najskôr som podozrieval pamäte, ale strávil som noc s memtestom v serverovni, bez výsledku. Myslím, že to prestalo, keď sme prešli na PG11.

Takéto zlučovanie dát všeobecne robím tak, že tabuľku vyexportujem bez restraintov a naimporujem pod iným názvom. Tým mám vedľa seba dve tabuľky s rovnakými stĺpcami a môžem robiť veci ako napríklad:
INSERT INTO ostra SELECT * FROM zaloha WHERE id NOT IN (SELECT id FROM ostra);
28.2.2022 15:29 gent
Rozbalit Rozbalit vše Re: postgres - import nekonzistentnich dat
Odpovědět | | Sbalit | Link | Blokovat | Admin
Cau, diky za reakce - chyby jsou opravdu v tech primarnich klicich/id, a to ani sebehorsi progy nedokaze rozbit (pokud nepocitam bug, bo "offline" binarni editaci psql souboru - a to urcite nikdo nedelal).

Nakonec jsem to vyresil tak, ze jsem pg_dump pustil s parametrem "--column-inserts" - to vytvori dump s "INSERTama" na kazdem radku a tim to muzu prezehlit :) takze vyreseno

Dik

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.