Volcar una base de datos mysql a una copia de seguridad de texto plano (CSV) desde la línea de comandos

92

Me gustaría evitar mysqldump ya que genera una forma que solo es conveniente para que mysql lea. CSV parece más universal (un archivo por tabla está bien). Pero si hay ventajas en mysqldump, soy todo oídos. Además, me gustaría algo que pueda ejecutar desde la línea de comandos (linux). Si se trata de un script mysql, los consejos sobre cómo hacer tal cosa serían útiles.

dreeves
fuente

Respuestas:

140

Si puede hacer frente a tablas a la vez, y sus datos no son binarios, utilice la -Bopción del mysqlcomando. Con esta opción, generará archivos TSV (separados por pestañas) que se pueden importar a Excel, etc., con bastante facilidad:

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

Alternativamente, si tiene acceso directo al sistema de archivos del servidor, use el SELECT INTO OUTFILEque puede generar archivos CSV reales:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table
Alnitak
fuente
¡Gracias! su segunda "tabla" debería ser "base de datos", ¿verdad? ¿No tiene ninguna opción para CSV en lugar de TSV que conozca?
dreeves el
duh - sí, debería haber leído 'base de datos'. No, no hay opción para CSV, esto es lo mejor que conozco sin usar el 'seleccionar en archivo de salida' integrado de MySQL, que puede hacer CSV, pero escribe los archivos en el servidor, no en el cliente.
Alnitak
¿Cómo forzar la sobrescritura en el archivo de salida?
JCm
11
Tenga en cuenta que cuando se proporciona una ruta relativa (o simplemente un nombre de archivo), el archivo aparecerá en su directorio MYSQL, y no en su directorio shell actual (es decir, desde dónde se \. file.sqllee). Como tal, dependiendo de su instalación, probablemente lo encontrará en/var/lib/mysql/[db_name]/table.csv
Mala
26

Puede volcar una base de datos completa de una sola vez con la mysqldump's --tabopción. Usted proporciona una ruta de directorio y crea un .sqlarchivo con la CREATE TABLE DROP IF EXISTSsintaxis y un .txtarchivo con el contenido, separados por tabulaciones. Para crear archivos separados por comas, puede usar lo siguiente:

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

Esa ruta debe ser escribible tanto por el usuario de mysql como por el usuario que ejecuta el comando, por lo que, para simplificar, recomiendo chmod 777 /tmp/path_to_dump/primero.

chmac
fuente
1
Seguí volviendo a esta respuesta, definitivamente es la mejor manera de exportar todas las tablas a un archivo delimitado.
joevallender
mysqldump: You must use option --tab with --fields-...
Marco Marsala
Como root: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . En mi caso, tuve que tomar /var/lib/mysql-files/(en lugar de /tmp/), configurar el usuario en mysql: mysql y configurar los derechos en 777 - stackoverflow.com/a/32737616/1707015 .
qräbnö
18

La opción seleccionar en el archivo de salida no funcionaría para mí, pero la siguiente forma indirecta de canalizar el archivo delimitado por tabulaciones a través de SED sí lo hizo:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
Sri
fuente
1
Este comando dio como resultado que la letra tse reemplazara por ", "en el archivo de salida. No es exactamente lo que buscaba.
BrennanR
9

Aquí está el comando más simple para ello.

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

Si hay una coma en el valor de la columna, podemos generar .tsv en lugar de .csv con el siguiente comando

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv
minhas23
fuente
Para CSV: funciona donde solo necesito una coma. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`
3

Si realmente necesita una "Copia de seguridad", también necesita un esquema de base de datos, como definiciones de tablas, definiciones de vistas, procedimientos de almacenamiento, etc. Una copia de seguridad de una base de datos no es solo la información.

El valor del formato mysqldump para la copia de seguridad es específicamente que es muy FÁCIL de usar para restaurar bases de datos mysql. Una copia de seguridad que no se restaura fácilmente es mucho menos útil. Si está buscando un método para hacer una copia de seguridad confiable de los datos de mysql para poder restaurarlos en un servidor mysql, creo que debería seguir con la herramienta mysqldump.

Mysql es gratuito y se ejecuta en muchas plataformas diferentes. Configurar un nuevo servidor mysql al que puedo restaurar es simple. No me preocupa en absoluto no poder configurar mysql para poder hacer una restauración.

Me preocuparía mucho más una copia de seguridad / restauración personalizada basada en un formato frágil como csv / tsv que falla. ¿Está seguro de que todas sus comillas, comas o pestañas que están en sus datos se escaparán correctamente y luego se analizarán correctamente con su herramienta de restauración?

Si está buscando un método para extraer los datos, vea varios en las otras respuestas.

Zoredache
fuente
gracias, muy útil! Me convenciste. Sin embargo, tengo otras razones para querer una forma rápida de obtener un volcado csv a través de un comando de línea de comandos. Estoy esperando eso por la "respuesta aceptada". (aunque probablemente podría juntarlo en este punto a partir de las respuestas actuales, supongo que con un script mysql).
dreeves
Puedo ver mucho valor en tener una copia de seguridad utilizando el método nativo y también extractos para otros fines.
Zoredache
mk-parallel-restore puede restaurar una copia de seguridad CSV creada con mk-parallel dump, para que pueda obtener lo mejor de ambos mundos. De hecho, mk-parallel-restore hace un mejor trabajo al garantizar que los activadores que haya definido se restauren al final.
Paul Dixon
3

Puede usar el siguiente script para obtener la salida en archivos csv. Un archivo por tabla con encabezados.

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

usuario es su nombre de usuario, contraseña es la contraseña si no desea seguir escribiendo la contraseña para cada tabla y mydb es el nombre de la base de datos.

Explicación del script: La primera expresión en sed, reemplazará las pestañas con "," por lo que tiene campos encerrados entre comillas dobles y separados por comas. El segundo inserta comillas dobles al principio y el tercero inserta comillas dobles al final. Y el último se encarga del \ n.

Kiran Pathuru
fuente
Esto me llevó principalmente a donde necesitaba ir, pero me sorprendió cuando la letra "t" fue reemplazada por comas: stackoverflow.com/a/2610121/8400969
Michael
Y esto también debería decir --skip-column-namesen mi versión de mysql
Michael
2

Eche un vistazo a mk-parallel-dump, que forma parte del siempre útil conjunto de herramientas maatkit . Esto puede volcar archivos separados por comas con la opción --csv.

Esto puede hacer toda su base de datos sin especificar tablas individuales, y puede especificar grupos de tablas en una tabla de conjunto de respaldo.

Tenga en cuenta que también vuelca las definiciones de la tabla, las vistas y los activadores en archivos separados. Además de proporcionar una copia de seguridad completa en una forma más accesible universalmente, también se puede restaurar de inmediato con mk-parallel-restore

Paul Dixon
fuente
Puede que esta no sea la copia de seguridad ideal , pero es completamente increíble para COMPARTIR. ¡Gracias!
Atroon
maatkitparece ser parte del percona toolkitahora, pero no puedo encontrar las herramientas correspondientes.
sjas
1

Respuesta de PowerShell de dos líneas:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

Boom-bata-boom

-D = el nombre de su base de datos

-e = consulta

-B = delimitado por tabuladores

Cañón de Kolob
fuente
1

Si desea volcar toda la base de datos como csv

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


rm -rf tables_new.txt tables.txt
veera
fuente