2011-01-16 26 views
38

Tengo un directorio con un montón de archivos .sql que mysql vuelca de cada base de datos en mi servidor.Importar varios archivos de volcado .sql en la base de datos mysql desde el shell

p. Ej.

database1-2011-01-15.sql 
database2-2011-01-15.sql 
... 

Hay muchos de ellos en realidad.

Necesito crear un script de shell o una sola línea que probablemente importará cada base de datos.

Me estoy ejecutando en una máquina Linux Debian.

que pensar que hay alguna forma de pipa en los resultados de un ls en algún comando find o algo ..

cualquier ayuda y la educación es muy apreciado.

EDITAR

Así que en última instancia quiero importar automáticamente un archivo a la vez en la base de datos.

E.g. si lo hacía manualmente en una sería:

mysql -u root -ppassword < database1-2011-01-15.sql 

Respuesta

73

cat *.sql | mysql? ¿Los necesitas en un orden específico?

Si usted tiene demasiados para manejar esta manera, a continuación, intentar algo como:

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch 

Esto también pone en torno a algunos problemas con el paso de entrada de escritura a través de una tubería pesar de que no debería tener ningún problema con el procesamiento de tuberías bajo Linux Lo bueno de este enfoque es que la utilidad mysql lee en cada archivo en lugar de leer desde stdin.

+0

Al final utilicé el cat \ * .sql pero lo descompuso por letra para que no haya demasiada información. p.ej. cat a \ *. sql | mysql -u root -ppass –

+9

Utilicé 'ls -1 * .sql | awk '{print "fuente", $ 0}' | mysql --batch -u {username} -p {password} {dbname} 'como he nombrado mis archivos sql secuencialmente y quería ejecutarlos en ese orden – Luracast

+0

@Luracast Usé' ls -1 * .sql | awk '{print "fuente", $ 0}' | mysql --batch -u {username} -p {dbname} 'para que funcione. La contraseña debe ingresarse en la consola cuando realmente lo solicita, no en el comando mismo. MySQL no acepta contraseña en el comando. –

2

No recuerdo la sintaxis de mysqldump pero será algo como esto

find . -name '*.sql'|xargs mysql ... 
+0

haciendo un poco de investigación que es con lo que también estoy saliendo. p.ej. encontrar . -name '* .sql' | xargs mysql -u root -pcontraseña ¿Eso funcionaría? –

+0

y -h host si está en un servidor remoto y probablemente también necesite especificar el nombre de la base de datos – Navi

+0

la base de datos está referenciada en cada archivo de copia de seguridad por lo que la línea anterior ya funciona y es el localhost –

17

de una sola línea para leer en todas las .sql archivos y los importa:

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done 

El único truco es el reemplazo fiesta subcadena que se deben eliminar el .sql para obtener el nombre de base de datos.

+0

Como un encanto, ¡gracias por esto! Funcionó mejor que la respuesta aceptada para mí. – Swader

3

Creé una secuencia de comandos hace algún tiempo para hacer precisamente esto, que llamé (completamente poco creativo) "myload". Carga archivos SQL en MySQL.

Here it is on GitHub

Es muy sencillo y directo; le permite especificar los parámetros de conexión de mysql, y descomprimirá archivos sql gzip'ed sobre la marcha. Supone que tiene un archivo por base de datos, y la base del nombre del archivo es el nombre de la base de datos deseada.

Así:

myload foo.sql bar.sql.gz 

creará (si no existe) bases de datos llamados "foo" y "bar", e importar el archivo sql en cada uno.

Para el otro lado del proceso, escribí this script (mydumpall) que crea los archivos sql (o sql.gz) correspondientes para cada base de datos (o algún subconjunto especificado por nombre o expresiones regulares).

7

Hay un pequeño script excelente en http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script que tomará un archivo enorme mysqldump y lo dividirá en un único archivo para cada tabla. A continuación, puede ejecutar este script muy simple para cargar la base de datos de los archivos:

for i in *.sql 
do 
    echo "file=$i" 
    mysql -u admin_privileged_user --password=whatever your_database_here < $i 
done 

mydumpsplitter funciona incluso en archivos .gz, pero es mucho, mucho más lento que a descomprimir primero, y luego ejecutarlo en el archivo sin comprimir.

Digo enorme, pero supongo que todo es relativo. Me llevó entre 6 y 8 minutos dividir un archivo de volcado de 2000 MB y 2000 tablas para mí.

Cuestiones relacionadas