2008-09-25 11 views
33

Necesito mover tablas enteras de una base de datos MySQL a otra. No tengo acceso completo al segundo, solo acceso phpMyAdmin. Solo puedo cargar archivos sql (comprimidos) de menos de 2 MB. Pero la salida comprimida de un mysqldump de las primeras tablas de la base de datos es más grande que 10MB.¿Cómo se divide la salida de mysqldump en archivos más pequeños?

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

¿O hay otra solución que me he perdido?

Editar

El --extended-insert = FALSO opción a Mysqldump sugerido por el primer cartel se obtiene un archivo .sql que a continuación se puede dividir en archivos importables, siempre que split (1) se llama con una opción adecuada --lines. Por prueba y error encontré que bzip2 comprime los archivos .sql por un factor de 20, así que tuve que averiguar cuántas líneas de código sql corresponden aproximadamente a 40 MB.

+0

mira esta Q en caso de que busques cómo [dividir un volcado postgresql grande en archivos más pequeños] (http://unix.stackexchange.com/questions/351546/split-a-large-postgresql-dump-into- archivos más pequeños) – rubo77

Respuesta

28

Primera volcar el esquema (que sin duda cabe en 2Mb, no?)

mysqldump -d --all-databases 

y restaurarlo.

Después volcar sólo los datos de las declaraciones 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 
+0

Estaba buscando una forma de habilitar una instrucción INSERT para cada fila insertada, en lugar de una declaración masiva con muchas tuplas o cada fila usando VALUES. La bandera '--extended-insert = FALSE' era lo que necesitaba. ¡Gracias! – dmkc

+0

Crear tabla: 'mysqldump mydatabase mytable -d> mytable-create.sql' Los datos: ' mysqldump mydatabase mytable --extended-insert = FALSE --no-create-info = TRUE> mytable-data.sql' Luego dividirlo en una serie de archivos de cualquier longitud: 'dividir mitabla-data.sql -l10000' Ahora puede importar la primera SQL crear. Luego, cada una de las tablas de 10,000 de longitud. Por defecto, los archivos se llamarán xaa, xab, xac ...). Importante por 'mysql mydatabase liamvictor

0

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

1

se puede volcar mesas individuales con mysqldump ejecutando mysqldump database table1 table2 ... tableN

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

10

Usted dice que no tiene acceso al segundo servidor. Pero si usted tiene acceso a una consola al primer servidor, donde las mesas son, puede dividir el volcado de 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 usar la opción --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 instrucción CREATE TABLE, y un archivo .txt, que contiene los datos, que se restaurará utilizando LOAD DATA INFILE. Aunque no estoy seguro si phpMyAdmin puede manejar estos archivos con su restricción particular.

+0

Si bien esto puede no cumplir directamente con las necesidades de OP, es una manera increíble de obtener tablas individuales en sus propios archivos ... para grep etc. –

2

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

En su PC, usted puede hacer algo como:

$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u nuevoUsuario -pnewpassword -h nuevohost NewDatabase

y ya está. :-)

esperanza esto ayuda

0

Salida SQLDumpSplitter 2, acabo de utilizar para dividir un vertedero de 40 MB con éxito. Se puede conseguir en el siguiente enlace:

sqldumpsplitter.com

Esperanza esta ayuda.

+0

La url ya no funciona – cdmdotnet

+0

¿qué hay de este: http://www.sqldumpsplitter.com/ – Sk8erPeter

+0

SQLDumpSplitter2 puede manejar archivos de hasta 2 GB solamente (2 147 483 648 bytes - utiliza un entero de 32 bits con signo para el tamaño del archivo, creo). Podría ser genial modificar esto o compilar el código fuente original para 64 bits, pero me temo que el código fuente probablemente se haya perdido. De lo contrario, es una gran herramienta. Pero muchos problemas con la división de archivos SQL comienzan alrededor de 2 GB de tamaño. –

1

Yo recomendaría el BigDump utilidad, puede agarrar aquí. http://www.ozerov.de/bigdump.php este tambalea la ejecución del vertedero, en lo más cerca que puede llegar a su límite, la ejecución de las líneas enteras a la vez.

26

Este script bash divide un archivo de volcado de una base de datos en archivos separados para cada tabla y nombres 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 [email protected]_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 [email protected]_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* 

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

+6

