파이썬을 사용하여 하나의 mysql 데이터베이스에서 다른 데이터베이스로 데이터를 파이프합니다. 여기에 꽤 잘 근무하고 나는 몇 달 동안 사용 된 코드 가볍게 추상화 된 버전입니다 :다중 처리. 동시 프로세스를 실행하여 mysqldump에서 데이터를 파이프 처리하는 풀
이def copy_table(mytable):
raw_mysqldump = "mysqldump -h source_host -u source_user --password='secret' --lock-tables=FALSE myschema mytable"
raw_mysql = "mysql -h destination_host -u destination_user --password='secret' myschema"
mysqldump = shlex.split(raw_mysqldump)
mysql = shlex.split(raw_mysql)
ps = subprocess.Popen(mysqldump, stdout=subprocess.PIPE)
subprocess.check_output(mysql, stdin=ps.stdout)
ps.stdout.close()
retcode = ps.wait()
if retcode == 0:
return mytable, 1
else:
return mytable, 0
데이터의 크기는 성장했다, 그리고 그것은 현재 30 같은 것을 복사 한 시간 정도 소요 테이블. 일들을 빠르게 진행하기 위해 멀티 프로세싱을 활용하고 싶습니다. t2.micro (AWS EC2) 인 우분투 서버에서 다음 코드를 실행하려고합니다.
def copy_tables(tables):
with multiprocessing.Pool(processes=4) as pool:
params = [(arg, table) for table in sorted(tables)]
results = pool.starmap(copy_table, params)
failed_tables = [table for table, success in results if success == 0]
all_tables_processed = False if failed_tables else True
return all_tables_processed
문제는 : 거의 모든 테이블의 복사되지만, 그 이상 왼쪽 자식 프로세스의 부부가 완료되지 않습니다 항상있다 - 그들은 단지 걸어, 나는 데이터베이스를 모니터링에서 볼 수있는 자료 없음 전송 중입니다. 부모 프로세스와 어떻게 든 연결이 끊어 졌거나 데이터가 제대로 반환되지 않는 것 같습니다.
이것은 첫 번째 질문이며, 어떤 도움을 주셔서 감사합니다. 자세한 정보를 제공 할 수 있는지 알려 주시기 바랍니다.
감사합니다. 나는이 변화를 관찰 해 보았습니다. stdout.close()의 목적을 이해합니다. 자식 프로세스가 종료되면 SIGINT를 부모 프로세스로 반환해야합니다. – speedyturkey
@speedyturkey 제 잘못입니다. check_output이 (가) 호출을 차단하고 있습니다. Popen이어야합니다. – hailinzeng
초기 결과는 여기서 유망 해 보입니다. 환상적인 대답, 고마워요! – speedyturkey