¿Cómo divido la salida de mysqldump en archivos más pequeños?


Necesito mover tablas enteras de una base de datos MySQL a otra. No tengo acceso completo al segundo, solo acceso phpMyAdmin. Solo puedo subir archivos sql (comprimidos) menores de 2MB. Pero la salida comprimida de un mysqldump de las tablas de la primera base de datos es mayor que 10MB.

¿Hay alguna forma de dividir la salida de mysqldump en archivos más pequeños? No puedo usar split(1) ya que no puedo cat (1) los archivos en el servidor remoto.

O hay otra solución Me he perdido?

Editar

La opción extended extended-insert = FALSE para mysqldump sugerida por el primer poster produce un.archivo sql que luego se puede dividir en archivos importables, siempre que split(1) se llame con una opción adecuada lines lines. Por ensayo y error encontré que bzip2 comprime el .archivos sql por un factor de 20, así que necesitaba averiguar cuántas líneas de código sql corresponden aproximadamente a 40MB.

Author: lindelof, 2008-09-25

16 answers

Primero volcar el esquema (seguramente encaja en 2Mb, no?)

mysqldump -d --all-databases 

Y restaurarlo.

Luego volcar solo los datos en instrucciones de inserción separadas, por lo que puede dividir los archivos y restaurarlos sin tener que concatenar en el servidor remoto

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
 28
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-25 12:21:38

Este script bash divide un archivo de descarga de una base de datos en archivos separados para cada tabla y nombra con csplit y los nombra en consecuencia:

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on https://gist.github.com/jasny/1608062
####

#adjust this to your case:
START="/-- Table structure for table/"
# or 
#START="/DROP TABLE IF EXISTS/"


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " $0 DUMP_FILE"
        echo "extract one table:"
        echo " $0 DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table $2
        csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable $1 "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
        mv $FILE foot
else
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
        mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
        NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
        cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

Basado en https://gist.github.com/jasny/1608062
y https://stackoverflow.com/a/16840625/1069083

 30
Author: rubo77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:42

Dices que no tienes acceso al segundo servidor. Pero si tiene acceso de shell al primer servidor, donde están las tablas, puede dividir su volcado por tabla:

for T in `mysql -N -B -e 'show tables from dbname'`; \
   do echo $T; \
   mysqldump [connecting_options] dbname $T \
   | gzip -c > dbname_$T.dump.gz ; \
   done

Esto creará un archivo gzip para cada tabla.

Otra forma de dividir la salida de mysqldump en archivos separados es usando la opción tab tab.

mysqldump [connecting options] --tab=directory_name dbname 

Donde directory_name es el nombre de un directorio vacío. Este comando crea un .archivo sql para cada tabla, que contiene la Declaración de TABLA, y a .archivo txt, que contiene los datos, que se restaurará utilizando CARGAR DATOS INFILE. Sin embargo, no estoy seguro de si phpMyAdmin puede manejar estos archivos con su restricción particular.

 10
Author: Giuseppe Maxia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-25 16:15:19

Respuesta tardía, pero estaba buscando la misma solución y se encontró con el siguiente código del siguiente sitio web:

for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done

Http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to-individual-files

 9
Author: Lee Haskings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-22 03:39:41

He creado recientemente sqlsplit.com. Pruébalo.

 4
Author: vbarbarosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-03 13:04:56

Existe este excelente script mysqldumpsplitter que viene con toneladas de opciones para cuando se trata de extraer-de-mysqldump.

Me gustaría copiar la receta aquí para elegir su caso de:

1) Extraer una sola base de datos de mysqldump:

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

El comando anterior creará sql para la base de datos especificada a partir de "filename" archivo sql y almacenarlo en formato comprimido para nombre de la base de datos.SQL.gz.

2) Extraer una tabla de mysqldump:

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

El comando anterior creará sql para la tabla especificada a partir de la tabla especificada "filename" mysqldump archivo y almacenarlo en formato comprimido para nombre de la base de datos.SQL.gz.

3) Extraer tablas que coincidan con la expresión regular de mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression

El comando anterior creará sqls para las tablas que coincidan con las regulares especificadas expresión del archivo mysqldump "filename" especificado y almacenarlo en formato comprimido a nombre de tabla individual.SQL.gz.

4) Extraer todas las bases de datos de mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLDBS

El comando anterior extraerá todas las bases de datos de "filename" especificado" mysqldump archivo y almacenarlo en formato comprimido a individuo nombre de la base de datos.SQL.gz.

5) Extraer toda la tabla de mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

El comando anterior extraerá todas las tablas de "filename" especificado" mysqldump archivo y almacenarlo en formato comprimido a individual nombre de la tabla.SQL.gz.

6) Extraer la lista de tablas de mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

El comando anterior extraerá tablas del "nombre de archivo especificado" mysqldump archivo y almacenarlos en formato comprimido a individuo nombre de la tabla.SQL.gz.

7) Extraer una base de datos de mysqldump comprimido:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip

El comando anterior descomprimirá el nombre del archivo.SQL.gz usando gzip, extraer nombre de la base de datos "dbname" de " filename.SQL.gz " y almacenarlo como out / dbname.SQL.gz

8) Extraer una base de datos de mysqldump comprimido en un formato sin comprimir formato:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none

El comando anterior descomprimirá el nombre del archivo.SQL.gz usando gzip y extracto base de datos llamada "dbname" de " filename.SQL.gz " y almacenarlo como sql simple out / dbname.sql

