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
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
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...