前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[MYSQL] mysqldump导出进度查看脚本

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

原创
作者头像
大大刺猬
发布2024-06-05 17:08:52
1590
发布2024-06-05 17:08:52
举报
文章被收录于专栏:大大刺猬大大刺猬

导读

之前写了mysqld导入进度查看脚本. https://www.modb.pro/db/1760934208826593280

但我们有时候也有导出的需求, 导出进度能看就好咯. 但我们不知道导出之后的文件多大(虽然可以预估/计算), 但太麻烦了, 需要的元数据信息太多了. 所以我们就简单点, 统计表的数量来大概得到进度

原理

原理没啥好说的, 就是利用os的管道符来做, 我们读取数据, 判断如果是CREATE TABLE就表示正在建那张表, 然后表数量计数+1, 数据当然就原封不动的输出到指定的文件.

由于python3的编码问题, 之前那个 .sql 文件拆分脚本也有这种问题. 所以都是使用python2编写的.

用法和演示

用法

用法也比较简单, 就是将mysqldump导出的信息 通过管道符 传递给我们的脚本就行. 比如

代码语言:shell
复制
mysqldump | python mysqldump_rate.py -o xxxx.sql -c 表数量

例子

我这里就不加那么多导出参数了, 影响观看

我们先正常导出, 坐下对比

代码语言:shell
复制
time mysqldump -h127.0.0.1 -P3314 -p123456 --databases ibd2sql > /tmp/t20240605_bb.sql

耗时1.97s

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

代码语言:shell
复制
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

整体时间是差不多的.

附源码

下载地址:

  1. https://www.modb.pro/doc/130990
  2. https://github.com/ddcw/ddcw/blob/master/python/mysqldump_rate.py

mysqldump_rate.py

代码语言:python
代码运行次数:0
复制
#!/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)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 原理
  • 用法和演示
    • 用法
      • 例子
      • 总结
      • 附源码
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档