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.connector
ModuleNotFoundError: 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.sql
    delete 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...


易羽fxst
158 声望5 粉丝