前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql-使用load两分钟-千万行表快速迁移合成亿行总表

mysql-使用load两分钟-千万行表快速迁移合成亿行总表

作者头像
十四君
修改2019-11-26 10:11:05
5150
修改2019-11-26 10:11:05
举报
文章被收录于专栏:UrlteamUrlteam

使用load这种底层的迁移方式,会让移动速度非常快。将已经导出为txt的7.2G数据合成为接近1亿行的总表,大致耗时2分钟。

目录:

  • 1:将分表数据导出为txt
  • 2:使用bash批量运行
  • 3:使用load批量迁移

一:分表数据导出为txt

其中的sql语句字段需要自定义,其次需要在同一目录下放入你mysql连接的配置文件

格式大概是:名为mysql.ini

代码语言:javascript
复制
[CONFIG]
host = ip
uesr = user_name
password = user_password
database = database_name
post = 3306

导出为txt的python代码为:

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#-------------------------------------------------------------------------
#   程序:mysql_to_txt.py
#   版本:1
#   作者:ly
#   日期:编写日期2017/2/18
#   语言:Python 2.7.x
#   操作:python mysql_to_txt.py 表名
#   功能:从数据库中读取有用数据存入txt,,之后用于load
#-------------------------------------------------------------------------
import MySQLdb
import time
from ConfigParser import SafeConfigParser
from sys import argv

conf = SafeConfigParser()
conf.read('./mysql.ini')
Host = conf.get('CONFIG', 'host')
User = conf.get('CONFIG', 'uesr')
Passwd = conf.get('CONFIG', 'password')
DB = conf.get('CONFIG', 'database')
Post = int(conf.get('CONFIG', 'post'))#需要int类型

starttime = time.time()
filename = './GD_1_1.txt'
tablename =  argv[1] #导入表名

file_ter = ';' # 分隔符
line_ter = '\n' #不同系统可能行分隔符不同

#ip转换的函数----无用
ip_to_num = lambda ip:sum([256**j*int(i) for j,i in enumerate(ip.split('.')[::-1])])
ip_to_ip3 = lambda ip:'.'.join(ip.split('.')[0:3])

if __name__ == '__main__':
    conn = MySQLdb.connect(host=Host,user=User,passwd=Passwd,db=DB,port=Post)
    cur = conn.cursor()

    select_sql = "SELECT ip,lat_gd,lon_gd,datetime FROM %s WHERE flag = 1 Limit 30;"  # 可修改
    cur.execute(select_sql % tablename)

    for now in cur.fetchall():
        pri_str = str(ip_to_num(now[0]))+','+str(now[0])+','+str(ip_to_ip3(now[0]))+','+str(round(float(now[1]),8))+','+str(round(float(now[2]),8))+','+str(now[3])
        print pri_str
    conn.close()

二:使用bash批量运行

使用sh bash.sh 运行下列命令 将数据表带

代码语言:javascript
复制
python read_mysql_to_txt.py 表名1 > 导出文件1.txt
python read_mysql_to_txt.py 表名2 > 导出文件2.txt
python read_mysql_to_txt.py 表名3 > 导出文件3.txt

load也同理

代码语言:javascript
复制
python txt_load_mysql.py 文件1.txt
echo '1'
python txt_load_mysql.py 文件2.txt
echo '2'
python txt_load_mysql.py 文件3.txt

三:使用load批量迁移

同样需要导入数据库连接的Mysql.ini配置文件

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#-------------------------------------------------------------------------
#   程序:mysql_to_txt.py
#   版本:1
#   作者:ly
#   日期:编写日期2017/2/18
#   语言:Python 2.7.x
#   操作:python mysql_to_txt.py txt文件名
#   功能:读取txt用于load
#-------------------------------------------------------------------------
import MySQLdb
import time
from ConfigParser import SafeConfigParser
from sys import argv

conf = SafeConfigParser()
conf.read('./mysql.ini')
Host = conf.get('CONFIG', 'host')
User = conf.get('CONFIG', 'uesr')
Passwd = conf.get('CONFIG', 'password')
DB = conf.get('CONFIG', 'database')
Post = int(conf.get('CONFIG', 'post'))#需要int类型
#print Host,User,Passwd,DB,Post
starttime = time.time()
filename = argv[1] # 外部传参数
tablename = '输出表名需要与txt文件对应'

file_ter = ","
line_ter = '\n'

if __name__ == '__main__':
    conn = MySQLdb.connect(host=Host,user=User,passwd=Passwd,db=DB,port=Post)
    cur = conn.cursor()

    load = "load data local infile '{0}' ignore into table {1} fields terminated by '{2}' lines terminated by '{3}' (num_ip,ip,ip3,lat_GD,lon_GD,time)"
    print load.format(filename,tablename,file_ter,line_ter)
    cur.execute(load.format(filename,tablename,file_ter,line_ter))

    conn.commit()
    conn.close()
    print time.time()-starttime

原创文章,转载请注明: 转载自URl-team

本文链接地址: mysql-使用load两分钟-千万行表快速迁移合成亿行总表

Related posts:

  1. mysql基本操作以及python控制mysql(1)–环境安装
  2. mysql基本操作以及python控制mysql(2)–mysql基础操作
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录:
  • 一:分表数据导出为txt
  • 二:使用bash批量运行
  • 三:使用load批量迁移
    • Related posts:
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档