Kiedyś napisałam dwa krótkie posty na temat exportu danych z MySQLa (znajdziecie go tutaj) i z PostgreSQLa (przeczytacie go tutaj) ale nie napisałam jak wykonać ich import. Czas uzupełnić tą lukę.
Zaimportujmy dane do tabeli test1.
mysql> show create table test1 \G *************************** 1. row *************************** Table: test1 Create Table: CREATE TABLE `test1` ( `c` int(11) DEFAULT NULL, `t` int(11) DEFAULT NULL, `cn` varchar(2) DEFAULT NULL, `d` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ela@skyler:~/Downloads$ mysqlimport -uroot -proot --lines-terminated-by='\n' --fields-terminated-by='\t' --local test test1.csv test.test1: Records: 9765275 Deleted: 0 Skipped: 0 Warnings: 29193 ela@skyler:~/Downloads$ ll total 212080 drwxr-xr-x 2 ela ela 4096 sty 5 13:15 ./ drwxr-xr-x 19 ela ela 4096 sty 5 13:15 ../ -rw-rw-r-- 1 ela ela 1914553 sty 5 12:40 arch_geoip_201411.csv.tar.gz -rw-rw-r-- 1 ela ela 1299844 sty 5 12:39 PerconaToolkit-2.2.12.pdf -r-xr-xr-x 1 ela ela 213941449 gru 30 16:47 test1.csv* ela@skyler:~/Downloads$ wc -l test1.csv 9765275 test1.csv
Do importu danych najlepiej użyć dedykowanej do tego binarki: mysqlimport, której dokumentację znajdziecie tutaj, a i wspominałam o tej binarce w innym poście, na temat dostępnych programów w instalacji serwera MySQL (Binarki MySQLa).
W trakcie importu danych mamy jednak dane, które musimy odpowiednio najpierw zapisać. Przykładowo znak NULL, który jak wcześniej zauważyliście spowodował wystąpienie Warningów przy imporcie, nie możemy zapisać jako string NULL tylko jako odpowiedni znak \N (link do dokumentacji). Dopiero wtedy zostanie poprawnie zaimportowany do MySQLa. Oto przykładowa zawartość pliku CSV:
ela@skyler:~/Downloads$ head test1.csv 45 42 NULL 2014-11-01 45 42 NULL 2014-11-02 45 42 NULL 2014-11-06 45 42 NULL 2014-11-07 45 42 NULL 2014-11-08 45 42 NULL 2014-11-09 45 42 NULL 2014-11-09 45 42 NULL 2014-11-10 45 42 NULL 2014-11-10 45 42 NULL 2014-11-11
Importując je do naszej tabeli test1, dane z kolumny cn zostaną obcięte do dwóch znaków. W dodatku te dane zostały potraktowane jako stringi, a nie jak powinny jako znak NULL. Dlatego musimy poprawić nasz plik zanim zaczniemy proces importu:
ela@skyler:~/Downloads$ cat test1.csv | replace NULL '\N' > test2.csv ela@skyler:~/Downloads$ head test2.csv 45 42 N 2014-11-01 45 42 N 2014-11-02 45 42 N 2014-11-06 45 42 N 2014-11-07 45 42 N 2014-11-08 45 42 N 2014-11-09 45 42 N 2014-11-09 45 42 N 2014-11-10 45 42 N 2014-11-10 45 42 N 2014-11-11 ela@skyler:~/Downloads$ time mysqlimport -uroot -proot --lines-terminated-by='\n' --fields-terminated-by='\t' --local --columns=c,t,cn,d test test2.csv test.test2: Records: 9765275 Deleted: 0 Skipped: 0 Warnings: 0 real 2m18.113s user 0m0.059s sys 0m0.188s
Dane został tym razem zapisane i zaimportowane do tabeli test2. Jeśli dobrze zauważyliście to tym razem wskazałam do jakich kolumn mają zostać zaimportowane dane przy pomocy opcji --column (-C).
Teraz czas przyszedł na PostgreSQL
No cóż. Nie ma sensu aby wspominać o tym ponownie. Ciąg dalszy tego posta był by tylko kopią innego napisanego przeze mnie jakiś czas temu o PGLoaderze (PGloader - narzędzie do importu danych). Mając prawa administracyjne do serwera, na którym stoi ten serwer, możecie bezpośrednio użyć polecenia COPY, a wcześniej przekopiować ten plik na ten serwer.
Miłej zabawy :-)
Brak komentarzy:
Prześlij komentarz