史上最好用的Mysql历史数据归档工具
应用场景
在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历史数据归档工具相关推荐
- 吐血总结|史上最全的MySQL学习资料!!
在日常工作与学习中,无论是开发.运维.还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一.在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL. 在刚刚出 ...
- 史上最详细的MySQL操作事例
史上最详细的MySQL操作事例 文章目录 史上最详细的MySQL操作事例 一.数据库的操作 二.数据表的操作 三.数据表的增删查该 四.数据准备 五.条件查询 六.排序 七.聚合函数 八.分组 九.分 ...
- Mysql数据库的简单备份与还原_史上最简单的MySQL数据备份与还原教程
本文主要为大家详细介绍了史上最简单的MySQL数据备份与还原教程第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 数据备份与还原第一篇分享给大家,具体内容如下 基础概念: ...
- 史上最全的 MySQL 高性能优化实战总结
转载自 史上最全的 MySQL 高性能优化实战总结 一.前言 MySQL 对于很多 Linux 从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行 M ...
- mysql交叉查询教程_史上最简单的 MySQL 教程(二十六)「连接查询(上)」
连接查询连接查询:将多张表(大于等于 2 张表)按照某个指定的条件进行数据的拼接,其最终结果记录数可能有变化,但字段数一定会增加. 连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表. 连 ...
- 史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」
史上最简单的 MySQL 教程(十二)「列属性 之 唯一键」 唯一键 唯一键:每张表往往有多个字段需要具有唯一性,数据不能重复,但是在每张表中,只能有一个主键,因此唯一键就是用来解决表中多个字段需要具 ...
- 史上最简单的 MySQL 教程
史上最简单的 MySQL 教程 数据库是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变 ...
- 史上最简单的 MySQL 教程(二)「关系型数据库」
关系型数据库 1 定义 关系型数据库,是一种建立在关系模型(数学模型)上的数据库. 至于关系模型,则是一种所谓建立在关系上的模型,其包含三个方面,分别为: 数据结构:数据存储的形式,二维表(行和列): ...
- 史上最完整的MySQL注入 1
作者:Passerby2 原文来自:史上最完整的MySQL注入 免责声明:本教程仅用于教育目的,以保护您自己的SQL注释代码. 在阅读本教程后,您必须对任何行动承担全部责任. 0x00 ~ 背景 这篇 ...
- 史上最全的MySQL优化手册
MySQL数据库优化大全 (注:文档参考高性能MySQL,SQL手册,官方文档 [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 大 ...
最新文章
- Leetcode236 最近公共祖先-二叉树两次遍历
- NOIP练习赛题目5
- Linux DNS视图脑裂的实例操作(四)
- 数据分析学习笔记—python简单操作EXCEL
- 【解决】U盘装系统(Win7/Win8) 装双系统
- Android轩辕剑之ActionBar之三
- Python 分析Nginx 日志并存入MySQL数据库(单线程)
- Centos-6.3-x86_64 minimal 迷你版安装笔记 - Java篇
- java 文件上传终止_java文件上传
- mt7620a上wifi中继的实现
- 用 WebGL 探索动画和交互技术(一个学习案例)
- 真假马云Deciphering Jack Ma
- 基于JAVA城市湖泊信息管理系统计算机毕业设计源码+系统+lw文档+部署
- 三相交流电源中相电压电流符号表示
- 快递查询工具,一键查物流,派件时效怎么分析
- C#实现HDMI音视频采集和处理
- Scala之sorted排序的使用
- 尚学堂lucene项目精讲视频共17讲
- ROS2 发展历程和开发环境安装
- 隐藏Spring Elements