目录

1. 背景

12月5日开始,某线上实例每天报警从库延迟。

经排查发现,延迟时段的 tps 并不高,只是对 matomo_log_link_visit_action 表有 1k多的 DML,但该表文件大小已达 60G,远超单表最大 10G 的规范要求。

该实例为点击流数据库,该表记录的主要记录用户的链接访问行为。

经过与开发负责人沟通,需要对该表进行归档历史数据操作,并保留1个月内的数据。

2. 操作步骤

2.1. 确认数据归档条件,此次操作开发按照非主键列 server_time 按时间进行删除并保存,需要转化为主键列条件。

  1. show create table matomo_log_link_visit_action\G
  2. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-04-30 23:59:59';
  3. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-05-31 23:59:59';
  4. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-06-30 23:59:59';
  5. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-07-31 23:59:59';
  6. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-08-31 23:59:59';
  7. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-09-30 23:59:59';
  8. select max(idlink_va) from matomo_log_link_visit_action where server_time='2018-10-31 23:59:59';

2.2. 由于历史表文件较大,按月归档、删除,便于操作及后期查询数据,在目标库中,每个月份创建一张 duplicate 表。

  1. create table visit_action_4 like matomo_log_link_visit_action;
  2. create table visit_action_5 like matomo_log_link_visit_action;
  3. create table visit_action_6 like matomo_log_link_visit_action;
  4. create table visit_action_7 like matomo_log_link_visit_action;
  5. create table visit_action_8 like matomo_log_link_visit_action;
  6. create table visit_action_9 like matomo_log_link_visit_action;
  7. create table visit_action_10 like matomo_log_link_visit_action;

2.3. 参照 pt-archiver 工具参数及使用示例,预先编辑好归档命令(参照“5. 场景示例” 中的 “A.”)。

  1. # 4月归档
  2. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_4 --no-version-check --where "idlink_va <= 4383363" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_4.log &
  3. # 5月归档
  4. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_5 --no-version-check --where "idlink_va <= 26473975 and idlink_va > 4383363" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_5.log &
  5. # 6月归档
  6. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_6 --no-version-check --where "idlink_va <= 51504119 and idlink_va > 26473975" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_6.log &
  7. # 7月归档
  8. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_7 --no-version-check --where "idlink_va <= 75811899 and idlink_va > 51504119" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_7.log &
  9. # 8月归档
  10. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_8 --no-version-check --where "idlink_va <= 121711398 and idlink_va > 75811899" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_8.log &
  11. # 9月归档
  12. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_9 --no-version-check --where "idlink_va <= 150953368 and idlink_va > 121711398" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_9.log &
  13. # 10月归档
  14. pt-archiver --source h=127.0.0.1,P=3306,u=superadmin,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_10 --no-version-check --where "idlink_va <= 206555065 and idlink_va > 150953368" --statistics --no-delete --bulk-insert --progress 5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_10.log &

2.4. 执行归档命令按月归档历史数据。

2.5. 归档完毕后,使用 where 条件去源数据,对比原表与归档表数据行是否一致。

  1. --4
  2. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  3. select count(*) from visit_action_4 where idlink_va <= 4383363;
  4. --5
  5. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  6. select count(*) from visit_action_4 where idlink_va <= 4383363;
  7. --6
  8. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  9. select count(*) from visit_action_4 where idlink_va <= 4383363;
  10. --7
  11. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  12. select count(*) from visit_action_4 where idlink_va <= 4383363;
  13. --8
  14. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  15. select count(*) from visit_action_4 where idlink_va <= 4383363;
  16. --9
  17. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  18. select count(*) from visit_action_4 where idlink_va <= 4383363;
  19. --10
  20. select count(*) from matomo_log_link_visit_action where idlink_va <= 4383363;
  21. select count(*) from visit_action_4 where idlink_va <= 4383363;

2.6. 确认归档数据一致后,对归档表备份导出。

  1. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_4 > /data/backup/xxx_history/xxx--visit_action_4.sql.bak
  2. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_5 > /data/backup/xxx_history/xxx--visit_action_5.sql.bak
  3. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_6 > /data/backup/xxx_history/xxx--visit_action_6.sql.bak
  4. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_7 > /data/backup/xxx_history/xxx--visit_action_7.sql.bak
  5. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_8 > /data/backup/xxx_history/xxx--visit_action_8.sql.bak
  6. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_9 > /data/backup/xxx_history/xxx--visit_action_9.sql.bak
  7. mysqldump -S xxx/mysql.sock --single-transaction --master-data=2 --set-gtid-purged=OFF --no-create-info xxx visit_action_10 > /data/backup/xxx_history/xxx--visit_action_10.sql.bak

