题 有没有办法让mysqldump进度条显示用户的备份状态?


我想知道是否有任何方法可以确定,当mysqldump正在运行时,有多少备份已完成或剩余多少?

我想为我的用户提供一个控制台进度条,向他们展示他们的备份状态......

顺便说一下,我想用标准的c ++编写上面的程序,平台就是linux。 谢谢!


53
2018-01-31 15:55


起源




答案:


是的,a 补丁已经提交 2010年3月27日:

这个新补丁有一个额外的参数--show-progress-size by   default设置为10,000。因此,当使用--verbose时,每10,000个   你将获得一行的常规状态输出行数   特定表被倾倒。

所以检查你的版本,如果需要更新并享受。


40
2018-01-31 16:44



我正在使用mysqldump Ver 10.13 Distrib 5.5.11,用于Win32(x86),它似乎没有使用此补丁构建。如何确定此补丁是否已成为稳定版本? - Breck Fresen
mysqldump --help | grep progress#not output mysqldump --version mysqldump Ver 10.13 Distrib 5.6.10,for Linux(x86_64) - Jose Nobile
mysqldump --help | grep progress 是空白的 mysqldump Ver 10.13 Distrib 5.6.22, for osx10.10 (x86_64)。 - Andrew Ellis
空白以及 Ver 10.13 Distrib 5.5.43-37.2, for debian-linux-gnu (x86_64) 来自Percona - pawel7318
还是空白 Ver 10.13 Distrib 5.7.19, for Linux (x86_64) - Potherca


安装和使用 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


40
2017-09-02 19:31



由于索引没有出现在转储中, index_length 应该省略。 - mtoloo
考虑删除 --progress论据。在我的情况下(版本1.5.3),它意味着显示进度条 只要 但是当我没有指定时,会有更多信息。 - Melebius


完整版的 Russell E Glaue 回答。 获取舍入的db大小,因为pv仅接受整数并计算没有索引的数据长度per @mtoloo 评论:

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

4
2017-07-13 16:29



这不是确切的,即使MySQL中的内部大小与完全不同于备份文件中的实际内容也是如此。 - Corneliu Maftuleac
@CorneliuMaftuleac有更好的方法来了解转储进度,我将非常感谢您的意见。 - pocheptsov
不幸的是,我不认为有任何方法可以提前知道备份大小。 - Corneliu Maftuleac