Portál AbcLinuxu, 11. května 2025 07:24
potřebuji migrovat pouze data (strukturu tabulek mám vytvořenou). Provedl jsem dump z MySQL v podobě úplných insertů a import do PostgreSQL:
mysqldump database -v -nt --compatible=ansi,postgresql --complete-insert=TRUE --extended-insert=FALSE --compact --default-character-set=UTF8 -u user -p -r pg_database.sql
psql database < pg_database.sql
Zdá se to funkční, ale trápí mě dvě věci:
1) orig. MySQL DB má velikost 800MB, ale kvůli úplným insertům vznikne dumpem 2GB soubor, který po importu vytvoří v PostgreSQL 2.1GB databázi
2) import tohoto 2GB souboru do PostgreSQL trvá cca 36 hodin na 2.6 GHz Xeon / 1GB RAM
begin;
a commit;
.
V pripade, ze pouzivate hodne indexu, nebo foreign keys, tak je mozne tyto pred importem dropnout a vytvorit je az po nem, tim se muze import vetsiho mnozstvi zaznamu take urychlit. Pokud nebudete chtit indexy a foreign keys dropovat, mohlo by pomoct behem importu udelat vacuum analyze
, tim se aktualizuji statistiky indexu, ty se zacnou optimalne vyuzivat a zrychli se kontroly vkladanych radku.
Uplne nejrychlejsim zpusobem, jak dostat hodne dat do PostgreSQL, by bylo pravdepodobne pouziti prikazu COPY
, to s sebou vsak nese nutnost upravy zdrojoveho datoveho souboru do vhodneho formatu.
To, ze databaze zabira vice mista, nez cekate, muze byt zpusobeno tim, ze neni uvolnen prostor po smazanych zaznamech - na to muzete vyzkouset pouzit vacuum full
, pripadne muze byt prostor zabran indexy.
Tomas
ad b) Velikost dumpu mě nepřekvapila, měl jsem na mysli velikost výsledné DB v Postgre, která je i po reindexaci více než dvojnásobná oproti MySQL (MyISAM).
Zajímalo by mě, zda je to dáno formátem PostgreSQL nebo spíše změnou datových typů např. INT na BIGINT?
BEGIN/COMMIT + úprava postgresql.conf (přidělení paměti) urychlily import dumpu z 36 na 2 hodiny
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.