手头有个上千万条的sqlserver数据库(27G大,具体原因不方便说),一直占用了一个服务器,我试图全部转移到mysql里面进行存储和查询。
sqlserver数据库名sfz,打算转到mysql里面起名person。
sfz的格式很大,而且没有建立主键,里面重复的数据肯定也是存在的,而且非常不规范,按照sfz的字段结构,在person里面建立相应比较规范一点的结构,具体来说,就是几个字段都设计大一点,例如name字段吧,考虑有外国人或者其他输入错误的情况,一般设置12个,我给设置成60个,挨个进行设置。
完了以后,在linux服务器shell界面,使用python进行传输,刚开始我采用的是execute方式+commit,那个慢啊,后来采用10000条一递交的方式,速度快多了,用了大约4个小时传递完。而且丢失的不多。
代码如下:
import pymssql
import pymysql
#定义源数据
def conns():
global cursor, conn
serverName = '172.31.5.2'
dataBase = '改成你的mssqlserver数据库'
userName = 'sa'
passWord = 'xxxxxx'
conn = pymssql.connect(serverName, userName, passWord, dataBase)
cursor = conn.cursor()
#定义目标数据
def connd():
global cursorD, connD
serverNameD = 'localhost' #改成你的mysql数据库信息
dataBase = 'sfz'
userName = 'sfz'
passWord = 'xxxxxxx'
connD = pymysql.connect(serverNameD, userName, passWord, dataBase)
cursorD = connD.cursor()
def queryById():
tablename= "person" #这里你可以设置成你想要的表
#以下为了提取person里面最大id,为了防止意外中断,继续操作用的
sqlstr = "select id from "+ tablename + " order by id DESC LIMIT 1 "
cursorD.execute(sqlstr)
maxid= cursorD.fetchone()
if maxid == None:
maxid1 = 0
else:
maxid1 = maxid[0]
#开始每万条处理一次
for i in range(0,23000000,10000):
sqlstr = f"SELECT top 10000 [Name],[CtfId],[Gender],[Birthday],[Address],[zip],[Mobile],[Tel],[Fax]"\
",[EMail],[id] FROM [shenfenzheng].[dbo].[cdsgus] where id >(" + str(maxid1) + " + "+ str(i) +")"
cursor.execute(sqlstr)
results = cursor.fetchall()
if results == None: #循环完自动断开
conns.close()
connD.close()
cursor.close()
cursorD.close()
break
#以下为插入到person中
sqlinsert = f"insert into " + tablename +"(name,CtfId,Gender,Birthday,Address,"\
"zip,Mobile,Tel,Fax,EMail,id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"\
"on duplicate key update id = values (id)"
#这里要注意:on duplicate key update id = values (id) 这个必须保留,这是主键信息,更改为你自己的
try:
cursorD.executemany(sqlinsert,results)
print(f'current ID is :{i},begin from {maxid1} ')
connD.commit()
except:
print("display errors")
pass
# connD.commit()
conns()
connd()
queryById()
好了,有问题可以在讨论区跟我讲。这里是jmysoft notebook,记住我的域名:jmysoft.com