Tuesday, June 16, 2009

Wciąganie dumpów PostgreSQL z COPY zamiast INSERT

Dzisiaj czas jakiś walczyłem z dumpami Postgresowymi (wytworzonymi przez pg_dump), w których dane były umieszczone w postaci COPY.
Niestety cholerny pg_restore nie umie wciągnąć takich plików. Wykonywanie ich z linii komend (psql -f nazwa_pliku) lub z PgAdmina też nic nie dało.

Dla uściślenia fragment takiego dumpa wygląda tak:
COPY "acAclUserModules" ("AclId", "TargetId", "UserId", "AclUserModuleVersionTs",   "TransactionId", "LastChangeOwner", "AclUserModuleDeleted") FROM stdin;
809    23    1    2009-04-28 13:03:22.661+00    \N    2    2008-12-05 02:15:38.214436+00
810    56    1    2009-04-28 13:03:22.661+00    \N    2    2008-12-05 02:15:38.214436+00
811    29    1    2009-04-28 13:03:22.661+00    \N    2    2008-12-05 02:15:38.214436+00
\.

Oprócz komendy COPY zamiast INSERT, charakterystyczne jest źródło danych - stdin. Czyli wejście standardowe klawiatura lub plik, jeśli go przekierować. I właśnie takie jest rozwiązanie problemu
psql -d baza_danych -U user < plik_z_dumpem.sql

Do interpretera PostgreSQL jest przekierowywana zawartość pliku, tj. na jego wejście standardowe. I w ten sposób wciągamy dumpy z COPY zamiast INSERT.

Nadmienię tylko, że oczywiście tworząc dumpa mamy możliwość wyboru formatu wstawiania danych, czy COPY czy INSERT. Odsyłam do dokumentacji pg_dump. Musicie tylko zdawać sobie sprawę, że wersja z COPY jest dużo szybsza, ale za to nie można jej załadować z wygodnego w użyciu PgAdmina.

Polecam artykuł źródłowy.

No comments:

Post a Comment