1. 情景再现
某年某月某日 下午安心工作中
运维:在吗?方才工具扫出来线上有一批 Mysql 表不合乎新标准,你看一下!
我:好的,我看一下。
心田 OS:什么鬼?还能不能好好撸代码了?
通过一阵排查中,根本都是局部 Mysql 表无主键,很简略嘛,加个数据 id 就完事了!
什么鬼,这个表怎么 两千万 数据了,印象里不应该有这麽多数据啊,代码复查一把,果然又是祖传遗产的锅,这个删除逻辑齐全没用。
问题来了,两千万的 Mysql 表,以目前线上机器的性能,很放心一把操作就挂了。
接下来就是搜索引擎的天下了,搜寻中 …
咦,这个 MysqlTools 是啥?说这是运维工具,但看起来批量删除历史数据也挺好用的。
2. 工具介绍
MysqlTools-Python 是一监控项采集、备份、巡检、日志剖析、主动故障解决于一身的工具包。
工具列表
工具名 | 性能阐明 |
---|---|
mtls-monitor | 监控项采集 |
mtls-backup | 自动化备份数据库 |
mtls-delete-rows | 分批 (温和) 删除大表中的行 |
mtls-file-truncate | 分批 (温和) 的截断物理文件 |
mtls-big-files | 查问出给定目录下的大文件名 |
mtls-http | tcp(http)端口连通性测试 |
mtls-log | 慢查问日志切片 |
mtls-perf-bench | 数据库跑分工具(开发中) |
mtls-kill-all-connections | 杀死所有的客户端连贯 |
mtls-sql-distribution | 统计慢查问文件中的 SQL 类型与热点表 |
mtls-file-stat | 表的最晚更新工夫统计 |
mtls-expired-tables | 找出长时间没有应用过的表 |
3.Linux 环境装置步骤
3.1 环境依赖
MySqlTools-Python 工具反对 Python-3.x 下的所有版本,可间接通过 pip 装置。
3.2 Python 装置
在 Linux 零碎中,零碎自带的 Python 环境根本是 2.x 版本,须要重新安装 Python 3 环境。
留神:无非凡起因不删除零碎自带的 Python 2 环境,防止依赖 Python 2 的工具呈现问题。
Python 各版本下载地址:https://www.python.org/ftp/py…
-
下载安装包
wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz
-
解压安装包到当前目录
tar -xvf Python-3.9.1.tgz
-
装置依赖
依赖包装置量间接影响到 Python 解释器所反对的性能,以下依赖包根本可笼罩性能反对。
yum -y install gcc gcc-c++ libffi libyaml-devel libffi-devel zlib zlib-devel openssl shadow-utils net-tools openssl-devel libyaml sqlite-devel libxml2 libxslt-devel libxml2-devel wget vim mysql-devel
留神:如果因为环境问题 mysql-devel 装置报错,可不进行装置。
-
新建 Python 3 目录
mkdir /data/python3.9
-
进入解压安装包目录
cd Python-3.9.1
-
指定 Python 3 装置目录
./configure --prefix=/data/python3.9
-
编译安卓 Python 3
make && make install
-
增加 Python 3 软链
ln -s /data/python3.9/bin/python3.9 /usr/bin/python3
-
增加 pip3 软链
ln -s /data/python3.9/bin/pip3 /usr/bin/pip3
3.3 MysqlTools-Python 装置
装置命令:
pip3 install mysqltools-python
验证(mtlsmonitor 查看 MySQL 启动后执行 Select 语句量):
/data/python3.9/bin/mtls-monitor --host=127.0.0.1 --port=3306 --user=monitor --password=yiyufxst ComSelect
失常返回:
248433539
可能遇到的报错:
Traceback (most recent call last):
File "/data/python3.9/bin/mtls-monitor", line 4, in <module>
from mtls import base,statu,variable,mgr,replication,binlog,innodb_statu
File "/data/python3.9/lib/python3.9/site-packages/mtls/base.py", line 11, in <module>
import mysql.connector
ModuleNotFoundError: No module named 'mysql'
装置 mysql-connector
即可
pip3 install mysql-connector
4. 工具应用
删除大表数据
-
大表数据量,假如 test 为须要删除的大表,删除数据为
id < 19685538
的数据,数据量为 221 万左右。mysql> select count(*) from test where id < 19685538; +----------+ | count(*) | +----------+ | 2209566 | +----------+ 1 row in set (1.33 sec)
-
执行的删除语句
cat /tmp/delete-test.sql delete from tempdb.test where id < 19685538;
-
通过 mlts-delete-rows 实现分批执行的操作
mtlsdeleterows --host=127.0.0.1 --port=3306 --user=root --password=yiyufxst --rows=1000 --sql-file=/tmp/dlt.sql exec 2021-01-21 20:43:35,413 INFO 1000 row(s) affected by delete from tempdb.test where id < 19685538 limit 1000; 2021-01-21 20:43:36,422 INFO 1000 row(s) affected by delete from tempdb.test where id < 19685538 limit 1000; 2021-01-21 20:43:37,430 INFO 1000 row(s) affected by delete from tempdb.test where id < 19685538 limit 1000; ... 2021-01-21 20:51:53,561 INFO 1000 row(s) affected by delete from tempdb.test where id < 19685538 limit 1000; 2021-01-21 20:51:54,569 INFO 1000 row(s) affected by delete from tempdb.test where id < 19685538 limit 1000; 2021-01-21 20:51:55,576 INFO 566 row(s) affected by delete from tempdb.test where id < 19685538 limit 1000; 2021-01-21 20:51:56,578 INFO compelete
致谢
特别感谢 MysqlTools-Python 的作者 蒋乐兴 大佬,因为测试环境常常装了杂七杂八的货色,理论装置过程中遇到了不少问题,搜寻无解决的我,硬着头皮加上了大佬的微信,问了很多 Python 装置的根底问题,感激大佬不厌其烦的解说,最初终于胜利。
参考链接
Python 3 装置:https://www.sqlpy.com/blogs/c…
mysqltools-python:https://github.com/Neeky/mysq…