关于mysql:MysqlTools温和删除-Mysql-大表部分数据

34次阅读

共计 3240 个字符,预计需要花费 9 分钟才能阅读完成。

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…

  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…

正文完
 0