podproces python i mysqldump
Wiem, że części tego pytania zostały już wcześniej zadane, ale mam kilka powiązanych pytań.
Próbuję wykonać
mysqldump -u uname -ppassword --add-drop-database --databases databaseName | gzip > fileName
Potencjalnie zrzucam bardzo dużą (200GB?) Db. Czy to samo w sobie jest głupie? Następnie chcę wysłać skompresowany plik przez sieć do przechowywania, usunąć lokalny zrzut i oczyścić kilka tabel.
W każdym razie korzystałem z takiego podprocesu, ponieważ wydaje się, że nie ma sposobu na wykonanie całego oryginalnego wywołania bez podprocesu z uwzględnieniem | być nazwą tabeli .:
from subprocess import Popen, PIPE
f = open(FILENAME, 'wb')
args = ['mysqldump', '-u', 'UNAME', '-pPASSWORD', '--add-drop-database', '--databases', 'DB']
p1 = Popen(args, stdout=PIPE)
P2 = Popen('gzip', stdin=p1.stdout, stdout=f)
p2.communicate()
ale potem czytam, że komunikacja buforuje dane w pamięci, co nie działa dla mnie. Czy to prawda?
Tym, co teraz skończyłem, jest:
import gzip
subprocess.call(args, stdout=f)
f.close()
f = open(filename, 'rb')
zipFilename = filename + '.gz'
f2 = gzip.open(zipFilename, 'wb')
f2.writelines(f)
f2.close()
f.close()
oczywiście zajmuje to milion lat i nienawidzę tego.
Moje pytania: 1. Czy mogę użyć mojego pierwszego podejścia do bardzo dużej bazy danych? 2. Czy mógłbym przekazać wyjście mysqldump do gniazda i wystrzelić je przez sieć i zapisać, gdy nadejdzie, zamiast wysyłać spakowany plik?
Dzięki!