mysql数据库归档方法
用MySQL的过程,经常会遇到一个问题,比如说某张”log”表,用于保存某种记录,随着时间的不断的累积数据,但是只有最新的一段时间的数据是有用的;这个时候会遇到性能和容量的瓶颈,需要将表中的历史数据进行归档。下面来说说几种常见的数据归档方式。

2、、新建存储过程,查询30天的数据并归档进新数据库,然后把30天前的旧数据从旧表里删除

4、备注:第一次执行存储过程的时候因为历史数据过大, 可能发生意外让该次执行没有成功。重新执行时会遇到报错ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,应急解决方案如下:1、执行show full processlist;查看所有MySQL线程。2、执行SELECT * FROM information_schema.INNODB_TRX\G; 查看是否有错误线程,线程id在show full processlist;的结果中状态为sleep。3、kill进程id。另外写存储过程的时候可以控制事务的大小,比如说可以根据时间字段每次归档一天或者更小时间段的数据,这样就不会有大事务的问题,里面还可以加入日志表,每次归档操作的行为都写入日志表,以后查起来也一目了然。
使用工具来进行历史数据归档
1、使用percona-toolkit的pt-archiver工具来进行历史数据归档,支持删除和不删除元数据的选择。pt-archiver使用的场景:1、清理线上过期数据。2、清理过期数据,并把数据归档到本地归档表中,或者远端归档服务器。3、两张表之间的数据不完全相同,希望合并。此时加上–ignore或–replace选项,可以轻松实现。4、导出线上数据,到线下数据作处理。
2、其它作用:1、用于清理过期数据purge$ pt-archiver --source h=10.99.73.9,P=3306,u=mha,p=123456,D=sbtest,t=sbtest \--no-check-charset \--where 'id<50000' \--purge \--limit=2 \--statistics注意:--source后的DSN之间不能空格出现,否则会出错。--where条件的值,有字符串的,要用引号括起来。--limit表示,每组一次删除多少条数据(注意:如果数据比较多时,也可以设置大一些,减少循环次数),最终的清理操作,还是通过Where pK=xx来处理的。

使用union或union all来进行结果合并
1、当历史数据进行归档后,这个时候就有需求了。当需要查看历史数据和现有表数据时有没有什么好的方法呢?其实可以使用union或union all来进行多表结果合并操作。在数据库中,union和union all关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
