2011-01-25 9 views
8

Con cmd correría mysql -uroot database < filename.sql para importar un volcado de base de datos (leer del archivo y pasarlo a MySQL). Sin embargo, < está "reservado" en powershell.Powershell pipe contenido del archivo en la aplicación sin cargar el archivo en la memoria

En cambio, en powershell uso get-content filename.sql | mysql -uroot database. La advertencia es que powershell lee filename.sqlcompletamente en la memoria antes de pasarlo a MySQL, y con volcados de bases de datos grandes simplemente se queda sin memoria.

Obviamente, podría ejecutar esto a través de cmd pero tengo un puñado de scripts de PowerShell que automatizan varias tareas como esta y no quiero tener que reescribirlas todas en lote. En este caso particular, filename.sql es una variable que se especifica mediante parámetros de PS cuando se inicia la automatización.

Entonces, ¿cómo puedo evitar esta limitación de memoria? ¿Hay alguna otra manera de canalizar los contenidos del archivo en MySQL directamente?

Respuesta

12

Usted puede intentar

mysql -uroot -pYourPassword -e "source C:\temp\filename.SQL" 

o

mysql --user=root --password=YourPassword --execute="source C:\temp\filename.SQL" 

Si las cosas empiezan a complicarse tal vez debería escribir una aplicación de consola de C# que hace las tareas complejas.

+0

en marcha de nuevo. ¡Aclamaciones! – cbednarski

2

No estoy seguro si esto funcionará para su aplicación o no (que debe procesar el archivo en trozos de 1000 registros a la vez, en lugar de todos a la vez):

get-content filename.sql -readcount 1000 |% {$ _ | base de datos mysql -uroot}

+1

técnica Slick, pero dividir arbitrariamente en el número de líneas parece modificar la sintaxis de SQL. Sin embargo, esto definitivamente será útil en otros lugares, gracias. :) – cbednarski

0

Yo diría que se mantenga alejado de los cmdlets para archivos de gran tamaño. He estado haciendo algo similar con archivos que tienen más de 30 millones de líneas y que no han tenido problemas al usar el código siguiente. Tiene un rendimiento extremadamente bueno tanto en velocidad como en consumo de memoria.

$reader = [IO.File]::OpenText($filetoread) 
while ($reader.Peek() -ge 0) { 
    $line = $reader.ReadLine() 

    #do your thing here 

} 
$reader.Close() 
0

La manera más fácil y noté probado es hacer:

Get-Content .\buTable.sql | mysql -uuser -ppassword destDatabase 

espero que esto ayudará

Cuestiones relacionadas