4

この質問の一部が以前に尋ねられたことは知っていますが、関連する質問がいくつかあります。

実行しようとしています

mysqldump -u uname -ppassword --add-drop-database --databases databaseName | gzip > fileName

非常に大きな (200GB?) データベースをダンプしている可能性があります。それ自体がばかげたことですか?次に、ストレージ用に圧縮ファイルをネットワーク経由で送信し、ローカル ダンプを削除し、いくつかのテーブルを削除します。

とにかく、サブプロセスを考慮せずに元の呼び出し全体を実行する方法がないように見えるため、このようなサブプロセスを使用していました | テーブル名にします。:

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()

しかし、私は通信がデータをメモリにキャッシュすることを読みましたが、これは私にとってはうまくいきません。これは本当ですか?

私が今やったことは次のとおりです。

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()

もちろん、これには百万年かかりますが、私はそれが嫌いです。

私の質問: 1. 非常に大きなデータベースで最初のアプローチを使用できますか? 2. zip ファイルを送信するのではなく、mysqldump の出力をソケットにパイプしてネットワーク経由で起動し、到着したら保存することはできますか?

ありがとう!

4

4 に答える 4

2

はい、データはメモリにバッファリングされます:

"注: 読み取ったデータはメモリにバッファリングされるため、データ サイズが大きい場合や無制限の場合は、このメソッドを使用しないでください。" -サブプロセス ドキュメント

残念ながら、現時点では Popen を非同期で使用する方法はありません: PEP3145

これをすべてPythonで行うのではなく、手動で行うことができます

os.system("mysqldump -u uname -ppassword --add-drop-database --databases databaseName | gzip > fileName

")

もちろん、適切な文字列置換を使用してstring.format; そうしないと、特にパイプ経由で 200 GB を通信しようとして、コンピューターに不必要なストレスがかかります...

あなたがやろうとしていることについて詳しく説明できますか?現在、同じコンピューターでダンプと圧縮の両方を行っているようです。


はい、ネットワークを介してファイルをストリーミングできます..mysqlの出力を直接ストリーミングしたいかどうかはわかりませんが、それを検討する前にネットワーク機能を確認することをお勧めします


バッシュ:

#!/bin/bash
mysqldump -u uname -ppassword --add-drop-database --databases databaseName | gzip > fileName
 #transfer fileName to other computer

^これをcrontabに入れて、間隔を置いて実行することもできます:)

于 2013-07-26T19:36:12.943 に答える