pymysql:不同服务器之间的数据库拉取(无中转库)

之前遇到了这样的一个事情,就是在拉取数据库的时候,我想把两个不同服务器上的数据库进行转移(一个是远程的,一个是本地的),网上的教程是先用Fed。。什么的引擎搞一张一模一样的表放在本地。

FEDERATED存储引擎能让你访问远程的MySQL数据库而不使用replication或cluster技术(类似于Oracle的dblink)
使用FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。

但是最大的问题就是,我的表的数据量超大,直接用SQL语句搞到本地可能会直接内存爆炸。。。
所以我选择一点一点做。这时候就用到了Mysql中的Limit关键字,好用的一。每次只返回你从限定开始后的有限条记录

SELECT 
    column1,column2,...
FROM
    table
LIMIT offset , count;
SQL

offset参数指定要返回的第一行的偏移量。
第一行的偏移量为0,而不是1。
count指定要返回的最大行数。

最后将两个地方的数据库用代码进行转移,成功制作tele_thief.py,每次转移1000行。效果还是不错的。(程序代号电报窃贼.py)

# coding=utf-8
import pymysql
db1=pymysql.connect()
db2=pymysql.connect()#这是两个不同服务器上的数据库
cursor1=db1.cursor()
cursor2=db2.cursor()

rows= 176218363
once=1000
def sql_search_all():
    giao=list(cursor1.fetchall())
    sql2="insert into trck values(%s,%s,%s,%s,%s)"
    cursor2.executemany(sql2,giao)
    db2.commit()
    
for i in range(rows//once):
    try:
        sql1="select sfzh,xm,sjh,...........from ... limit %s,%s"#注意,这里无论是数字还是什么都是要用%s的!
        cursor1.execute(sql1,(i*once,once))
        sql_search_all()
        print(i*once)
    except Exception as e:
        print('error',e)
        print('/'+i*once+'/')

我是分割线giaogiaogiaogiaogiaogiaogiaogiaogiao

后续:

我在搞这个东西的时候手贱去点了一下navicat,从此就卡住了我淦。本来以为一个晚上能够搞好,但是周末回来都还没有好(虽然本周只有一天) ,回来之后直接把pycharm给关了,重启电脑。
发现只导入了1400,0000条数据左右。。。
懂了,还是不要手贱去乱基本点。。。
如果时间允许的话也可以在每个函数末尾加上一小条delay()函数,让MySQL休息一下,不知道有没有用,到时候再试一下。
加油!

Enjoy your coding!

猜你喜欢

转载自blog.csdn.net/weixin_44613271/article/details/120459821
今日推荐