从sqlserver批量传输数据到mysql-jmysoft

手头有个上千万条的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

发表评论

邮箱地址不会被公开。 必填项已用*标注