Tenga en cuenta que csplit en la Mac no funciona con esta secuencia de comandos porque no admite la sintaxis {*}. Necesito ejecutarlo en Linux. – rlorenzo

+0

Lo mismo en FreeBSD. Pero puede instalar allí el puerto o paquete sysutils/coreutils para obtener utilidades de GNU y usar gcsplit en su lugar. – Dereckson

+0

¡Una respuesta tan antigua pero funciona, impresionante! –

0

Este script debe hacer it:

#!/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

Puede dividir el archivo existente por AWK. Es muy Quik y simple

Vamos volcado de tabla dividida por 'cuadros':

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 volcado 'base de datos'

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}'; 
+0

no funciona para mí – SpaceDog

2

Hay esta excelente guión mysqldumpsplitter que viene con toneladas de opción para cuando se trata de extraer-de-mysqldump.

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

1) Extracto de base de datos única de mysqldump:

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

Por encima de comando creará SQL para la base de datos especificada de indicado archivo sql "filename" y guárdelo en formato comprimido en database-name.sql.gz.

2) Extraer sola tabla de mysqldump:

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

Por encima de comando creará SQL para la tabla especificada de archivo mysqldump especificada "nombre de archivo" y almacenarlo en formato comprimido a la base de datos -name.sql .gz.

3) Extraer tablas expresiones regulares de mysqldump:

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

Por encima de comando creará sqls para las tablas coincidente especificado regulares expresión a partir de determinado archivo mysqldump "nombre de archivo" y almacenarlo en formato comprimido a nombre-tabla individual.sql.gz.

4) Extracto de las bases de datos de mysqldump:

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

Por encima de comando extraerá todas las bases de datos de "nombre de archivo" archivo especificado mysqldump y almacenarlo en formato comprimido a individuo base de datos name.sql. gz.

5) Extraer toda la tabla de mysqldump:

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

Por encima de comando extraerá todas las tablas de "nombre de archivo" archivo especificado mysqldump y almacenarlo en formato comprimido a individuo mesa name.sql. gz.

6) lista de tablas de mysqldump Extracto:

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

Por encima de comando que va a extraer tablas desde el "nombre de archivo" archivo especificado mysqldump y almacenarlos en formato comprimido a individuo mesa name.sql .gz.

7) Extraer una base de datos mysqldump comprimido:

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

Por encima de comando descomprimirá filename.sql.gz usando gzip, extraer base de datos llamada "nombrebd" de "filename.sql.gz" & almacenarlo como out/dbname.sql.GZ

8) Extracto de una base de datos mysqldump comprimido en un comprimido formato:

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

Por encima de comando descomprimirá filename.sql.gz usando gzip y extraer base de datos llamada "nombrebd" de "nombre de archivo .sql.gz" & almacenarla como SQL llanura cabo/dbname.sql

9) Extracto alltables de mysqldump en carpeta diferente:

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

Por encima de comando extraerá todas las tablas de "nombre de archivo" archivo especificado mysqldump y extrae las tablas en formato comprimido para archivos individuales, mesa-name.sql.gz almacena en/ruta/a/extractos /. El script creará la carpeta/ruta/a/extractos/si no existe.

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

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

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

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

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

Por encima de comando extraerá tanto tbl1 y TBL2 de Base de datos DBNAME en formato sql en la carpeta "out" en el directorio actual.

Puede extraer sola tabla de la siguiente manera:

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

11) Extracto de todas las tablas de la base de datos específica:

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

Por encima de comando extraerá todas las tablas de la base de datos DBNAME en SQL y guárdelo en el directorio "fuera".

12) Lista de contenido del archivo mysqldump

mysqldumpsplitter.sh --source filename --desc

Por encima de comando mostrará una lista de bases de datos y tablas desde el archivo de volcado.

más tarde Usted puede optar por cargar los archivos: filename.sql.gz zcat | mysql -p -uUSER -hHOSTNAME

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

  • Dicho esto, si ese es su necesidad (llegando más a menudo), es posible considerar el uso de mydumper que en realidad crea vertederos individuales que usted no necesita para dividir!

1

Una aclaración sobre la respuesta de @ Verace:

me gusta especialmente el método interactivo; puedes dividir un archivo grande en Eclipse. He tratado de un archivo de 105GB en Windows con éxito:

Simplemente añadir 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. 
Cuestiones relacionadas