[MYSQL] mysqldump导出进度查看脚本

2024年 6月 5日 26.6k 0

导读

之前写了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

[MYSQL] mysqldump导出进度查看脚本-1
耗时1.97s

再来看看我们的工具导出的速度

time mysqldump -h127.0.0.1 -P3314 -p123456 --databases ibd2sql | python2 mysqldump_rate.py -o /tmp/t20240605_aa.sql --count 153

[MYSQL] mysqldump导出进度查看脚本-2
好家伙… 1.85秒 居然还快了(应该是误差, 一般情况速度是差不多的…)

比较下数据是否一致
[MYSQL] mysqldump导出进度查看脚本-3
当然是一致的啦

总结

一两次可能存在误差, 所以我多导出几次, 做比较

次数 直接导出的时间 使用脚本查看进度的导出时间
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

整体时间是差不多的.

附源码

下载地址:

  1. https://www.modb.pro/doc/130990
  2. 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)

相关文章

pt-kill工具的使用
pt-ioprofile工具包的使用
数据库管理-第216期 Oracle的高可用-01(20240703)
DBMS_REPAIR EXAMPLE SCRIPT WITH PARTITION
数据库事务的四大特性: ACID 
使用BBED修复损坏的SYSTEM文件头

发布评论