¿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.
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
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
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.
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
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.
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!
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
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.
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.
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.
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).
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
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:
Espero que esto ayude.
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.
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}';
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.
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