mysqldump是否支持进度条?


70

有什么方法可以确定mysqldump正在运行的备份中有多少已完成或剩余多少?

Answers:


50

是的,2010年3月27日提交了一个补丁

这个新补丁有一个额外的参数--show-progress-size,默认情况下设置为10,000。因此,当使用--verbose时,每10,000行您将得到一个常规状态输出,该状态输出是转储特定表的行数。

因此,请检查您的版本,并根据需要进行更新并享受。


5
我正在针对Win32(x86)使用mysqldump Ver 10.13 Distrib 5.5.11,它似乎不是用此修补程序构建的。如何确定此修补程序是否已使其成为稳定版本?
布雷克·弗雷森

14
mysqldump-帮助| grep progress#不输出mysqldump --version mysqldump Ver 10.13 Distrib 5.6.10,适用于Linux(x86_64)
Jose Nobile

6
mysqldump --help | grep progress对于,是空白的mysqldump Ver 10.13 Distrib 5.6.22, for osx10.10 (x86_64)
Andrew Ellis

5
以及Ver 10.13 Distrib 5.5.43-37.2, for debian-linux-gnu (x86_64)来自Percona的空白
pawel7318,2015年

3
仍然空白Ver 10.13 Distrib 5.7.19, for Linux (x86_64)
Potherca '17

78

安装和使用pv(它作为CentOS的yum软件包提供)

http://www.ivarch.com/programs/pv.shtml

PV(“管道查看器”)是用于监视通过管道的数据进度的工具。可以将其插入两个过程之间的任何常规管道中,以直观地指示数据通过的速度,花费的时间,完成的时间以及完成之前的估计时间。

假设生成的dumpfile.sql文件的预期大小为100m(100兆字节),则其用法pv如下:

mysqldump <parameters> | pv --progress --size 100m > dumpfile.sql

控制台输出如下所示:

[===> ] 20%

看手册页 man pv以获取更多选项。您可以显示传输速率,已花费的时间或已传输的字节数等等。

如果您不知道转储文件的大小,可以使用一种方法从table_schema中获取MySQL数据库的大小-它不是您的转储文件的大小,但是它可能足够满足您的需要:

SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;

更新资料

以我的经验,当转储整个MySQL服务器时,mysql转储的实际未压缩大小(使用mysqldump --hex-blob选项)大约是从information_schema获得的MySQL数据的实际大小的75%至85%。因此,对于一般解决方案,我可以尝试以下方法:

SIZE_BYTES=$(mysql --skip-column-names <parameters> <<< 'SELECT ROUND(SUM(data_length) * 0.8) AS "size_bytes" FROM information_schema.TABLES;')

mysqldump <parameters> --hex-blob | pv --progress --size $SIZE_BYTES > dumpfile.sql


6
由于索引未出现在转储中,因此index_length应省略。
mtoloo

7
考虑删除该--progress参数。就我而言(版本1.5.3),这意味着显示进度条,但是当我不指定进度条时,会显示更多信息。
Melebius

奇怪的是,在我们的案例中,数据库的实时大小为2.2 GB,而mysql dump为3.2 GB。
约书亚·品特

15

罗素E Glaue答案的完整版本。根据@mtoloo注释,获取pv仅接受整数并计算数据长度而无需索引的方式,取整舍入的db大小:

db_size=$(mysql  -h"$DB_HOST" \
    -u"$DB_USERNAME" \
    -p"$DB_PASSWORD" \
    --silent \
    --skip-column-names \
    -e "SELECT ROUND(SUM(data_length) / 1024 / 1024, 0) \
        FROM information_schema.TABLES \
        WHERE table_schema='$DB_NAME';")

将备份创建为带有时间戳的文件名:

mysqldump -h"$DB_HOST" \
    -u"$DB_USERNAME" \
    -p"$DB_PASSWORD" \
    --single-transaction \
    --order-by-primary \
    --compress \
    $DB_NAME | pv --progress --size "$db_size"m > "$(date +%Y%m%d)"_backup.sql

这是不完全正确的,甚至MySQL中的内部大小甚至都与备份文件中的实际大小完全不同。
Corneliu Maftuleac,

