python实现mysql数据迁移

    服务器为普通PC机,双核,4G,装的mysql4.1,数据库大小已经到了21GB,平均每张表中的记录都超过了一百万条,select语句速度非常快,但是count语句查下来需要4秒多,开始的想法是在分页时先select,将结果返回到页面展示给用户后再自动激活javascript代码调用统计的java代码,在五秒内将统计结果刷新在页面上,各位老大有什么更好的办法请指点一下。
    一直搞不懂为什么有人喜欢用旧的东西,稳定吗?mysql5也有稳定版本啊,sco unix好?怎么我就觉得OpenSolaris好呢?tomcat也要用5.5的,struts用1.x的。你们用你们的,我用我的,装上 Ubuntu,OpenSolaris,eclipse3.4,tomcat6,mysql6 alpha。
    为了证明新的比旧的要好,加上同事每次导数据都是手动操作,cat出来再cat进去,看着我都紧张。加上Python已经上手了,决定写个批处理自动迁移数据。
    先下载mysql针对python的驱动,build,install,完成后就可以继续了。
    由于数据量很大,我分给linux的分区总共只有20G,所以只好将mysql6安装到了windows分区中,这样的话每次开机都要挂载该分区才能启动mysql,而且由于不是linux专有分区,所以读写速度比安装linux分区中要慢。
    为了不破坏数据,新建的数据库表中id不设为auto_increment,等所有数据成功导入后再alter。
    以下是示例:
   

 以上由于javaeye不能在firefox中粘贴,所以就以代码形式弄上去了。

以下数据库连接部分需要注意字符設置

#-*- coding: utf-8 -*-,
#coding = utf-8
from MySQLdb import *

def conn(a,b):
	conn_local = Connection('127.0.0.1','mysql','','test')
	conn_server = Connection('192.168.1.99','root','123456','indiglib')
	cur_server=conn_server.cursor()
	cur_local = conn_local.cursor()
	for i in range(a,b):
		cur_server.execute("select * from i_biblios where id='"+str(i)+"'")
		row=cur_server.fetchone()
		if row ==None:
			continue
		for j in (0,3):
			if row[j]=='NULL':
				row[j]=''
		cur_local.execute("insert into i_biblios(id,rectype,datatype,format,mdata,userid) values('"+str(row[0])+"','"+str(row[1])+"','"+str(row[2])+"','"+str(row[3])+"','"+str(row[4])+"','admin')")
		print "the record NO. is  %d" % (i, )
	conn_server.commit()
	conn_local.commit()
	cur_server.close()
	cur_local.close()
	conn_server.close()
	conn_local.close()

if __name__=='__main__':
	conn(9,20)

 使用时可直接修改conn(9,20)中的值,也可以像下面代码中那样调用模块:

import datetime
import connect

def getTime():
	pre = datetime.datetime.now()
	connect.conn(700000,800000)
	now = datetime.datetime.now()
	print now-pre

if __name__=='__main__':
	getTime()

    以上只是例子,实际使用时有部分改变。

    我为什么要一条一条地查而不是一次全弄出来呢?因为在这个基础上,后面还需要要用到统计输出某些id信息。

    弄完后再用count语句,速度快了不少,现在只需要3秒2就可以出来了,而且还是运行在windows挂载分区中,如果给我的机器换成服务器的配置,再给加点空间,速度肯定会更快的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值