MySQL 线上日志库迁移实例

说说最近的一个案例吧,线上阿里云RDS上的一个游戏日志库最近出现了一点问题,随着游戏人数的增加,在线日志库的数据量越来越大,最新的日志库都已经到50G大小了,在线变更的时间非常长。

之前之所以没有发现,是因为之前一直没有进行过日志库的变更,但是随着业务的深入,需要增加一些游戏属性,要对之前的日志库进行变更,这样一来,长时间的维护窗口让业务方和DBA都望而却步,日志优化迫在眉睫。

首先看日志库的情况:

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 线上日志库迁移实例的详细内容,更多关于MySQL 线上日志库迁移的资料请关注我们其它相关文章!

(0)

相关推荐

  • mysql迁移至8.0时的注意事项(小结)

    密码模式 PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] mysql8 之后,默认的密码模式改为 caching_sha2_password,新的模式需要新的驱动,至少现在 pdo / navicat 还没给出,所以我们还是得切换成老的 mysql_native_password 模式. `mysql_native_passwo

  • Mysql的数据库迁移到另一个机器上的方法详解

    1.先找到迁移服务器上的Data文件,我安装的是mysql5.7,默认安装的路径.那么就是在C:\ProgramData\MySQL文件里面,先把隐藏文件打开. 这个Data文件就是你的数据文件:将你要迁移的数据库文件放到这里如下: 然后打开my.ini:找到datadir,然后将你的Data文件路径复制到下面,你要启动哪一个Data文件就用那个文件的地址,只能存在一个.如下: 然后在重启MySQL服务如下: 然后打开数据库连接工具,我这边用的Navicat,你连接迁移数据库,是你迁移之前的密码

  • MySQL数据库迁移快速导出导入大量数据

    数据库迁移是我们经常可遇到的问题,对于少量的数据,迁移基本上不会有什么问题.生产环境中,有以下情况需要做迁移工作: 磁盘空间不够.比如一些老项目,选用的机型并不一定适用于数据库.随着时间的推移,硬盘很有可能出现短缺: 业务出现瓶颈.比如项目中采用单机承担所有的读写业务,业务压力增大,不堪重负.如果 IO 压力在可接受的范围,会采用读写分离方案: 机器出现瓶颈.机器出现瓶颈主要在磁盘 IO 能力.内存.CPU,此时除了针对瓶颈做一些优化以外,选择迁移是不错的方案: 项目改造.某些项目的数据库存在跨

  • 从云数据迁移服务看MySQL大表抽取模式的原理解析

    摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨.一开始爆内存被客户怼,再后来迁移效率低下再被怼.MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 1.1 Java-JDBC通信原理 JDBC与数据库之间的通信是通过socket完,大致流程如下图所示.Mysql Server ->内核Socket Buffer -> 客户端Socket Buffer ->JDBC所在的JV

  • 浅析mysql迁移到clickhouse的5种方法

    数据迁移需要从mysql导入clickhouse, 总结方案如下,包括clickhouse自身支持的三种方式,第三方工具两种. create table engin mysql CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIAL

  • mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、启用事件(ENABLE)、事件重命名及数据库事件迁移操作详解

    本文实例讲述了mysql事件之修改事件(ALTER EVENT).禁用事件(DISABLE).启用事件(ENABLE).事件重命名及数据库事件迁移操作.分享给大家供大家参考,具体如下: 我们要知道,MySQL允许我们更改现有事件的各种属性.如果我们要更改现有事件,可以使用ALTER EVENT语句,如下所示: ALTER EVENT event_name ON SCHEDULE schedule ON COMPLETION [NOT] PRESERVE RENAME TO new_event_n

  • mysql8.0.11数据目录迁移的实现

    mysql的存储目录默认是在/var/lib/mysql/,下面将修改默认存储目录. 本文使用mysql8.0.11版本,与mysql8.0.20版本不同, 8.0.20版本的数据迁移请看另一篇博客 : mysql8.0.20数据迁移 1.先停止mysql服务: service mysql stop 2.创建需要存放的目录位置并赋予权限: mkdir -p /bak/mysql_data chmod 766 /bak/mysql_data 3.转移原有数据,这里使用 cp -a 进行复制(先进入

  • mysql8.0.20数据目录迁移的方法

    mysql的存储目录默认是在/var/lib/mysql/,下面将修改默认存储目录. 本文使用mysql8.0.20版本,与mysql8.0.11版本不同, 8.0.11版本的数据迁移请看另一篇博客:mysql8.0.11数据迁移 1.先停止mysql服务: service mysqld stop 2.创建需要存放的目录位置并赋予权限: mkdir -p /bak/mysql_data chmod 766 /bak/mysql_data 3.转移原有数据,这里使用 cp -a 进行复制(先进入到

  • 如何把本地mysql迁移到服务器数据库

    我们可以使用linux的scp命令(scp无法在windows使用),加上mysql自带的mysqldump,能很快的完成数据库的迁移 将本地的数据库(music_db)导出为sql文件(music_db.sql) mysqldump -uroot -p music_db > music_db.sql 用scp命令将sql文件发送到服务器 scp music_db.sql 远程登录账号@服务器ip:服务器目录/music_db.sql ssh登录服务器 ssh 远程登录账号@远程ip 在服务器上

  • 如何将mysql存储位置迁移到一块新的磁盘上

    1.准备一块新的磁盘,并格式化为与当前根分区相同的文件系统,创建目录并挂载磁盘 ]#fdisk -l #查看磁盘信息 ]#fdisk /dev/sdb #进行分区 ]# df -T #可以查看到根分区的文件系统类型 ]#mkfs.xfs /dev/sdb1 #将新的磁盘分区格式化 ]#mkdir /data ]#mount /dev/sdb1 /data #挂载磁盘 或者写入/etc/fatab文件中,添加一行:/dev/sdb1 /data xfs defaults 0 0 开机自动挂载 ]#

随机推荐