I går kiggede jeg på grundlæggende brug af mysqldump til sikkerhedskopiering af MySQL-databaser. I dag vil jeg se på, hvordan man bruger mysqldump til at dumpe data fra en MySQL-database til CSV- og tabulatorafgrænsede tekstfiler, i stedet for at bruge SQL-indsætningsforespørgsler, som er standarddumpmetoden.
mysqldump -u -p -T/path/to/directory
Flaget -u bruges til at angive det brugernavn, der bruges til at oprette forbindelse til MySQL-databaseserveren, og du skal erstatte den del af ovenstående eksempel med dit brugernavn.
Flaget -p angiver, at du skal indtaste en adgangskode for at oprette forbindelse til databasen; du vil blive bedt om den, når kommandoen begynder at blive udført.
Flaget -T efterfulgt af mappenavnet angiver, hvor MySQL vil skrive sine filer hen. Du kan have et mellemrum mellem -T og starten af mappenavnet eller intet mellemrum: det er op til dig, da begge dele vil fungere. Det er vigtigt at bemærke, at den mappe, du angiver, skal kunne skrives af den bruger, som MySQL-serveren kører som. Hvis den ikke er det, vil du få en fejl som denne:
mysqldump: Got error: 1: Can't create/write to file '/path/to/filename.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
Hvis din Linux-maskine har SELinux aktiveret, skal mappen også være tilladt af SELinux-konfigurationen, så MySQL kan skrive til den.
Filer oprettet af mysqldump
Med ovenstående eksempel, med en database, der har to tabeller kaldet “something” og “something_else”, vil der blive oprettet fire filer som følger:
- something.sql – indeholder SQL’en til at oprette tabellen. Som standard indeholder den
DROP TABLE IF EXISTS `something`;
som en del af forespørgslen - something.txt – dataene fra tabellen “something” i tabulatorafgrænset format
- something_else.sql – indeholder SQL’en til oprettelse af tabellen. Som standard indeholder den
DROP TABLE IF EXISTS `something_else`;
som en del af forespørgslen - something_else.txt – dataene fra “something_else”-tabellen i tabulatorafgrænset format
Hvis du ikke ønsker, at *.sql-filer skal oprettes, så kan du tilføje -t-flaget til mysqldump-kommandoen på følgende måde:
mysqldump -u -p -t -T/path/to/directory
Bemærk, at selv om den mappe, du angiver, ikke kan skrives til af MySQL-serveren, vil *.sql-filerne stadig vil blive oprettet; det er kun tekstfilerne, der ikke kan oprettes.
Ændring af outputformatet
Mysqldump med T-flaget vil som standard dumpe dataene i tab-delimiterede filer. Det er dog muligt at ændre afgrænseren og også at angive, at anførselstegn skal omslutte feltværdierne.
For at ændre afgrænseren skal du bruge --fields-terminated-by=
-flaget som i følgende eksempel. I dette eksempel vil vi dumpe dataene til kommaseparerede værdier eller CSV:
mysqldump -u -p -t -T/path/to/directory --fields-terminated-by=,
Hvis du også ønsker at sætte anførselstegn omkring hvert felt, skal du bruge --fields-enclosed-by=
-flaget. I eksemplet nedenfor er hvert felt omgivet af anførselstegn. Bemærk, at vi skal undslippe citat-symbolet på kommandolinjen med en skråstreg.
mysqldump -u -p -t -T/path/to/directory --fields-enclosed-by=" --fields-terminated-by=,
Den resulterende fil ville se ud som i følgende eksempel: