背景

上个月跟朋友一起做了个微信小程序,趁着5.20节日的热度,两个礼拜内迅速积累了一百多万用户,我们在小程序页面增加了收集formid的埋点,用于给微信用户发送模板消息通知。

这个小程序一开始的后端逻辑是用douchat框架写的,使用框架自带的dc_mp_fans表存储微信端授权登录的用户信息,使用dc_mp_tempmsg表存储formid。截止到目前,收集到的数据超过380万,很大一部分formid都已经成功使用给用户发送过模板通知,起到了较好的二次推广的效果。

随着数据量的增大,之前使用的服务器空间开始有点不够用,最近新写了一个专门用于做小程序后台开发的框架,于是想把原来的数据迁移到新系统的数据库。买了一台4核8G的机器,开始做数据迁移。下面对迁移过程做一个简单的记录。

方案选择

mysqldump迁移

平常开发中,我们比较经常使用的数据备份迁移方式是用mysqldump工具导出一个sql文件,再在新数据库中导入sql来完成数据迁移。试验发现,通过mysqldump导出百万级量的数据库成一个sql文件,大概耗时几分钟,导出的sql文件大小在1G左右,然后再把这个1G的sql文件通过scp命令复制到另一台服务器,大概也需要耗时几分钟。在新服务器的数据库中通过source命令来导入数据,我跑了一晚上都没有把数据导入进来,cpu跑满。

脚本迁移

直接通过命令行操作数据库进行数据的导出和导入是比较便捷的方式,但是数据量较大的情况下往往会比较耗时,对服务器性能要求也比较高。如果对数据迁移时间要求不是很高,可以尝试写脚本来迁移数据。虽然没有实际尝试,但是我想过大概有两种脚本方案。

第一种方式,在迁移目标服务器跑一个迁移脚本,远程连接源数据服务器的数据库,通过设置查询条件,分块读取源数据,并在读取完之后写入目标数据库。这种迁移方式效率可能会比较低,数据导出和导入相当于是一个同步的过程,需要等到读取完了才能写入。如果查询条件设计得合理,也可以通过多线程的方式启动多个迁移脚本,达到并行迁移的效果。

第二种方式,可以结合redis搭建一个“生产+消费”的迁移方案。源数据服务器可以作为数据生产者,在源数据服务器上跑一个多线程脚本,并行读取数据库里面的数据,并把数据写入到redis队列。目标服务器作为一个消费者,在目标服务器上也跑一个多线程脚本,远程连接redis,并行读取redis队列里面的数据,并把读取到的数据写入到目标数据库。这种方式相对于第一种方式,是一种异步方案,数据导入和数据导出可以同时进行,通过redis做数据的中转站,效率会有较大的提升。关注公众号互联网架构师,回复关键字2T,获取最新架构视频

可以使用go语言来写迁移脚本,利用其原生的并发特性,可以达到并行迁移数据的目的,提升迁移效率。

文件迁移

第一种迁移方案效率太低,第二种迁移方案编码代价较高,通过对比和在网上找的资料分析,我最终选择了通过mysql的select data into outfile file.txt、load data infile file.txt into table的命令,以导入导出文件的形式完成了百万级数据的迁移。

迁移过程

在源数据库中导出数据文件

select*fromdc_mp_fansintooutfile'/data/fans.txt';

复制数据文件到目标服务器

zip fans.zip /data/fans.txt

scp fans.zip root@ip:/data/

在目标数据库导入文件

unzip /data/fans.zip

