sql >> Databasteknik >  >> RDS >> PostgreSQL

Exportera big data från PostgreSQL till AWS s3

När du exporterar en stor datadump bör ditt största problem vara att mildra misslyckanden. Även om du skulle kunna mätta en GB-nätverksanslutning, tar flyttning av 10 TB data> 24 timmar. Du vill inte behöva starta om det på grund av ett fel (som en timeout för databasanslutningen).

Detta innebär att du bör dela exporten i flera delar. Du kan göra detta genom att lägga till ett ID-intervall till select-satsen i kopian (jag har precis redigerat ditt exempel, så det kan finnas fel):

COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS WHERE ID BETWEEN 0 and 1000000) TO ‘CUSTOMERS_DATA_0.CSV WITH DELIMITER '|' CSV;

Du skulle naturligtvis generera dessa påståenden med ett kort program; glöm inte att ändra namnet på utdatafilen för var och en. Jag rekommenderar att du väljer ett ID-intervall som ger dig en gigabyte eller så per utdatafil, vilket resulterar i 10 000 mellanliggande filer.

Var du skriver dessa filer är upp till dig. Om S3FS är tillräckligt tillförlitligt tycker jag att det är en bra idé.

Genom att bryta lossningen i flera mindre bitar kan du också dela upp den mellan flera EC2-instanser. Du kommer förmodligen att mätta databasmaskinens bandbredd med endast ett fåtal läsare. Tänk också på att AWS tar 0,01 USD per GB för dataöverföring över AZ -- med 10 TB som är 100 USD -- så se till att dessa EC2-maskiner är i samma A-Ö som databasmaskinen.

Det betyder också att du kan utföra avlastningen medan databasen inte är upptagen i övrigt (dvs utanför normal arbetstid).

Slutligen betyder det att du kan testa din process och du kan åtgärda eventuella datafel utan att behöva köra hela exporten (eller bearbeta 10 TB data för varje korrigering).

På importsidan kan Redshift ladda flera filer parallellt . Detta borde förbättra din totala tid, även om jag inte riktigt kan säga hur mycket.

En varning:använd en manifestfil snarare än ett objektnamnsprefix. Jag har stött på fall där S3:s slutliga konsistens gjorde att filer tappades under en inläsning.



  1. Mysqli välj från två tabeller

  2. När valde vi DateTime framför Timestamp

  3. Ange uttryckligen en cells datatyp som text för talvärden

  4. Konfigurera Hibernate för att använda Oracles SYS_GUID() för primärnyckel