2.7. 参照 pt-archiver 工具参数及使用示例,预先编辑好删除历史数据命令(参照“5. 场景示例” 中的 “B.”)。

  1. pt-archiver --source h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset UTF8 --no-version-check --where="idlink_va <= 206555065" --progress=5000 --limit=500 --purge --bulk-delete --commit-each --sleep=1 --statistics >> xxx--matomo_log_link_visit_action--archive_10.log &

2.8. 或者使用脚本进行删除操作。

  1. #!/bin/bash
  2. USER=xxx
  3. PWD="xxx"
  4. SOCK=xxx/mysql.sock
  5. DB=xxx
  6. TB=matomo_log_link_visit_action
  7. MAX_ID=206555065
  8. NUM=1000
  9. PK=idlink_va
  10. MY_CLI="/usr/local/bin/mysql -u${USER} -p${PWD} -S${SOCK} ${DB}"
  11. for ((i=i;i<206556;i++));do
  12. ${MY_CLI} -e "delete from ${TB} where ${PK} <= ${MAX_ID} limit ${NUM};"
  13. sleep 0.2;
  14. echo $i;
  15. done

2.9. 备份完成后,执行删除历史数据操作。

3. 工具介绍

  • 因有归档数据的要求,故选用 pt-archiver 工具进行操作。

  • pt-archiver 是 percona toolkit 工具集中的工具,主要用于数据删除、数据归档、数据迁移等场景。

4. 工具参数

4.1. 连接数据库的参数

varable Meaning
--source=d DSN specifying the table to archive from (required)
--dest=d DSN specifying the table to archive to
-h , --host=s Connect to host
-P , --port=i Port number to use for connection
-S , --socket=s Socket file to use for connection
-u , --user=s User for login if not current user
-p , --password=s Password to use when connecting
-D , --database=s Database that contains the table
t Table to archive from/to
-A , --charset=s Default character set
F Only read default options from the given file
L Explicitly enable LOAD DATA LOCAL INFILE
a Database to USE when executing queries
b If true, disable binlog with SQL_LOG_BIN
i Index to use
m Plugin module name

4.2. 常用参数

variable meaning example
--[no]version-check Check for the latest version of Percona Toolkit, MySQL, and other programs (default yes) WHERE clause to limit which rows to archive (required) --no-version-check目前为止,发现部分pt工具对阿里云RDS操作必须加这个参数
--where=s WHERE clause to limit which rows to archive (required) 设置操作条件
--statistics Collect and print timing statistics 输出执行过程及最后的操作统计
--no-delete Do not delete archived rows 不删除已经归档的 rows
--bulk-insert Insert each chunk with LOAD DATA INFILE (implies --bulk-delete --commit-each) 批量插入数据到dest主机(看 dest 的 general log 发现它是通过在dest主机上 LOAD DATA LOCAL INFILE 插入数据的)
--progress=i Print progress information every X rows --progress=5000 每处理 5000 rows 输出一次处理信息
--limit=i Number of rows to fetch and archive per statement (default 1) --limit=500每次取 500 rows 数据给 pt-archiver 处理
--txn-size=i Number of rows per transaction (default 1) --txn-size=100 设置 100 rows 为一个事务提交一次
--sleep=i Sleep time between fetches --sleep=1每次归档了 limit 个行记录后的休眠1秒(单位为秒)
--bulk-delete Delete each chunk with a single statement (implies --commit-each) 批量删除 source 上的旧数据(例如每次 1000 rows 的批量删除操作)
--replace Causes INSERTs into --dest to be written as REPLACE 将insert into 语句改成 replace 写入到 dest 库
--file=s File to archive to, with DATE_FORMAT()-like formatting --file '/root/test.txt' 导出文件的路径
--purge Purge instead of archiving; allows omitting --file 删除 source 数据库的相关匹配记录
--header Print column header at top of --file 输入列名称到首行(和--file一起使用)
--[no]check-columns Ensure --source and --dest have same columns (default yes) 检验 dest 和 source 的表结构是否一致,不一致自动拒绝执行(不加这个参数也行。默认就是执行检查的)
--chekc-interval=m If --check-slave-lag is given, this defines how long the tool pauses each time it discovers that a slave is lagging (default 1s). Optional suffix s=seconds, m=minutes, h=hours, d=days; if no suffix, s is used. 默认1s检查一次
--local Do not write OPTIMIZE or ANALYZE queries to binlog 不把 optimize 或 analyze 操作写入到 binlog 里面(防止造成主从延迟巨大)
--retries Number of retries per timeout or deadlock (default 1) 超时或者出现死锁的话,pt-archiver 进行重试的间隔(默认1s)
--analyze=s Run ANALYZE TABLE afterwards on --source and/or --dest 操作结束后,优化表空间

5、场景示例

A. 复制数据到其他(实例、库、表),且不删除source的数据(指定字符集):

  1. pt-archiver --source h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=matomo_log_link_visit_action --charset 'UTF8' \
  2. --dest h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=visit_action_4 --no-version-check \
  3. --where="idlink_va <= 4383363" \
  4. --statistics --no-delete --bulk-insert --progress=5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_4.log &

