导读
之前写了mysqld导入进度查看脚本. https://www.modb.pro/db/1760934208826593280
但我们有时候也有导出的需求, 导出进度能看就好咯. 但我们不知道导出之后的文件多大(虽然可以预估/计算), 但太麻烦了, 需要的元数据信息太多了. 所以我们就简单点, 统计表的数量来大概得到进度
原理
原理没啥好说的, 就是利用os的管道符来做, 我们读取数据, 判断如果是CREATE TABLE
就表示正在建那张表, 然后表数量计数+1, 数据当然就原封不动的输出到指定的文件.
由于python3的编码问题, 之前那个 .sql 文件拆分脚本也有这种问题. 所以都是使用python2编写的.
用法和演示
用法
用法也比较简单, 就是将mysqldump导出的信息 通过管道符 传递给我们的脚本就行. 比如
mysqldump | python mysqldump_rate.py -o xxxx.sql -c 表数量
例子
我这里就不加那么多导出参数了, 影响观看
我们先正常导出, 坐下对比
time mysqldump -h127.0.0.1 -P3314 -p123456 --databases ibd2sql > /tmp/t20240605_bb.sql
耗时1.97s
再来看看我们的工具导出的速度
time mysqldump -h127.0.0.1 -P3314 -p123456 --databases ibd2sql | python2 mysqldump_rate.py -o /tmp/t20240605_aa.sql --count 153
好家伙… 1.85秒 居然还快了(应该是误差, 一般情况速度是差不多的…)
比较下数据是否一致
当然是一致的啦
总结
一两次可能存在误差, 所以我多导出几次, 做比较
次数 | 直接导出的时间 | 使用脚本查看进度的导出时间 |
---|---|---|
1 | 2.0 | 1.9 |
2 | 2.1 | 2.1 |
3 | 1.9 | 1.8 |
4 | 2.1 | 2.1 |
5 | 2.1 | 2.1 |
整体时间是差不多的.
附源码
下载地址:
- https://www.modb.pro/doc/130990
- https://github.com/ddcw/ddcw/blob/master/python/mysqldump_rate.py
mysqldump_rate.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# write by ddcw @https://github.com/ddcw
# mysqldump 导出进度查看脚本(python2写的, 问就是py3有编码问题)
# 用法: mysqldump | python mysqldump_rate.py --count 2000 --output-file=xxxx.sql
import sys,argparse
import time
def _argparse():
parser = argparse.ArgumentParser(add_help=True, description='mysqldump导出速度查看, 感觉和拆分脚本合并一下也不错,导出的时候就顺便拆分了')
parser.add_argument('--file', '-f' , type=argparse.FileType('r'),default=sys.stdin, dest='FILE', help='mysqldump stream')
parser.add_argument('--output-file','-o','-O',required=True, dest='OUTPUT_FILE',help="导出文件")
parser.add_argument('--count','-c',dest='COUNT',help="表数量",default=999999)
parser.add_argument('--version', action='store_true', dest="VERSION", default=False, help='VERSION')
if parser.parse_args().VERSION:
print('VERSION: v0.1')
sys.exit(1)
return parser.parse_args()
if __name__ == '__main__':
BG_TIME = time.time()
parser = _argparse()
f = parser.FILE # 换成f习惯点... -_-
f2 = open(parser.OUTPUT_FILE,'w')
COUNT = parser.COUNT
CURRENT_TABLE = 0
while True:
data = f.readline()
if data == "": #EOF
break
# 进度判断
if data[:13] == "CREATE TABLE ":
CURRENT_TABLE += 1
msg = "[" + str(CURRENT_TABLE) + "/" + str(COUNT) + "]\t" + data.split()[-2]
print(msg)
f2.write(data)
f2.close()
msg = "\nCOST SECONDS: " + str(round(time.time()-BG_TIME,2)) + " s\n"
print(msg)