怎么在MySQL中迁移线上日志库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
首先看日志库的情况:
1、日志库中数据量大于5000w的大表有5张;
2、这5张表开量前每个月的数据量大概在2000w左右,开量后会更多;
3、有2个表的索引大小已经超过数据文件大小
询问了业务方和运营对这些表的要求,具体如下:
1、保留最近这3个月的数据,其他的数据可以进行流转,避免影响线上业务的性能。
2、3个月之前的数据流转到一个本地库中,可以支持查询即可,查询速度不能过于慢,分钟级别的可以接受。
3、日志库在迁移的过程中,能够容忍几分钟的表数据丢失,对数据的同步实时性要求不是很高
4、线上的日志库需要支持用户活跃度等统计
5、不希望执行分库分表,有很多查询近几个月的SQL操作,表之间存在一定的耦合性,分表之后不利于关联操作
基于上面的分析,结合实际情况,初步设想的方案是:
1、对线上数据库game_log中的表进行rename操作,然后将原来的表重新创建出来,这个过程中不是连续的,可能会丢失几秒钟的数据。具体的操作如下:
#第一步 rename table game_log.table to game_log_bak.table; #第二步,获取表结构,其中重要的是auto_increment的值, #保证后续导入三个月内数据的时候不会发生冲突 show create table game_log_bak.table\G #第三步 在game_log库中重新创建第二步的表结构
2、将rename过后的game_log_bak库中的数据流转到本地的离线数据库中,该数据库采用infobright存储引擎,这样能够支持离线数据的快速查询
3、备份并清理线上表3个月之外的数据,大概是40G,并将线上的game_log_bak数据库中3个月以内的数据(大概10G)重新灌入game_log数据库中,这样结构就变成了:
4、删除game_log_bak库,并搭建一个只读从库,实时的从主库上同步game_log库的信息,如下:
5、从本地的只读从库中,像本地的infobright数据库中同步数据,同步的方法可以选用dataX工具,像下面这样:
6、设置定时任务,按照一定的周期清理线上的过期数据,确保线上只保留最近3个月的数据,不会对rds的磁盘存储空间产生压力。
这个方法中,目前看来存在下面几个问题:
1、经常性的清理线上数据,这些数据占用的表空间不能被立即回收,可能会造成数据表的碎片问题。
2、后续如果游戏的量级上来之后,使用这个问题可能还是会有问题,届时可以适当调整日志表的清理周期,如果数据量过大,可以考虑其他的方案来处理。
关于怎么在MySQL中迁移线上日志库问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。