B. 删除旧数据:

  1. pt-archiver --source h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=matomo_log_link_visit_action \
  2. --charset 'UTF8' --no-version-check --where "idlink_va <= 4383363" \
  3. --progress=5000 --limit=500 --purge --bulk-delete --commit-each --sleep=1 --statistics >> xxx--matomo_log_link_visit_action--archive_4.log &

C. 导出数据到文件

  1. pt-archiver --source h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=matomo_log_link_visit_action \
  2. --where "idlink_va <= 4383363" \
  3. --file xxx/2018-04.txt \
  4. --statistics --no-delete --bulk-insert --progress=5000 --limit=500 --txn-size=100 >> xxx--matomo_log_link_visit_action--visit_action_4.log &

D. 导出数据到文件并删除数据库的相关行:

  1. pt-archiver --source h=127.0.0.1,P=3306,u=xxx,p='xxx',D=xxx,t=matomo_log_link_visit_action \
  2. --charset 'UTF8' --no-version-check --where "idlink_va <= 4383363" \
  3. --file xxx/2018-04.txt \
  4. --progress=5000 --limit=500 --purge --bulk-delete --commit-each --sleep=1 --statistics >> xxx--matomo_log_link_visit_action--archive_4.log &

pt-archiver 归档历史数据及参数详解的更多相关文章

  1. apache url rewrite 的RewriteRule参数详解

    apache url rewrite 的RewriteRule参数详解 我们经常会在apache那边对一些url进行一些重写操作,那么就会涉及到很多的重写策略的选择,比如重定向的方式,参数的处理,规则 ...

  2. rsync常用参数详解

    rsync常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux中,一切皆是文件,包括你的终端,硬件设备信息,目录,内核文件等等.所以工作中我们难免会遇到拷贝文件 ...

  3. FAL_CLIENT和FAL_SERVER参数详解

    FAL_CLIENT和FAL_SERVER参数详解 转载:http://openwares.net/database/fal_client_fal_server.html FAL_CLIENT和FAL ...

  4. 【DataGuard】部署Data Guard相关参数详解 (转载)

    原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler    有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Gua ...

  5. rsync的介绍及参数详解,配置步骤,工作模式介绍

    rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...

  6. Oracle 11g Dataguard参数详解

    https://www.jb51.net/article/52269.htm注:本文译自<Oracle Data Guard 11g Handbook> Page 78 – Page 88 ...

  7. rsync参数详解

    Rsync的参数详细解释 -v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关,强制对文件传输进行校验-a, --archive 归档 ...

  8. Nginx主配置参数详解,Nginx配置网站

    1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...

  9. iptables参数详解

    iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...

随机推荐

  1. webpack的loader的原理和实现

    想要实现一个loader,需要首先了解loader的基本原理和用法. 1. 使用 loader是处理模块的解析器. module: { rules: [ { test: /\.css$/, use: ...

  2. Java Web 项目的文件/文件夹上传下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  3. let

    let a=2+2 #+ - * / % ** 都支持 支持类C的计算方式 let i++ let i-- let i+=10 let i-=10 let i*=10 let i/=10 let i% ...

  4. 洛谷 P1432 倒水问题

    目录 题目 思路 \(Code\) 题目 戳 思路 \(bfs\) 第一遍提交\(50\),第二遍就\(100\)了,qwq \(Code\) #include<iostream> #in ...

  5. uiautomator2使用教程

    一.要求 python 3.6+ android 4.4+   二.介绍 uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库.其底层基于Google uiaut ...

  6. 通过phoenix导入数据到hbase出错记录

    解决方法1 错误如下 -- ::, [hconnection-0x7b9e01aa-shared--pool11069-t114734] WARN org.apache.hadoop.hbase.ip ...

  7. el-table里面的列需要对比两个返回参数

    需求是这样的--- 已发布时间超过30分钟,显示黄色,超过一个钟显示红色 现在后台返回的时间的格式是2018-10-22 11:23:23的格式 做法是: 第一步: 先将后台返回的格式转化为时间戳,然 ...

  8. IDEA中设置自动build-改动代码,不用重启工程,刷新页面即可

    1.CTRL + SHIFT + A --> 查找Registry --> 找到并勾选compiler.automake.allow.when.app.running   2. FILE ...

  9. pycharm 当有多个.py文件在开发环境中时,如何操作可以保证运行当前面对自己的文件?

    Alt+shift+F10选择自己的py文件,执行就可以了.

  10. Python模块安装方法

    安装Python模块 电子邮件 distutils-sig @ python .组织 作为一个受欢迎的开源开发项目,Python具有活跃的贡献者和用户支持社区,并且根据开放源代码许可条款,其软件可供其 ...