loaddata infile'/data/fans.txt'intotablewxa_fans(id,appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@d

按照这么几个步骤操作,几分钟内就完成了一个百万级数据表的跨服务器迁移工作。

注意项

mysql安全项设置

在mysql执行load data infile和into outfile命令都需要在mysql开启了secure_file_priv选项, 可以通过show global variables like '%secure%';查看mysql是否开启了此选项,默认值Null标识不允许执行导入导出命令。通过vim /etc/my.cnf修改mysql配置项,将secure_file_priv的值设置为空:

[mysqld]

secure_file_priv=''

则可通过命令导入导出数据文件。

导入导出的数据表字段不对应

上面示例的从源数据库的dc_mp_fans表迁移数据到目标数据库的wxa_fans表,两个数据表的字段分别为:- dc_mp_fans

wxa_fans

在导入数据的时候,可以通过设置字段名来匹配目标字段的数据,可以通过@dummy丢弃掉不需要的目标字段数据。

总结

结合本次数据迁移经历,总结起来就是:小数据量可以使用mysqldump命令进行导入导出,这种方式简单便捷。- 数据量较大,且有足够的迁移耐心时,可以选择自己写脚本,选择合适的并行方案迁移数据,这种方式编码成本较高。- 数据量较大,且希望能在短时间内完成数据迁移时,可以通过mysql导入导出文件的方式来迁移,这种方式效率较高。

【编辑推荐】

【责任编辑:未丽燕 TEL:(010)68476606】

点赞 0

mysql数据迁移性能_百万级MySQL的数据量,该如何快速的完成数据迁移?相关推荐

  1. 点云数据生成三维模型_残损叶轮想要逆向修补,三维扫描仪快速生成三维数据...

    工业模具三维扫描抄数形位公差检测服务 标签:模具三维扫描 模具抄数服务 模具形位公差检测 工业模具叶轮既指装有动叶的轮盘,是冲动式汽轮机转子的组成部分,又可以指轮盘与安装其上的转动叶片的总称.工业模具 ...

  2. 基础+优化+架构一键搞定,华为大佬的“百万级”MySQL笔记

    前言 MySQL不用多说,大家都知道它是目前最为活跃热门的开源数据库,由于成本低,操作简易的特点,所以在互联网企业中被广泛使用,即使是头部的BATJ.由此可见,想要在互联网行业混得风生水起,或者说想要 ...

  3. mysql群发消息_百万级用户量的站内信群发数据库设计

    随着WEB2.0的发展,用户之间的信息交互也变得十分庞大,而且实时性要求越来越高.现在很多SNS网站和一部分CMS网站都广泛地应用了站内信这一模块,这个看似简单的东西其实背后隐藏着很多需要设计师重视的 ...

  4. mysql like 多个条件_千万级MySQL数据库这样建索引可以让你的数据库飞起来.........

    创建索引常用规则 1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段 ...

  5. 向mysql数据库发送指令_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

  6. mysql 数据库命令大全_常用的MySQL数据库命令大全

    飞信2017V5.6.8860.0 官方正式版 类型:聊天其它大小:69.1M语言:中文 评分:9.6 标签: 立即下载 常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 ...

  7. redis value多大会影响性能_事务对MySQL性能有什么影响?有无索引查找对其影响有多大?...

    推荐学习 阿里P8MySQL,基础/索引/锁/日志/调优都不误,一锅深扒端给你 抖音后端123面开挂,全靠这份啃了58天的「Java进阶核心知识集」 肝了30天,整出这份[分布式宝典:限流+缓存+通讯 ...

  8. mysql删除数据库恢复_详解MySQL数据库恢复误删除数据

    血的教训,事发经过就不详述了.直接上操作步骤及恢复思路(友情提示:数据库的任何操作都要提前做好备份),以下是Mysql数据后的恢复过程: 1. 找到binlog 恢复数据的前提是必须开启Mysql的b ...

  9. mysql 唯一索引 性能_普通索引和唯一索引的区别、性能差异,以及其他索引简介...

    唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n). 1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最 ...

  10. jvm性能调优 - 21案例实战_百万级用户的在线系统如何基于G1垃圾回收器优化性能

    文章目录 案例背景引入 系统核心业务流程分析 系统的运行压力 G1垃圾回收器的默认内存布局 GC停顿时间如何设置? 到底多长时间会触发新生代GC? 新生代gc如何优化? mixed gc如何优化? 案 ...

最新文章

  1. 18段代码带你玩转18个机器学习必备交互工具
  2. Tone Mapping
  3. JMS详细的工作原理
  4. 人类一败涂地电脑版_热门游戏丨人类一败涂地云游戏来了! 咪咕快游独家正版上线!...
  5. Python核心编程第四章
  6. Java生鲜电商平台-电商支付流程架构实战
  7. MATLAB字符串转换函数
  8. USB 3.0存储产品CeBIT集中展示
  9. python循环语句for 循环十次_python循环语句for的使用方式,又快又好
  10. 2018-06-13 pymssql 访问 SQL Server 2017 或 pyodbc 访问支持 ODBC 的数据库
  11. MyEclipse或Eclipse导出JavaDoc中文乱码问题解决
  12. 20160205 - Windows 10 家庭版没有组策略
  13. 数据结构合并两个有序链表
  14. ST、SC、FC、LC光纤接头区别?
  15. linux kernel2.6中软中断运行线程ksoftirqd的创建
  16. HTML canvas系列-画圆(4)
  17. 为什么总学不好PS?300集PS从入门到高级自学教程,全面且系统
  18. java jsqlparse_SQL解析器 JSqlParser
  19. 牛视源码。抖音矩阵系统,come here
  20. java 组合优与继承_Java中为什么老鸟要告诉你优先使用组合而不是继承?

热门文章

  1. [20160325]bbed是否有4G的限制.txt
  2. 索引、视图和同义词、序列
  3. redis延时双删保证和数据库的一致性
  4. Android ViewPropertyAnimator:让动画变得简单起来!
  5. [SPLEB]CodeSmith原理剖析(2)
  6. docker探索-在centos6.5中安装docker(三)
  7. 第六次作业阶段一 学生成绩录入系统设计与实现
  8. mongoDB之监控工具mongotop
  9. 应对对日软件开发的危机
  10. 有关DataForm组件的研究_显示多重数据模型集合——Silverlight学习笔记[24]