@CorneliuMaftuleac有更好的方法来了解转储进度,我将不胜感激。
pocheptsov

不幸的是,我认为没有任何方法可以提前知道备份的大小。
Corneliu Maftuleac'3

3

我一直在寻找一些类似的工具(PV),但我没有转储数据库。在合并两个带有一些额外计算和公式的大型数据库时,该过程未在TOP或HTOP实用程序中列出,而仅以io%的形式在标头上列出(仅在启动过程中显示在列表中,然后消失)。始终显示高使用率,但是在这种情况下,它在IO端,并且未在实用程序的主体列表中列出,因为其他进程确实在显示。我不得不使用IOSTAT来查看输出数据库的写入进度,但是无法确定是否实际在文件上进行写入(仅显示xfer速率)。我发现了一种旧方法,即使用Filezilla FTP比较源数据库的大小,并且由于Im进行了合并,因此在合并文件时必须显示输出文件。刷新filezilla目录内容时,直到过程成功结束为止,我能够看到增量,两个DB的总和的大小已按预期合并。(实际上,您可以每分钟刷新一次,并手动计算硬件的时间和处理速度)

我去了MySQL目录(在我的情况下,实际数据库存储为文件。./mysql/database/tablename.MYD...(MYSQL中的文件与对应的.FRM文件一起保存,该文件包含表格式数据)以及一个.MYI文件(用作数据库索引)),只需刷新页面即可查看输出合并文件的实际大小,并且确实为我工作。

顺便说一句,TOP和HTOP仅显示MYSQLD做了一些后台处理,但是主力被转移到了IO端进行输出。我的两个合并DB都大约有2000万行,每行大约5个演出,在我的CPU双核上需要花费数小时才能合并,并且任何地方都没有显示任何进度(即使phpmyadmin超时,但过程仍在继续)。尝试使用带有PID编号的PV,但由于Im不进行转储,因此无法传输到管道。无论如何,只要为正在寻找一种有效且简便的方法来检查输出文件创建进度的人写出来即可。它也应适用于转储和还原。请耐心等待,一旦开始,它将完成,那就可以肯定了,除非SQL sintax出错(以前发生在我身上,在以前的尝试中根本没有合并任何行,这花了很长时间,但最后没有任何反应,并且没有工具,

不能完全回答c ++程序上进度栏上的问题,但是您可以借此获取已创建的MYD文件的文件大小,并使用源文件大小除以xfer率来计算进度条,以计算剩余时间。最好的祝福。


顺便说一句,内存越多越好。添加额外的内存并为I / O和缓存缓冲区配置my.cnf可以大大改善合并,xfer,索引和转储。您可以为临时耗时的任务设置临时超级内存服务器。我发现此计算器对设置设置很有用。在MySQL上检查您的版本,因为参数可能有所不同。mysqlcalculator.com
Luis H Cabrejo,

2

在MySQL 5.7+之后,您可以使用mysqlpump。尽管它没有显示进度条,但仍显示如下进度:

Dump progress: 1/1 tables, 0/191 rows
Dump progress: 16/17 tables, 19959/116836 rows
Dump progress: 18/19 tables, 22959/117032 rows
Dump progress: 19/21 tables, 24459/118851 rows
Dump progress: 19/22 tables, 26959/118852 rows
Dump progress: 21/23 tables, 28545/119020 rows
Dump progress: 22/23 tables, 30045/119020 rows
...

1

Russell E Glauepocheptsov的启发,刚刚创建了Bash脚本MySQL / MariaDB Dump Helper

有一个输出示例:

❯ ./bin/db/dump xxx
[2020-08-19 09:54:59+02:00] [INFO] Dumping database 'master' (≈5.4GiB) into ./bin/db/master.sql...
5.40GiB 0:07:56 [11.6MiB/s] [===========================================================================>] 100%
[2020-08-19 10:02:56+02:00] [INFO] Done.
[2020-08-19 10:02:56+02:00] [INFO] Dumping database 'second_db' (≈2.2GiB) into ./bin/db/second_db.sql...
 905MiB 0:01:38 [1.34MiB/s] [==============================>                                              ] 41% ETA 0:02:17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.