9) Extraer todas las tablas de mysqldump en una carpeta diferente:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/

El comando anterior extraer todas las tablas del "nombre de archivo especificado" mysqldump archivo y extrae tablas en formato comprimido a individual archivos, nombre de tabla.SQL.gz almacenado en / path / to / extracts/. Script creará la carpeta / ruta / a / extracciones / si no existe.

10) Extraiga una o más tablas de una base de datos en un volcado completo:

Considere que tiene un volcado completo con múltiples bases de datos y desea extraiga algunas tablas de una base de datos.

Extraer una base de datos: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

Extrae todas las tablas sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" aunque podemos usar otra opción para hacer esto en un solo comando de la siguiente manera:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

El comando anterior extraerá tanto tbl1 como tbl2 de la base de datos DBNAME en formato sql en la carpeta " out " en el directorio actual.

Puede extraer una sola tabla de la siguiente manera:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11) Extraer todas las tablas de una base de datos específica:

mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none

El comando anterior extraer todas las tablas de la base de datos DBNAME en sql formatearlo y almacenarlo en el directorio" out".

12) Listar el contenido del archivo mysqldump

mysqldumpsplitter.sh --source filename --desc

El comando anterior listará bases de datos y tablas del archivo de volcado.

Más tarde puede elegir cargar los archivos: nombre de archivo zcat.SQL.gz / mysql-uUSER-p-hHOSTNAME

  • También una vez que extraiga una sola tabla que cree que es aún más grande, puede usar el comando de división de Linux con número de líneas para dividir aún más el volcado. split -l 10000 filename.sql

  • Dicho esto, si esa es su necesidad (viniendo más a menudo), puede considerar usar mydumper que en realidad crea volcados individuales que no necesitará dividir!

 3
Author: mysql_user,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-12 05:53:14

No necesita acceso ssh a ninguno de sus servidores. Solo un cliente mysql [dump] está bien. Con mysql [dump], puede volcar su base de datos e importarla de nuevo.

En tu PC, puedes hacer algo como:

Mys mysqldump-u originaluser-poriginalpassword-h originalhost originaldatabase | mysql-u newuser-pnewpassword-h newhost newdatabase

Y has terminado. :-)

Espero que esto ayude

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-07 15:08:59

Puede volcar tablas individuales con mysqldump ejecutando mysqldump database table1 table2 ... tableN

Si ninguna de las tablas es demasiado grande, eso será suficiente. De lo contrario, tendrá que comenzar a dividir los datos en las tablas más grandes.

 1
Author: skoob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-25 12:20:14

Recomendaría la utilidad bigdump, puedes cogerla aquí. http://www.ozerov.de/bigdump.php esto escalona la ejecución del volcado, tan cerca como puede llegar a su límite, ejecutando líneas enteras a la vez.

 1
Author: LittleT15,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-19 13:47:35

Una aclaración sobre la respuesta de @Vérace:

Me gusta especialmente el método interactivo; puede dividir un archivo grande en Eclipse. He probado un archivo de 105 GB en Windows con éxito:

Simplemente agregue la biblioteca MySQLDumpSplitter a su proyecto: http://dl.bintray.com/verace/MySQLDumpSplitter/jar /

Nota Rápida sobre cómo importar:

- In Eclipse, Right click on your project --> Import
- Select "File System" and then "Next"
- Browse the path of the jar file and press "Ok"
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish"
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse
- Double click on the jar file in Eclipse (in Package Explorer)
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.
 1
Author: Alisa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-22 19:39:41

Intente csplit(1) para cortar la salida en las tablas individuales basadas en expresiones regulares (que coincidan con el límite de la tabla, creo).

 0
Author: jj33,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-25 12:18:52

Este script debería hacerlo:

#!/bin/sh

#edit these
USER=""
PASSWORD=""
MYSQLDIR="/path/to/backupdir"

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

echo - Dumping tables for each DB
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
for db in $databases; do
    echo - Creating "$db" DB
    mkdir $MYSQLDIR/$db
    chmod -R 777 $MYSQLDIR/$db
    for tb in `$MYSQL  --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"`
        do 
            echo -- Creating table $tb
            $MYSQLDUMP --opt  --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2
    done
    echo
done
 0
Author: gadelkareem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 00:58:34

Echa un vistazo a SQLDumpSplitter 2, acabo de usarlo para dividir un volcado de 40 MB con éxito. Puede obtenerlo en el siguiente enlace:

Sqldumpsplitter.com

Espero que esto ayude.

 0
Author: direct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-28 03:37:43

He creado MySQLDumpSplitter.java que, a diferencia de los scripts bash, funciona en Windows. Es disponible aquí https://github.com/Verace/MySQLDumpSplitter.

 0
Author: Vérace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-07 21:27:03

Puede dividir el archivo existente por AWK. Es muy fácil y simple

Dividamos el volcado de tablas por 'tablas':

cat dump.sql | awk 'BEGIN {output = "comments"; }
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); }
{ print $data >> output }';

O puede dividir el volcado por'base de datos'

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}';
 0
Author: zalex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-02 09:16:52

Prueba esto: https://github.com/shenli/mysqldump-hugetable Volcará datos en muchos archivos pequeños. Cada archivo contiene menos o igual registros MAX_RECORDS. Puede establecer este parámetro en env.sh.

 0
Author: shenli3514,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-21 02:52:13