1.情景再现

某年某月某日 下午安心工作中

运维:在吗?方才工具扫出来线上有一批 Mysql 表不合乎新标准,你看一下!

:好的,我看一下。

心田 OS:什么鬼?还能不能好好撸代码了?

通过一阵排查中,根本都是局部 Mysql 表无主键,很简略嘛,加个数据 id 就完事了!

什么鬼,这个表怎么两千万数据了,印象里不应该有这麽多数据啊,代码复查一把,果然又是祖传遗产的锅,这个删除逻辑齐全没用。

问题来了,两千万的 Mysql 表,以目前线上机器的性能,很放心一把操作就挂了。

接下来就是搜索引擎的天下了,搜寻中...

咦,这个 MysqlTools 是啥?说这是运维工具,但看起来批量删除历史数据也挺好用的。

2.工具介绍

MysqlTools-Python 是一监控项采集、备份、巡检、日志剖析、主动故障解决于一身的工具包。

工具列表
工具名性能阐明
mtls-monitor监控项采集
mtls-backup自动化备份数据库
mtls-delete-rows分批(温和)删除大表中的行
mtls-file-truncate分批(温和)的截断物理文件
mtls-big-files查问出给定目录下的大文件名
mtls-httptcp(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...

  1. 下载安装包

    wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz
  2. 解压安装包到当前目录

    tar -xvf Python-3.9.1.tgz
  3. 装置依赖

    依赖包装置量间接影响到 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 装置报错,可不进行装置。
  4. 新建Python 3目录

    mkdir /data/python3.9
  5. 进入解压安装包目录

    cd Python-3.9.1
  6. 指定 Python 3 装置目录

    ./configure --prefix=/data/python3.9
  7. 编译安卓 Python 3

    make && make install
  8. 增加 Python 3 软链

    ln -s /data/python3.9/bin/python3.9 /usr/bin/python3
  9. 增加 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.connectorModuleNotFoundError: No module named 'mysql'

装置 mysql-connector 即可

pip3 install mysql-connector

4. 工具应用

删除大表数据
  1. 大表数据量,假如 test 为须要删除的大表,删除数据为 id < 19685538 的数据,数据量为 221 万左右。

    mysql> select count(*) from test where id < 19685538;+----------+| count(*) |+----------+|  2209566 |+----------+1 row in set (1.33 sec)
  2. 执行的删除语句

    cat /tmp/delete-test.sqldelete from tempdb.test where id < 19685538;
  3. 通过 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...