¿Cómo divido un archivo de copia de seguridad MySql grande en varios archivos?

14

Tengo un archivo SQL de respaldo de 250 MB, pero el límite en el nuevo alojamiento es de solo 100 MB ...

¿Hay algún programa que te permita dividir un archivo SQL en múltiples archivos SQL?

Parece que la gente está respondiendo la pregunta equivocada ... así que aclararé más:

SOLO tengo el archivo de 250 MB y solo tengo el nuevo alojamiento usando phpMyAdmin que actualmente no tiene datos en la base de datos. Necesito tomar el archivo de 250 MB y subirlo al nuevo host, pero hay un límite de tamaño de carga del archivo de copia de seguridad SQL de 100 MB. Simplemente necesito tomar un archivo que es demasiado grande y dividirlo en varios archivos, cada uno de los cuales contiene solo declaraciones SQL válidas (no se pueden dividir declaraciones entre dos archivos).

Brian T Hannan
fuente
¿Tiene que ser múltiples archivos SQL válidos? Comprimiría el archivo en varios archivos en fragmentos de 100 MB y lo subiría.
Nifle
Sí, tiene que ser múltiples archivos SQL válidos ... siempre que no tenga la mitad de una declaración en un archivo y la otra mitad en otro archivo.
Brian T Hannan el

Respuestas:

5

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

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

mysqldump -d --all-databases

y restaurarlo

Luego volcar solo los datos en declaraciones de inserción separadas, para que pueda dividir los archivos y restaurarlos sin tener que concatenarlos en el servidor remoto

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
harrymc
fuente
¡Buen consejo! Tiene mucho sentido. Realmente bueno cuando hay dependencias complejas entre tablas para que una división de la exportación de esquema y datos no funcione.
Reed Richards
7

La manera más simple de dividir el archivo de respaldo es usar un software sqldumpsplitter, que le permite dividir el archivo db en múltiples archivos db. Descargar aquí

O bien, use este comando de terminal.

split -l 600 ./path/to/source/file.sql ./path/to/dest/file-

Aquí, 600 es el número de líneas que desea tener en sus archivos divididos. Y los dos argumentos son el origen y el destino de los archivos, respectivamente.

NOTA: debe verificar los archivos divididos, no divide ningún comando.

GIRI
fuente
1
¡Gracias por insinuar en la dirección correcta! Pero en lugar de usar split, recomiendo usar csplit. No se dividirá justo después de un cierto número de línea, que podría estar entre una lista de INSERTvalores, por ejemplo. Puede pasar una expresión regular para identificar líneas para dividir. Úselo de la siguiente manera, por ejemplo : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` Esto dividirá su archivo de volcado antes de cada create table …instrucción. Cambia esto a tus necesidades. (Por cierto, paso en {900}lugar de {*}porque me sale un error "csplit: *}: mal recuento de repeticiones" , ¿tal vez solo un problema en MacOS?)
Arvid
3

Escribí mysqldumpsplitter (script de shell), que divide las bases de datos / tablas según las instrucciones de una manera rápida y fácil. Vea todos los casos de uso posibles de cómo extraer de mysqldump .

sh mysqldumpsplitter.sh --source mysqldump-file.sql --extract DB --match_str database-name
mysql_user
fuente
0

1) ¿Tiene la opción de cargar el archivo por otro método, por ejemplo: scp o ftp y luego restaurarlo desde el archivo local?

2) ¿Su ISP tomará el archivo en CD y lo cargará por usted?

3) ¿Puede restaurar el archivo en un servidor local y luego hacer una serie de archivos de copia de seguridad utilizando criterios específicos para mantener bajos los tamaños individuales?

4) ¿Podría dividir el archivo manualmente y luego ordenar los comandos SQL al final de los archivos?

Linker3000
fuente
Estaba pensando en las opciones 2, 3 y 4. 2 sería el último recurso. 3 es probablemente lo siguiente que intentaré hacer. 4 fue lo primero que pensé, pero ni siquiera puedo abrir el archivo grande en el bloc de notas o cualquier editor b / c. Tardo horas en abrir un archivo de 250 MB de todo el texto ... todas las aplicaciones similares al bloc de notas se congelan y nunca regresan.
Brian T Hannan
@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ puede manejarlos bien. mirada más en superuser.com/questions/34749/...
Sathyajith Bhat
Si desea dividir el archivo AUTOMÁTICAMENTE y luego ordenar las piezas más pequeñas, eche un vistazo a la opción de división de la utilidad Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000
0

Puede dividir un archivo grande en Eclipse. He intentado con éxito un archivo de 105 GB en Windows:

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.
Alisa
fuente
0

También tuve este problema y decidí codificar una pieza de código extremadamente eficiente en memoria y CPU que divide un solo archivo .sql en varios (uno por tabla).

Tuve que escribirlo ya que cualquier otra solución que encontré no funcionaba lo suficientemente bien. En un volcado real de 16GB logré dividirlo en menos de 2 minutos.

El código y las instrucciones están disponibles en la página del proyecto en github

Andrea Baccega
fuente
0

Hay un par de opciones si puede ejecutar un script bash o perl. Prueba este de yoodey.com

#!/usr/bin/perl -w
#
# splitmysqldump - split mysqldump file into per-database dump files.
use strict;
use warnings;
my $dbfile;
my $dbname = q{};
my $header = q{};
while (<>) {    

# Beginning of a new database section:
    # close currently open file and start a new one
    if (m/-- Current Database\: \`([-\w]+)\`/) {
    if (defined $dbfile && tell $dbfile != -1) {
        close $dbfile or die "Could not close file!"
    }
    $dbname = $1;
    open $dbfile, ">>", "$1_dump.sql" or die "Could not create file!";
    print $dbfile $header;
    print "Writing file $1_dump.sql ...\n";
    }
    if (defined

$dbfile && tell $dbfile != -1) {
    print $dbfile $_;
    }
    # Catch dump file header in the beginning
    # to be printed to each separate dump file.
    if (!

$dbname) { $header .= $_; }
}
close $dbfile or die "Could not close file!"
Jrgns
fuente
-1

En lugar de dividir el archivo, puede usar un cliente MySQL en su máquina local y conectarlo al DB MySQL remoto. Yo uso HeidiSQL y lo he encontrado muy bueno.

Por supuesto, puede llevar un tiempo enviar los 250 MB de declaraciones SQL a través de Internet.

También puedes probar BigDump

Hydaral
fuente