背景上个月跟朋友一起做了个微信小程序 , 趁着5.20节日的热度 , 两个礼拜内迅速积累了一百多万用户 , 我们在小程序页面增加了收集formid的埋点 , 用于给微信用户发送模板消息通知 。
这个小程序一开始的后端逻辑是用douchat框架写的 , 使用框架自带的dc_mp_fans表存储微信端授权登录的用户信息 , 使用dc_mp_tempmsg表存储formid 。截止到目前 , 收集到的数据超过380万 , 很大一部分formid都已经成功使用给用户发送过模板通知 , 起到了较好的二次推广的效果 。
随着数据量的增大 , 之前使用的服务器空间开始有点不够用 , 最近新写了一个专门用于做小程序后台开发的框架 , 于是想把原来的数据迁移到新系统的数据库 。买了一台4核8G的机器 , 开始做数据迁移 。下面对迁移过程做一个简单的记录 。关注公众号互联网架构师 , 回复关键字2T , 获取最新架构视频
文章插图
方案选择
- MySQLdump迁移
- 脚本迁移
第一种方式 , 在迁移目标服务器跑一个迁移脚本 , 远程连接源数据服务器的数据库 , 通过设置查询条件 , 分块读取源数据 , 并在读取完之后写入目标数据库 。这种迁移方式效率可能会比较低 , 数据导出和导入相当于是一个同步的过程 , 需要等到读取完了才能写入 。如果查询条件设计得合理 , 也可以通过多线程的方式启动多个迁移脚本 , 达到并行迁移的效果 。
第二种方式 , 可以结合redis搭建一个“生产+消费”的迁移方案 。源数据服务器可以作为数据生产者 , 在源数据服务器上跑一个多线程脚本 , 并行读取数据库里面的数据 , 并把数据写入到redis队列 。目标服务器作为一个消费者 , 在目标服务器上也跑一个多线程脚本 , 远程连接redis , 并行读取redis队列里面的数据 , 并把读取到的数据写入到目标数据库 。这种方式相对于第一种方式 , 是一种异步方案 , 数据导入和数据导出可以同时进行 , 通过redis做数据的中转站 , 效率会有较大的提升 。关注公众号互联网架构师 , 回复关键字2T , 获取最新架构视频
可以使用Go语言来写迁移脚本 , 利用其原生的并发特性 , 可以达到并行迁移数据的目的 , 提升迁移效率 。
- 文件迁移
迁移过程在源数据库中导出数据文件
select * from dc_mp_fans into outfile '/data/fans.txt';
复制数据文件到目标服务器zip fans.zip /data/fans.txtscp fans.zip root@ip:/data/
【百万级MySQL的数据量,该如何快速的完成数据迁移?】在目标数据库导入文件unzip /data/fans.zip
load data infile '/data/fans.txt' into table wxa_fans(id,Appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@d
按照这么几个步骤操作 , 几分钟内就完成了一个百万级数据表的跨服务器迁移工作 。
推荐阅读
- 凤凰水仙茶的采摘技巧,凤凰水仙的等级分类
- MySQL存时间,到底该用timestamp还是datetime?
- 第16问:创建一张表时,MySQL 的统计表是如何变化的?
- 「爱色丽i1Pro校色仪」保姆级校色软件教程
- MySQL8.0.17版本之后,integer类型字段将不再显示长度
- 竹叶青峨眉高山绿茶第五届业余高尔夫超级联赛总决赛在观澜湖开杆
- MySQL- 5.7数据库sys schema总结--性能优化必备
- 整理下公司内部MySQL使用规范,分享给大家
- Linux高级命令
- 软件测试基础——Linux系统搭建MySQL数据库