2011-01-25 4 views
8

cmdmysql -uroot database < filename.sql을 실행하여 데이터베이스 덤프 (파일에서 읽은 후 MySQL로 전달)를 가져 왔습니다. 그러나 <은 powershell에서 "예약 됨"입니다.Powershell 파이프 파일 내용을 메모리에 파일을로드하지 않고 응용 프로그램에 넣습니다.

대신 powershell에서 get-content filename.sql | mysql -uroot database을 사용합니다. 주의해야 할 점은 powershell은 을 완전히 메모리에 넣기 전에 MySQL에 전달하고 큰 데이터베이스 덤프를 사용하면 메모리가 부족하다는 것입니다.

분명히, 나는 cmd을 통해 이것을 실행할 수 있었지만 이처럼 다양한 작업을 자동화하는 powershell 스크립트가 몇 개 있으며 배치를 모두 다시 작성하지 않아도됩니다. 이 특별한 경우에 filename.sql은 자동화가 시작될 때 PS 매개 변수를 통해 지정된 변수입니다.

그래서이 메모리 제한을 어떻게 극복 할 수 있습니까? 파일 내용을 MySQL에 직접 파이프하는 또 다른 방법이 있습니까? 일이 어쩌면 당신은 복잡한 작업을 수행하는 C# 콘솔 응용 프로그램을 작성해야 복잡 시작하면

답변

12

당신은

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

또는

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

을 시도 할 수 있습니다. 이 응용 프로그램 여부를 위해 작동 할 경우 (이 아닌 모두 한 번에 한 번에 1000 개 개의 레코드의 덩어리에서 파일을 처리해야)

+0

위로하고 다시 실행을 도움이되기를 바랍니다. 건배! – cbednarski

2

확실하지 :

얻을 콘텐츠 filename.sql의 -readcount 1000 | % {$ _ | mysql -uroot database}

+1

매끄러운 기술이지만 임의의 수의 줄로 나눠서 SQL 문법을 조작하는 것처럼 보입니다. 이것은 다른 곳에서도 유용 할 것입니다.하지만 고마워요. :) – cbednarski

0

대용량 파일의 경우 cmdlet을 사용하지 마십시오. 나는 3 천만 라인 길이의 파일과 비슷한 것을하고 있었고 아래 코드를 사용하여 문제가 없었습니다. 속도와 메모리 소비면에서 모두 뛰어난 성능을 발휘합니다. 테스트

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

    #do your thing here 

} 
$reader.Close() 
0

쉬운 방법 및 allready은 할 수 있습니다 :

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

내가이

관련 문제