Saltar al contenido

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

Esta división ha sido analizado por expertos para garantizar la veracidad de nuestra esta sección.

Solución:

Este script bash divide un archivo de volcado de una base de datos en archivos separados para cada tabla y los 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 [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
        # cut off all other tables
        mv $FILE foot
else
        # cut off the end of each file
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET [email protected]_TIME_ZONE/" *
        mv $FILE1 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

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

mysqldump -d --all-databases 

y restaurarlo.

Luego, vuelque 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

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

Copiaría la receta aquí para elegir su caso:

1) Extraiga 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 del archivo sql “nombre de archivo” especificado y lo almacenará en formato comprimido en database-name.sql.gz.

2) Extraiga una sola 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 del archivo mysqldump “nombre de archivo” especificado y lo almacenará en formato comprimido en el nombre de la base de datos.sql.gz.

3) Extraiga 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 tablas que coincidan con la expresión regular especificada del archivo mysqldump “nombre de archivo” especificado y lo almacenará en formato comprimido en el nombre de tabla individual.sql.gz.

4) Extraiga todas las bases de datos de mysqldump:

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

El comando anterior extraerá todas las bases de datos del archivo mysqldump “nombre de archivo” especificado y las almacenará en formato comprimido en el nombre de la base de datos individual.sql.gz.

5) Extraiga toda la tabla de mysqldump:

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

El comando anterior extraerá todas las tablas del archivo mysqldump “nombre de archivo” especificado y las almacenará en formato comprimido en el nombre de tabla individual.sql.gz.

6) Extraiga la lista de tablas de mysqldump:

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

El comando anterior extraerá tablas del archivo mysqldump “nombre de archivo” especificado y las almacenará en formato comprimido en table-name.sql.gz individual.

7) Extraiga 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á filename.sql.gz usando gzip, extraerá la base de datos llamada “dbname” de “filename.sql.gz” y la almacenará como out / dbname.sql.gz

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

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

El comando anterior descomprimirá filename.sql.gz usando gzip y extraerá la base de datos llamada “dbname” de “filename.sql.gz” y la almacenará como simple sql out / dbname.sql

9) Extraiga 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 archivo mysqldump “nombre de archivo” especificado y extrae las tablas en formato comprimido a archivos individuales, table-name.sql.gz almacenados en / ruta / a / extractos /. El script creará la carpeta / ruta / a / extractos / 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 varias bases de datos y desea extraer algunas tablas de una base de datos.

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

Extraer 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) Extraiga 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 formato sql y las almacenará en el directorio “out”.

12) Lista de contenido del archivo mysqldump

mysqldumpsplitter.sh --source filename --desc

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

Más tarde, puede optar por cargar los archivos: zcat filename.sql.gz | mysql -uUSER -p -hNOMBREHOST

  • Además, una vez que extrae una sola tabla que cree que es aún más grande, puede usar el comando Linux split con el 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 (que viene con más frecuencia), podría considerar usar mydumper, que en realidad crea volcados individuales que no necesitará dividir.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *