应用场景

在mysql数据库运维过程中,总会碰到一些比较棘手的事情,历史数据归档绝对算的上一个。由于一些历史原因,有些业务表当初被设计成单表,而且没有分区,业务跑了一段时间,发现越来越慢了。一排查,发现这些单表的数据太多了,导致查询效率变低,这个时候,需要将一些业务用不到的历史数据归档,减少表的数据量,提升查询效率。

可是要丝滑的将这些历史数据进行归档,可不是一件容易的事情。注意是丝滑,不能停业务,不能对线上业务造成影响。

上面就是历史数据归档的需求,要解决上面的问题,percona-toolkits工具集里有一款工具pt-archiver,可以非常完美的解决你的需求

pt-archiver功能介绍

pt-archiver有以下几个功能
1、按照过滤条件,将线上数据导出成归档文件
2、按照过滤条件,清理线上过期的历史数据
3、按照过滤条件,清理过期数据,并把数据归档到本地归档表,或者远端归档服务器的历史表

pt-archiver使用限制

使用pt-archiver工具,只有一个限制,要归档的表,必须要有主键。
pt-archiver常用参数介绍

--where 'id<1000'    设置操作条件
--limit 10000        每次取1000行数据给pt-archive处理
--txn-size 1000      设置1000行为一个事务提交一次
--progress 5000   每处理5000行输出一次处理信息
--charset=UTF8      指定字符集为UTF8
--no-delete          表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据
--bulk-delete        批量删除source上的旧数据
--bulk-insert        批量插入数据到dest主机 (看dest的general log发现它是通过在dest主机上LOAD DATA LOCAL INFILE插入数据的)
--purge              删除source数据库的相关匹配记录

pt-archiver使用场景模拟

线上库业务模拟

mysql> show create table sbtest1\G;
*************************** 1. row ***************************Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`k` int(10) unsigned NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8 MAX_ROWS=1000000
1 row in set (0.02 sec)mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.29 sec)

历史库模拟

mysql> show create table arch_sbtest1\G;
*************************** 1. row ***************************Table: arch_sbtest1
Create Table: CREATE TABLE `arch_sbtest1` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`k` int(10) unsigned NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `k_1` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.02 sec)

将历史数据导出到文件

将sbtest1历史数据导出到文件,并不删除原表记录,不加–no-delete,默认删除原表记录

[mysql@localhost backup]$ pt-archiver --source A=utf8,u=tony,p=tony,h=192.168.17.128,P=3308,D=sbtest,t=sbtest1 --file=/home/mysql/backup/%Y-%m-%d-%D.%t --where="id <10000" --no-delete --progress=100 --limit 100 --statisticsTIME                ELAPSED   COUNT
2020-09-01T05:28:10       0       0
2020-09-01T05:28:10       0     100
2020-09-01T05:28:10       0     200
2020-09-01T05:28:10       0     300
2020-09-01T05:28:10       0     400
2020-09-01T05:28:10       0     500
2020-09-01T05:28:10       0     600.......
2020-09-01T05:28:13       2    9800
2020-09-01T05:28:13       2    9900
2020-09-01T05:28:13       2    9999
Started at 2020-09-01T05:28:10, ended at 2020-09-01T05:28:13
Source: A=utf8,D=sbtest,P=3308,h=192.168.17.128,p=...,t=sbtest1,u=tony
SELECT 9999
INSERT 0
DELETE 0
Action          Count       Time        Pct
commit          10000     1.1150      38.55
select            101     0.6442      22.27
print_file       9999     0.1509       5.22
other               0     0.9827      33.97

–limit 100,从上面的结果可以看出,每次从源库取出的数据是100条。

删除指定条件记录

按照过滤条件,删除过期的历史数据,在这里–bulk-delete,代表用批量删除的方法

[mysql@localhost backup]$ pt-archiver --source A=utf8mb4,u=tony,p=tony,h=192.168.17.128,P=3308,D=sbtest,t=sbtest1 --purge --where="id<=10000" --progress=500 --limit 1000 --txn-size 500 --bulk-delete --statistics
TIME                ELAPSED   COUNT
2020-09-01T05:33:24       0       0
2020-09-01T05:33:24       0     500
2020-09-01T05:33:24       0    1000
2020-09-01T05:33:24       0    1500
2020-09-01T05:33:24       0    2000
2020-09-01T05:33:24       0    2500
2020-09-01T05:33:24       0    3000
2020-09-01T05:33:24       0    3500
2020-09-01T05:33:24       0    4000
2020-09-01T05:33:24       0    4500
2020-09-01T05:33:24       0    5000
2020-09-01T05:33:24       0    5500
2020-09-01T05:33:24       0    6000
2020-09-01T05:33:24       0    6500
2020-09-01T05:33:25       0    7000
2020-09-01T05:33:25       0    7500
2020-09-01T05:33:25       1    8000
2020-09-01T05:33:25       1    8500
2020-09-01T05:33:25       1    9000
2020-09-01T05:33:25       1    9500
2020-09-01T05:33:25       1   10000
2020-09-01T05:33:25       1   10000
Started at 2020-09-01T05:33:24, ended at 2020-09-01T05:33:25
Source: A=utf8mb4,D=sbtest,P=3308,h=192.168.17.128,p=...,t=sbtest1,u=tony
SELECT 10000
INSERT 0
DELETE 10000
Action             Count       Time        Pct
bulk_deleting         10     0.8056      60.49
commit                21     0.1089       8.18
select                11     0.0567       4.26
other                  0     0.3606      27.08

将历史数据迁移到远程数据库

将历史数据迁移到远程数据库,必须在目标数据库创建好表

[mysql@localhost backup]$ pt-archiver --source A=utf8,u=tony,p=tony,h=192.168.17.128,P=3308,D=sbtest,t=sbtest1 --dest A=utf8,u=root,p=root,h=172.17.0.3,P=3306,D=testdb,t=arch_sbtest1 --where="id<20000" --progress=500 --limit 1000 --txn-size 500 --bulk-delete --bulk-insert --statistics# A software update is available:
TIME                ELAPSED   COUNT
2020-09-01T05:37:51       0       0
2020-09-01T05:37:51       0     500
2020-09-01T05:37:51       0    1000
2020-09-01T05:37:51       0    1500
2020-09-01T05:37:51       0    2000
2020-09-01T05:37:52       0    2500
2020-09-01T05:37:52       0    3000
2020-09-01T05:37:52       0    3500
2020-09-01T05:37:52       0    4000
2020-09-01T05:37:52       0    4500
2020-09-01T05:37:52       0    5000
2020-09-01T05:37:52       1    5500
2020-09-01T05:37:52       1    6000
2020-09-01T05:37:52       1    6500
2020-09-01T05:37:52       1    7000
2020-09-01T05:37:53       1    7500
2020-09-01T05:37:53       1    8000
2020-09-01T05:37:53       1    8500
2020-09-01T05:37:53       1    9000
2020-09-01T05:37:53       1    9500
2020-09-01T05:37:53       1    9999
Started at 2020-09-01T05:37:51, ended at 2020-09-01T05:37:53
Source: A=utf8,D=sbtest,P=3308,h=192.168.17.128,p=...,t=sbtest1,u=tony
Dest:   A=utf8,D=testdb,P=3306,h=172.17.0.3,p=...,t=arch_sbtest1,u=root
SELECT 9999
INSERT 9999
DELETE 9999
Action              Count       Time        Pct
bulk_inserting         10     0.5509      28.50
bulk_deleting          10     0.2252      11.65
commit                 40     0.1490       7.71
select                 11     0.0957       4.95
print_bulkfile       9999    -0.0099      -0.51
other                   0     0.9222      47.70

在历史库中查询归档表

mysql> select count(*) from arch_sbtest1;
+----------+
| count(*) |
+----------+
|     9999 |
+----------+
1 row in set (0.01 sec)

可以看到已经归档到历史表了。

史上最好用的Mysql历史数据归档工具相关推荐

  1. 吐血总结|史上最全的MySQL学习资料!!

    在日常工作与学习中,无论是开发.运维.还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一.在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL. 在刚刚出 ...

  2. 史上最详细的MySQL操作事例

    史上最详细的MySQL操作事例 文章目录 史上最详细的MySQL操作事例 一.数据库的操作 二.数据表的操作 三.数据表的增删查该 四.数据准备 五.条件查询 六.排序 七.聚合函数 八.分组 九.分 ...

  3. Mysql数据库的简单备份与还原_史上最简单的MySQL数据备份与还原教程

    本文主要为大家详细介绍了史上最简单的MySQL数据备份与还原教程第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 数据备份与还原第一篇分享给大家,具体内容如下 基础概念: ...

  4. 史上最全的 MySQL 高性能优化实战总结

    转载自   史上最全的 MySQL 高性能优化实战总结 一.前言 MySQL 对于很多 Linux 从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行 M ...

  5. mysql交叉查询教程_史上最简单的 MySQL 教程(二十六)「连接查询(上)」

    连接查询连接查询:将多张表(大于等于 2 张表)按照某个指定的条件进行数据的拼接,其最终结果记录数可能有变化,但字段数一定会增加. 连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表. 连 ...

  6. 史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」

    史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」 唯一键 唯一键:每张表往往有多个字段需要具有唯一性,数据不能重复,但是在每张表中,只能有一个主键,因此唯一键就是用来解决表中多个字段需要具 ...

  7. 史上最简单的 MySQL 教程

    史上最简单的 MySQL 教程 数据库是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变 ...

  8. 史上最简单的 MySQL 教程(二)「关系型数据库」

    关系型数据库 1 定义 关系型数据库,是一种建立在关系模型(数学模型)上的数据库. 至于关系模型,则是一种所谓建立在关系上的模型,其包含三个方面,分别为: 数据结构:数据存储的形式,二维表(行和列): ...

  9. 史上最完整的MySQL注入 1

    作者:Passerby2 原文来自:史上最完整的MySQL注入 免责声明:本教程仅用于教育目的,以保护您自己的SQL注释代码. 在阅读本教程后,您必须对任何行动承担全部责任. 0x00 ~ 背景 这篇 ...

  10. 史上最全的MySQL优化手册

    MySQL数据库优化大全 (注:文档参考高性能MySQL,SQL手册,官方文档 [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 大 ...

最新文章

  1. Leetcode236 最近公共祖先-二叉树两次遍历
  2. NOIP练习赛题目5
  3. Linux DNS视图脑裂的实例操作(四)
  4. 数据分析学习笔记—python简单操作EXCEL
  5. 【解决】U盘装系统(Win7/Win8) 装双系统
  6. Android轩辕剑之ActionBar之三
  7. Python 分析Nginx 日志并存入MySQL数据库(单线程)
  8. Centos-6.3-x86_64 minimal 迷你版安装笔记 - Java篇
  9. java 文件上传终止_java文件上传
  10. mt7620a上wifi中继的实现
  11. 用 WebGL 探索动画和交互技术(一个学习案例)
  12. 真假马云Deciphering Jack Ma
  13. 基于JAVA城市湖泊信息管理系统计算机毕业设计源码+系统+lw文档+部署
  14. 三相交流电源中相电压电流符号表示
  15. 快递查询工具,一键查物流,派件时效怎么分析
  16. C#实现HDMI音视频采集和处理
  17. Scala之sorted排序的使用
  18. 尚学堂lucene项目精讲视频共17讲
  19. ROS2 发展历程和开发环境安装
  20. 隐藏Spring Elements

热门文章

  1. SDRAM、DDR2、DDR3内存频率:核心频率,工作频率,等效频率
  2. vue 实现高德地图搜索地址获取经纬度
  3. git简介以及windows下的git安装配置gitgub推送
  4. Word怎么制作流程图
  5. 推荐10本大数据领域必读的经典好书(火速收藏)
  6. word批量调整图片大小:
  7. react中使用sass报错SassError: Expected newline.
  8. 数据库删除数据 truncate 与 delete
  9. linux查询本机IP地址(可用于SSH访问)
  10. 建筑CAD基础设计【2】