我正在编写一个简单的Python脚本来复制MySQL数据库。我试图根据以下SO问题及其答案来复制数据库:“不使用mysqldump复制/复制数据库”,“python subprocess和mysqldump”和“Python subprocess,mysqldump和pipes”。然而,我的脚本由于某种原因无法正常工作,因为表和数据没有出现在我的新数据库中。
从输出中可以看出,mysqldump正常工作(我在输出中看到“Dump completed on...”),因此我认为我的管道有问题。
这是我的脚本:
但是,输出1和输出2都显示相同的mysqldump输出。所以我想这只是一个愚蠢的事情。
我也尝试过使用subprocess.call替代subprocess.Popen,但这也使得我的脚本变得无响应。
在Popen或call中包括shell=True也会导致脚本变得无响应。
然而,在命令提示符中输入以下命令(我使用的是Windows 8.1)可以正常工作:
mysqldump -h localhost -P 3306 -u root -p mydb | mysql -h localhost -P 3306 -u root -p mydb2
它可以在不到三秒钟的时间内复制我的小型测试数据库。
我希望我也能让它在Python中工作。
从输出中可以看出,mysqldump正常工作(我在输出中看到“Dump completed on...”),因此我认为我的管道有问题。
这是我的脚本:
#!/usr/bin/env python
import pymysql
from subprocess import Popen, PIPE, STDOUT
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='mydb')
cur = conn.cursor()
print("Attempting to create new database...")
try:
cur.execute("CREATE DATABASE mydb2")
print("Creating new database")
except Exception:
print("Database already exists")
print()
# close connection just to be sure
cur.close()
conn.close()
print("Trying to copy old database to new database...")
args1 = ["mysqldump", "-h", "localhost", "-P", "3306", "-u", "root", "-p", "mydb"]
args2 = ["mysql", "-h", "localhost", "-P", "3306", "-u", "root", "-p", "mydb2"]
p1 = Popen(args1, stdout=PIPE, stderr=STDOUT)
p2 = Popen(args1, stdin=p1.stdout, stdout=PIPE, stderr=STDOUT)
output = p2.communicate()
print("output:")
print(output)
print()
您可以看到,我从这个答案中采用了复制数据库管道。一开始,我遇到了错误mysqldump: Couldn't find table: "|"
,就像那个问题中一样。所以现在我按照建议使用了两个subprocess.Popen
调用,解决了该错误信息。
输出变量显示执行了mysqldump,但没有任何关于mysql命令的提及。
我尝试使用p2.wait()
和p1.wait()
代替p2.communicate()
中的一个答案,但这只会使我的Python脚本变得无响应。
我还尝试了以下方法:
output1 = p1.communicate()
output2 = p2.communicate()
但是,输出1和输出2都显示相同的mysqldump输出。所以我想这只是一个愚蠢的事情。
我也尝试过使用subprocess.call替代subprocess.Popen,但这也使得我的脚本变得无响应。
在Popen或call中包括shell=True也会导致脚本变得无响应。
然而,在命令提示符中输入以下命令(我使用的是Windows 8.1)可以正常工作:
mysqldump -h localhost -P 3306 -u root -p mydb | mysql -h localhost -P 3306 -u root -p mydb2
它可以在不到三秒钟的时间内复制我的小型测试数据库。
我希望我也能让它在Python中工作。