Wczoraj przyjrzałem się podstawowemu użyciu mysqldump do tworzenia kopii zapasowych baz danych MySQL. Dzisiaj przyjrzymy się jak używać mysqldump do zrzucania danych z bazy danych MySQL do plików tekstowych CSV i tabulatorów, zamiast używania zapytań SQL insert, co jest domyślną metodą zrzucania danych.
mysqldump -u -p -T/path/to/directory
Flaga -u jest używana do określenia nazwy użytkownika używanej do łączenia się z serwerem bazy danych MySQL, a część powyższego przykładu należy zastąpić swoją nazwą użytkownika.
Flaga -p wskazuje, że należy podać hasło do połączenia z bazą danych; zostaniesz o nie poproszony, gdy polecenie rozpocznie wykonywanie.
Flaga -T, po której następuje nazwa katalogu, do którego MySQL będzie zapisywać swoje pliki. Możesz mieć spację pomiędzy -T i początkiem nazwy katalogu lub bez spacji: to zależy od Ciebie, ponieważ oba będą działać. Ważne jest, aby pamiętać, że katalog, który określisz musi być zapisywalny przez użytkownika, jako serwer MySQL. Jeśli tak nie jest, otrzymasz błąd jak poniżej:
mysqldump: Got error: 1: Can't create/write to file '/path/to/filename.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
Jeśli twój Linux ma włączony SELinux, to katalog musi być również dozwolony przez konfigurację SELinux dla MySQL do zapisu.
Pliki utworzone przez mysqldump
Na podstawie powyższego przykładu z bazą danych, która ma dwie tabele o nazwach „something” i „something_else”, cztery pliki zostaną utworzone w następujący sposób:
- something.sql – zawiera SQL do utworzenia tabeli. Domyślnie zawiera
DROP TABLE IF EXISTS `something`;
jako część zapytania - something.txt – dane z tabeli „something” w formacie tab delimitowanym
- something_else.sql – zawiera SQL do utworzenia tabeli. Domyślnie zawiera
DROP TABLE IF EXISTS `something_else`;
jako część zapytania - something_else.txt – dane z tabeli „something_else” w formacie tab delimitowanym
Jeśli nie chcesz, aby pliki *.sql, wtedy możesz dodać flagę -t do polecenia mysqldump w następujący sposób:
mysqldump -u -p -t -T/path/to/directory
Zauważ, że nawet jeśli katalog, który określisz nie może być zapisany przez serwer MySQL, pliki *.sql nadal będą tworzone; tylko pliki tekstowe nie będą mogły być tworzone.
Zmiana formatu wyjściowego
Domyślnie mysqldump z flagą -T zrzuca dane do plików z delimitacją tabulacji. Można jednak zmienić delimiter, a także określić, że cudzysłów ma otaczać wartości pól.
Aby zmienić delimiter, użyj flagi --fields-terminated-by=
jak w poniższym przykładzie. W tym przykładzie będziemy zrzucać dane do wartości rozdzielonych przecinkami lub CSV:
mysqldump -u -p -t -T/path/to/directory --fields-terminated-by=,
Jeśli chcesz również umieścić cudzysłowy wokół każdego pola, a następnie użyj flagi --fields-enclosed-by=
. W poniższym przykładzie, każde pole jest otoczone cudzysłowami. Zauważ, że musimy uciec od symbolu cytatu w linii poleceń za pomocą ukośnika.
mysqldump -u -p -t -T/path/to/directory --fields-enclosed-by=" --fields-terminated-by=,
Plik wynikowy będzie wyglądał jak w poniższym przykładzie: