当业务运行一段时间后,会出现有些表数据量很大,可能对系统性能产生不良的影响,常见的如订单表、登录log表等,这些数据很有时效性,比如我们一般很少去查上个月的订单,最多也就是报表统计会涉及到。

在我们的数据库中,用户登录表就是这种类型的表,一般而言,表中的数据是不可逆的,只有插入操作没有删除或者修改操作,表示在过去一段时间内完成的事实业务数据。比如登录表表示一段时间内用户的登录信息,登录一次游戏就会在数据库中记录一条数据。

1、对于备份这类表的策略是:

  1. 第一次备份全表的数据导入到备份表中,也就是全备。
  2. 以后每天只将增加的量自动迁移到备份表中,这里通过自增列的值相比较得到增量,如第一次全备导入备份表,这时自增列的最大值为max(idx),通过这个值到从库中查询,只要大于这个值的所有记录形成增量。
  3. 备份完成后,分批删除主库上的数据。

2、下面是具体操作步骤:

  • 第一次全备和恢复
select * from table into outfile "/data/backup/xxxx.txt";  --导出备份数据
load data infile "/data/backup/ xxxx.txt " into table bak_table; --在另外服务器备份表中恢复
  • 脚本程序实现:拉取线上服务器上的增量数据,然后导入本服务器,实现增量备份

1)需要在同一目录下建立三个sql脚本,如a.sql  b.sql  c.sql

   a.sql: 拼接增量备份sql,形成备份语句

use report;
select concat('use report;select * from t_user_session where user_session_idx>',max(user_session_idx),' into outfile "/data/backup/incrementalbackup/t_user_session_ios1.txt";') from t_user_session;

   b.sql:接受a.sql的输出

  c.sql: 负责恢复数据

use report;
load data infile '/data/backup/incrementalbackup/t_user_session_ios1.txt' into table t_user_session_ios1;

2)loadlog1.sh:通过输入a.sql,生成备份语句到b.sql中。用于在线上服务器执行增量备份数据。

#!/bin/bash
/data/mysql/bin/mysql -h 127.0.0.1 -uroot -p'******' -N < /data/backup/scripts/a.sql > /data/backup/scripts/b.sql

3)loadlog2.sh:连接到线上服务器,删除以前备份文件,并通过b.sql进行数据导出,然后删除本地服务器上上次备份的文件。

 #!/bin/bash

 ssh root@1.1.1.1 "/data/backup/scripts/del_bak_file.sh"

 /data/mysql/bin/mysql -uroot -p'*****' -h'1.1.1.1' < /data/backup/scripts/b.sql

 rm -f /data/backup/incrementalbackup/*.txt  

4)loadlog3.sh:将备份服务器上导出的数据文件拷贝到本地服务器

 #!/bin/bash
scp root@10.10.67.114:/data/backup /*.txt /data/backup/

5)loadlog4.sh:加载数据到本地服务器

 #!/bin/bash

 /data/mysql/bin/mysql -h 127.0.0.1 -uroot -p'*******' < /data/backup/scripts/c.sql

6)loadlogall.sh:用于统一执行loadlog1-4,并输入日志。

      #!/bin/bash

      echo '------start-loadlog.sh-----'>> /data/backup/scripts/logs/loadlog.log

      date "+%Y-%m-%d %H:%M:%S" >>  /data/backup/scripts/logs/loadlog.log
/data/backup/scripts/loadlog.sh echo '----end--loadlog.sh-----' >> /data/backup/scripts/logs/loadlog.log /data/backup/scripts/loadlog2.sh echo '----end---loadlog2.sh------' >> /data/backup/scripts/logs/loadlog.log /data/backup/scripts/loadlog3.sh echo '------end-loadlog3.sh------------' >> /data/backup/scripts/logs/loadlog.log /data/backup/scripts/loadlog4.sh echo '-----end-loadlog4.sh----------' >> /data/backup/scripts/logs/loadlog.log

7)将loadlogall.sh加入定时目录,每隔1个小时拉取一次。

crontab -e

--编辑文件      分 时 天 月 周 年 命令

到这里备份就完成了,然后可以清理部分的历史数据了,当然了,这里几个loadlog*.sh显得有些繁琐,这里为了一步一步看得更清楚些,完全可以把这些整合到一个shell脚本里。

未完待续。。。

mysql 历史数据表迁移方案的更多相关文章

  1. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  2. MySQL 大表优化方案(长文)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  3. 详解MySQL大表优化方案( 转)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  4. MySQL 大表优化方案探讨

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  5. MySQL大表优化方案

    转:https://segmentfault.com/a/1190000006158186?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sour ...

  6. MySQL 大表优化方案

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  7. MySQL大表优化方案 Mysql的row_format(fixed与dynamic)

    转自:https://mp.weixin.qq.com/s/VY69wWlrVLjRtKU7ULrYGw 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除 ...

  8. 详解MySQL大表优化方案

    单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时 ...

  9. Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)

    1 试用了MysqlWorkBench的数据迁移功能 以为能实现:建立跟Sqlserver一样的表结构和视图的功能,sqlserver的数据迁移到mysql 实际上发现:即使勾选了表和视图,实际上却只 ...

随机推荐

  1. Android中关于cursor类介绍

    使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...

  2. Github上的PHP开源资源汇总

    依赖管理 ——用于依赖管理的包和框架 Composer/Packagist : 一个包和依赖管理器 Composer Installers:  一个多框架Composer库安装器 Pickle: 可以 ...

  3. php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;假设须要将结果输出到浏览器或打印到显示器,代码中使用br;假设仅仅是在源码中换行.则使用\n或\r\n,感兴趣的朋友能够了解下,也 ...

  4. unity4.6 Beta版 UI控件之Button

    近期需求,须要用到4.6版本号uGui了,所以抽时间来学习学习,就UI控件在Unity工具里创建预设这块来说相比較于NGUI,我认为是没有什么太大的差别的. 比方:Canvas--Camera . T ...

  5. php 生成下载连接

    public function showdownload(){ $file_url=$_GET['url']; $new_name='激活码'; if(!isset($file_url)||trim( ...

  6. 用PreferenceActivity做一个标准的设置界面

    最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用PreferenceActivity,android系统的settings就 ...

  7. vi相关命令

    vi相关命令在行首加#        :% s/^/#        删除#        :% s/#//在行末加#        :% s/$/#        删除        :% s/#$ ...

  8. 解决from lxml import etree 导入的时候,显示etree不存在

    问题: 当安装完lxml之后,发现使用 from lxml import etree  时,etree不可用 原因 :是lxml中没有etree包 解决: 去官网下载对应包:官网地址:http://l ...

  9. python实现身份证识别

    github: 人脸联合语音身份认证:https://github.com/tsstss123/faceUnionVoiceRecognition 身份证识别简易版:https://github.co ...

  10. Lumen开发:如何向 IoC 容器中添加自己定义的类

    版权声明:本文为博主原创文章,未经博主允许不得转载. 先在起始文件bootstrap/app.php加上$app->register(App\Providers\User\UserService ...