Pregunta Vuelque una base de datos mysql a una copia de seguridad de texto sin formato (CSV) desde la línea de comando


Me gustaría evitar mysqldump ya que los resultados en una forma que solo es conveniente para mysql para leer. 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 de mysql, sería útil señalar cómo hacer tal cosa.


75
2018-01-21 23:13


origen


Respuestas:


Si puede hacer frente a la tabla a la vez, y sus datos no son binarios, use el -B opción a la mysql mando. Con esta opción, generará archivos TSV (separados por tabuladores) que pueden importarse 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 SELECT INTO OUTFILE que puede generar archivos CSV reales:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table

119
2018-01-21 23:18



En MySQL mismo, puede especificar salida CSV como:

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

De http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/


26
2018-01-21 23:38



Puede volcar una base de datos completa de una vez con la opción mysqldump's --tab. Proporciona una ruta de directorio y crea un archivo .sql con la sintaxis CREATE TABLE DROP IF EXISTS y un archivo .txt con los contenidos, 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

El usuario de mysql y el usuario que ejecuta el comando deben poder escribir esa ruta, así que, para simplificar, recomiendo chmod 777 /tmp/path_to_dump/ primero.


16
2018-05-09 18:00



La opción de seleccionar en archivo externo no funcionaría para mí, pero la forma siguiente de rodear el archivo delimitado por tabuladores 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

14
2017-10-16 06:21



Aquí está el comando más simple para él

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, entonces 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

5
2017-10-16 07:59



Si realmente necesita una "Copia de seguridad", también necesita un esquema de base de datos, como definiciones de tabla, definiciones de vista, 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 copia de seguridad es específicamente que es muy FÁCIL usarlo para restaurar bases de datos mysql. Una copia de seguridad que no se restaure 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 que pueda restaurar a un servidor mysql, entonces creo que debería seguir con la herramienta mysqldump.

Mysql es gratuito y se ejecuta en muchas plataformas diferentes. La configuración de un nuevo servidor mysql al que puedo restaurar es simple. No estoy para nada preocupado por no poder configurar mysql para que pueda hacer una restauración.

Estaría mucho más preocupado por una copia de seguridad / restauración personalizada basada en un formato frágil como csv / tsv. ¿Estás seguro de que todas tus comillas, comas o pestañas que están en tus datos se escaparán correctamente y luego tu herramienta de restauración las analizará correctamente?

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


3
2018-01-22 01:36



Revisa mk-parallel-dump que es parte de la siempre útil conjunto de herramientas maatkit. Esto puede volcar archivos separados por comas con la opción --csv.

Esto puede hacer su db completo sin especificar tablas individuales, y puede especificar grupos de tablas en una tabla de conjuntos de respaldo.

Tenga en cuenta que también vuelca definiciones de tabla, vistas y disparadores en archivos separados. Además de proporcionar una copia de seguridad completa en una forma más universalmente accesible, también puede restaurarse inmediatamente con mk-parallel-restore


2
2018-01-21 23:41



Puede usar la secuencia de comandos siguiente para obtener la salida a los 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 de la secuencia de comandos: 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 inserte una comilla doble al principio y la tercera inserte una comilla doble al final. Y el final se ocupa del \ n.


2
2017-10-10 16:59



Respuesta de dos líneas de PowerShell:

# 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


1
2017-09-14 19:12