Necesito volcado todos tablas en MySQL en formato CSV.

Hay un comando con mysqldump a sólo de salida de cada fila y para cada tabla en formato CSV?

  • Usted puede hacer uso de mysql.exe programa, intente SELECT * FROM tabla EN OUTFILE ‘nombre_archivo’. Pero usted debe especificar cada tabla de forma manual.
InformationsquelleAutor Ken | 2012-08-20

9 Comentarios

  1. 107

    Primero, te puedo dar la respuesta para UNA tabla:

    El problema con todos estos INTO OUTFILE o --tab=tmpfile (y -T/path/to/directory) de las respuestas es que se requiere la ejecución de mysqldump en el mismo servidor como el servidor MySQL, y tener los derechos de acceso.

    Mi solución era utilizar mysql (NO mysqldump) con el -B parámetro, en línea de la instrucción SELECT con -e, luego masajear la salida ASCII con sed, y termina con CSV, incluyendo un campo de encabezado de fila:

    Ejemplo:

     mysql -B -u username -p password database -h dbhost -e "SELECT * FROM accounts;" \
     | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"

    «id»,»login»,»contraseña»,»carpeta»,»correo electrónico»
    «8»,»mariana»,»xxxxxxxxxx»,»mariana»,»»
    «3»,»squaredesign»,»xxxxxxxxxxxxxxxxx»,»squaredesign»,»[email protected]»
    «4»,»miedziak»,»xxxxxxxxxx»,»miedziak»,»[email protected]»
    «5»,»Sarko»,»xxxxxxxxx»,»Sarko»,»»
    «6»,»Logitrans
    Polonia»,»xxxxxxxxxxxxxx»,»LogitransPoland»,»»
    «7»,»Amos»,»xxxxxxxxxxxxxxxxxxxx»,»Amos»,»»
    «9»,»Annabelle»,»xxxxxxxxxxxxxxxx»,»Annabelle»,»»
    «11»,»Brandfathers y
    Hijos»,»xxxxxxxxxxxxxxxxx»,»BrandfathersAndSons»,»»
    «12»,»Imaginar
    El grupo»,»xxxxxxxxxxxxxxxx»,»ImagineGroup»,»»
    «13»,»EduSquare.pl»,»xxxxxxxxxxxxxxxxx»,»EduSquare.pl»,»»
    «101»,»tmp»,»xxxxxxxxxxxxxxxxxxxxx»,»_»,»[email protected]»

    Agregar un > outfile.csv al final de la línea, para obtener su archivo CSV para la tabla.

    Siguiente,
    obtener una lista de TODAS las tablas con

    mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"

    A partir de ahí, es sólo un paso más para hacer un bucle, por ejemplo. en el bash shell para iterar sobre las tablas:

     for tb in $(mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"); do
         echo .....;
     done

    Entre el do y ; done insertar el comando largo escribí en la Parte 1 de arriba, pero el sustituto de su tablename con $tb lugar.

    • Dado que usted necesita para especificar las columnas con algunas combinaciones y de las cláusulas where, Esta respuesta es mejor aceptar.
    • Esta falla si los resultados de la consulta exceder de memoria en la máquina que está vertido a. Cualquier trabajo de la tierra?
    • Recomiendo probar una nueva pregunta con detalles de su situación…lo cual suena muy general a cualquier programa, por cierto. Usted probablemente no estaban buscando la obvia «aumentar la RAM» o «pruebe en otro PC, con más memoria.» Porque sí, en general, los programas de procesamiento y salida de datos necesidad de ajuste en la memoria de la primera. En mi bucle, al menos, cada mysql salidas y libera los recursos antes de iniciar la siguiente tabla en la lista.
    • se puede seleccionar en outfile, transferir el archivo, luego trabajar en él a partir de ahí? No debería ser difícil conseguir esto en la línea-en-un-tiempo de procesamiento que debe utilizar sólo trivial cantidades de memoria.
    • Esto no parece tomar en cuenta la columna de CADENA tipos de comillas dobles en ellos, deberían ser escapado, de lo contrario, se rompe. Alguna idea de cómo hacer eso?
    • Aquí es la actualización de los regex para escapar comillas dobles : | sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" (Correctamente escapar de una doble cita en CSV)
    • Si yo quiero utilizar esta dentro de un comando que ya está rodeado por ", ¿cómo podría volver a escribir esto? Estoy confundirse con todos los caracteres de escape
    • -1: Regex ve completamente ad-hoc y no bien pensado: Inconsistencias en trailing g en s// que carecen de sentido. TODOS ellos deben especificar g, de lo contrario ¿cuál es el punto–cada ocurrencia debe ser escapado y no sólo la primera. s/\n//g ¿por qué? sed por defecto, incluso no incluye \n en el buffer de patrones.
    • tal vez | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" , agregar g opción de doblar cada » en la entrada? Ruby CSV espera que dicha convención.
    • Aquí está la sed sin las comillas: sed «s/’//;s/\t/,/g;s/\n//g»
    • Me gustaría considerar la inclusión de todos en su idioma AQUÍ-DOC con variables cuando sea necesario, en lugar de intentar volver a escapar a ese confuso bola de hilo. Ruby es bastante intuitivo & amable.
    • me sale este aviso cuando intento cargar esta csv a mi base de datos MySQL Advertencia: Incorrecta valor entero: ‘»1921196975″‘ para la columna ‘id’ de la fila 1 , parece que añade » citas para todos los valores de cómo deshacerse de él ?
    • hay una manera de hacerlo con mysqldump ? desde las grandes mesas de volcado requiere de grandes RAM en MySQL mientras mysqldump tiene modo rápido para recuperar la fila por fila

  2. 25

    Este comando para crear 2 archivos en /ruta/al/directorio de table_name.sql y table_name.txt.

    El archivo sql contendrá la creación de la tabla de esquema y el archivo txt contendrá los registros de la tabla mytable con campos delimitados por comas.

    mysqldump -u username -p -t  -T/path/to/directory dbname table_name --fields-terminated-by=',' 
    • Recuerde usar -T/ruta de acceso a algo que es modificable por el mysql proceso.
    • sólo funciona si se ejecuta mysqldump desde la misma máquina que el servidor de db
    • si usted funciona en mysql segura del archivo priv problemas, ¿SHOW VARIABLES LIKE "secure_file_priv"; y el uso de la carpeta que te dicen que hay como la carpeta de salida en su mysqldump comando, si usted no puede reiniciar el servidor mysql.
  3. 19

    mysqldump tiene opciones de formato CSV

    --fields-terminated-by=name
                      Fields in the output file are terminated by the given
    --lines-terminated-by=name
                      Lines in the output file are terminated by the given

    la name debe contener uno de los siguientes

    `--fields-terminated-by`

    \t o "\""

    `--fields-enclosed-by=name`

          Campos en el archivo de salida están incluidas en el dado

    y

    --lines-terminated-by

    • \r
    • \n
    • \r\n

    Naturalmente, usted debe mysqldump cada tabla de forma individual

    Sugiero que se reúnen todos los nombres de tabla en un archivo de texto. A continuación, recorrer todas las mesas con mysqldump. Aquí es un script que se va a volcar y gzip 10 mesas a la vez:

    MYSQL_USER=root
    MYSQL_PASS=rootpassword
    MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
    SQLSTMT="SELECT CONCAT(table_schema,'.',table_name)"
    SQLSTMT="${SQLSTMT} FROM information_schema.tables WHERE table_schema NOT IN "
    SQLSTMT="${SQLSTMT} ('information_schema','performance_schema','mysql')"
    mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/DBTB.txt
    COMMIT_COUNT=0
    COMMIT_LIMIT=10
    TARGET_FOLDER=/path/to/csv/files
    for DBTB in `cat /tmp/DBTB.txt`
    do
        DB=`echo "${DBTB}" | sed 's/\.//g' | awk '{print $1}'`
        TB=`echo "${DBTB}" | sed 's/\.//g' | awk '{print $2}'`
        DUMPFILE=${DB}-${TB}.csv.gz
        mysqldump ${MYSQL_CONN} -T ${TARGET_FOLDER} --fields-terminated-by="," --fields-enclosed-by="\"" --lines-terminated-by="\r\n" ${DB} ${TB} | gzip > ${DUMPFILE}
        (( COMMIT_COUNT++ ))
        if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
        then
            COMMIT_COUNT=0
            wait
        fi
    done
    if [ ${COMMIT_COUNT} -gt 0 ]
    then
        wait
    fi

    Darle una oportunidad !!!

    • Que no CSV, que está delimitado por tabuladores. CSV requiere escapar de comas, citando, y así sucesivamente.
    • Gracias. He añadido comillas dobles en --fields-enclosed-by.
    • Esto produce el error. mysqldump: You must use option --tab with --fields-...
    • Lo echaba de menos. He añadido a mi respuesta. Gracias !!!
    • No puedo encontrar la --tab opción que decir agregó.
    • El Cloud SQL docs se describe cómo crear un mysqldump. cloud.google.com/sql/docs/mysql/import-export Algunas de las opciones que también pueden ser relevantes para la creación de un archivo CSV de volcado para bigquery como mysqldump —hex-blob –default-character-set=utf8

  4. 8

    Si usted está usando MySQL o MariaDB, la forma más fácil y eficiente manera de volcado de CSV para una sola tabla es –

    SELECT customer_id, firstname, surname INTO OUTFILE '/exportdata/customers.txt'
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
      LINES TERMINATED BY '\n'
      FROM customers;

    Ahora usted puede utilizar otras técnicas para repetir este comando para varias tablas. Ver más detalles aquí:

    • Esta parece ser la respuesta más apropiada en que es flexible y potente al mismo tiempo.
  5. 7

    Se parece a los demás tenido este problema también, no es una simple secuencia de comandos de python ahora, para convertir la salida de mysqldump en archivos csv.

    wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
    mysqldump -u username -p --host=rdshostname database table | python mysqldump_to_csv.py > table.csv
    • Heads up, mysqldump-a-csv resultó contener algunos errores en su código simple. Así que esté preparado para la corrección de errores, o quedarse con un lento pero estable de soluciones…
  6. 5

    Esto funcionó muy bien para mí:

     mysqldump DBNAME --fields-terminated-by ',' \
     --fields-enclosed-by '"' --fields-escaped-by '\' \
     --no-create-info --tab /var/lib/mysql-files/

    O si sólo desea volcado TABLENAME:

     mysqldump DBNAME TABLENAME --fields-terminated-by ',' \
     --fields-enclosed-by '"' --fields-escaped-by '\' \
     --no-create-info --tab /var/lib/mysql-files/

    Estoy de dumping para /var/lib/mysql-files/ para evitar este error:

    mysqldump: ha obtenido un error: 1290: El servidor MySQL se está ejecutando con-seguro-de-archivo-priv opción por lo que no se puede ejecutar esta instrucción cuando la ejecución de ‘SELECT INTO OUTFILE’

Dejar respuesta

Please enter your comment!
Please enter your name here