Skip to content

Commit 7f940cd

Browse files
committed
2.19.09.01 添加 mtls-expired-tables 分析长期没有写入的表
1 parent 91a591b commit 7f940cd

File tree

5 files changed

+98
-2
lines changed

5 files changed

+98
-2
lines changed

MANIFEST

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ setup.py
33
bin/mtls-backup
44
bin/mtls-big-files
55
bin/mtls-delete-rows
6+
bin/mtls-expired-tables
67
bin/mtls-file-stat
78
bin/mtls-file-truncate
89
bin/mtls-http

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ homepage:**http://www.sqlpy.com**
2323
- [断开所有的客户端连接 -- mtls-kill-all-connections](#断开所有的客户端连接)
2424
- [统计慢查询文件中的SQL类型与热点表 -- mtls-sql-distribution](#统计慢查询文件中的SQL类型与热点表)
2525
- [表的最晚更新时间统计 -- mtls-file-stat](#表的最晚更新时间统计)
26+
- [找出长时间没有使用过的表 -- mtls-expired-tables](#找出长时间没有使用过的表)
2627
---
2728

2829
## 关于
@@ -45,6 +46,7 @@ homepage:**http://www.sqlpy.com**
4546
|mtls-kill-all-connections | 杀死所有的客户端连接|
4647
|mtls-sql-distribution | 统计慢查询文件中的SQL类型与热点表 |
4748
|mtls-file-stat| 表的最晚更新时间统计|
49+
|mtls-expired-tables|找出长时间没有使用过的表|
4850

4951
---
5052

@@ -834,7 +836,32 @@ homepage:**http://www.sqlpy.com**
834836
--order-by {atime,mtime,ctime}
835837
--baseline BASELIN
836838
```
839+
---
840+
841+
842+
## 找出长时间没有使用过的表
843+
**如果一张表有好几十天都有写入了,这个往往是因为业务已经不再使用这张表,但是忘记了 drop 它,mtls-expired-tables 就是用于找出这种可疑的表**
844+
845+
找出最晚写入时间小于一天前的表
846+
```bash
847+
mtls-expired-tables --not-used-days=1 /database/mysql/data/3306
848+
849+
2019-09-02 14:33:24,289 INFO 分析数据目录(/database/mysql/data/3306)
850+
2019-09-02 14:33:24,289 INFO 准备过虑出最近修改日期(mtime) < 2019-09-01T14:33:24.289396
851+
852+
tempdb.ti
853+
```
854+
也支持直接保存到文件
855+
```bash
856+
mtls-expired-tables --not-used-days=1 /database/mysql/data/3306 > /tmp/expired-tables.log
857+
858+
2019-09-02 14:37:12,880 INFO 分析数据目录(/database/mysql/data/3306)
859+
2019-09-02 14:37:12,880 INFO 准备过虑出最近修改日期(mtime) < 2019-09-01T14:37:12.880759
860+
```
861+
862+
837863
864+
---
838865
839866
840867

bin/mtls-expired-tables

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import re
5+
import sys
6+
import stat
7+
import logging
8+
import argparse
9+
from datetime import datetime
10+
from datetime import timedelta
11+
12+
name = os.path.basename(__file__)
13+
logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s",level=logging.INFO)
14+
15+
def parser_cmd_args() -> argparse.ArgumentParser:
16+
"""
17+
处理命令行参数
18+
"""
19+
parser = argparse.ArgumentParser(name)
20+
parser.add_argument('--not-used-days',type=int,default=30)
21+
parser.add_argument('datadir',type=str,default="/tmp/")
22+
args = parser.parse_args()
23+
return args
24+
25+
26+
def main():
27+
"""
28+
解析出若干天之内都没有访问过的表
29+
"""
30+
args = parser_cmd_args()
31+
baseline = datetime.now() - timedelta(days=args.not_used_days)
32+
datadir = args.datadir
33+
logging.info(f"分析数据目录({datadir})")
34+
logging.info(f"准备过虑出最近修改日期(mtime) < {baseline.isoformat()}")
35+
if not os.path.isdir(datadir):
36+
logging.error(f"dir '{datadir}' not exits or permission denied ")
37+
exit(1)
38+
39+
# 广度优先搜索 datadir
40+
41+
schemas = []
42+
43+
# 解析出存在的数据库
44+
for item in os.listdir(args.datadir):
45+
path = os.path.join(datadir,item)
46+
if os.path.isdir(path):
47+
schemas.append(item)
48+
schemas = [schema for schema in schemas if schema not in ('mysql','information_schema','sys','performance_schema')]
49+
50+
expired_tables = []
51+
# 从数据库的目录解析文件
52+
for schema in schemas:
53+
for item in os.listdir(os.path.join(datadir,schema)):
54+
path = os.path.join(datadir,schema,item)
55+
if os.path.isfile(path) and ( path.endswith('.ibd') or path.endswith('.MYD') ):
56+
# 是 .ibd 文件或 .MYD 文件
57+
*_,atime,mtime,ctime = os.stat(path)
58+
mtime = datetime.fromtimestamp(mtime)
59+
if mtime < baseline:
60+
table,*_ = item.split('.')
61+
expired_tables.append(f"{schema}.{table}")
62+
63+
for table in expired_tables:
64+
print(table)
65+
66+
67+
if __name__ == "__main__":
68+
main()
30.3 KB
Binary file not shown.

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
news_scripts = ['bin/mtls-big-files','bin/mtls-delete-rows','bin/mtls-file-truncate',
77
'bin/mtls-http','bin/mtls-log','bin/mtls-monitor','bin/mtls-backup',
88
'bin/mtls-perf-bench','bin/mtls-kill-all-conections','bin/mtls-sql-distribution',
9-
'bin/mtls-file-stat']
9+
'bin/mtls-file-stat','bin/mtls-expired-tables']
1010

1111
scripts = olds_scripts + news_scripts
1212

1313
setup(name='mysqltools-python',
14-
version='2.19.08.23',
14+
version='2.19.09.01',
1515
scripts=scripts,
1616
packages=['mtls','mtls.kits'],
1717
maintainer='Neeky',

0 commit comments

Comments
 (0)