mysqldump是否支持进度条?

Sin*_*ina 64 mysql

有没有办法确定,在mysqldump运行时,已完成多少备份或剩余多少?

Rus*_*aue 62

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

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

PV("Pipe Viewer")是一种通过管道监控数据进度的工具.它可以插入到两个进程之间的任何正常管道中,以直观地指示数据通过的速度,采取的时间,接近完成的时间以及估计完成之前的时间.

假设生成的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;
Run Code Online (Sandbox Code Playgroud)

更新

根据我的经验,当转储整个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

  • 由于转储中没有出现索引,因此应省略`index_length`. (5认同)
  • 考虑删除`--progress`参数.在我的情况下(版本1.5.3),它意味着显示进度条_only_但是当我没有指定它时有更多信息. (4认同)

xel*_*o52 45

是的,2010年3月27日发布补丁:

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

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

  • mysqldump --help | grep progress # 不输出 mysqldump --version mysqldump Ver 10.13 Distrib 5.6.10, for Linux (x86_64) (12认同)
  • `mysqldump --help | grep progress`为`mysqldump Ver 10.13 Distrib 5.6.22,for osx10.10(x86_64)`是空白的. (5认同)
  • 空白以及来自Percona的`ver 10.13 Distrib 5.5.43-37.2,debian-linux-gnu(x86_64)` (4认同)
  • 我正在使用mysqldump Ver 10.13 Distrib 5.5.11,用于Win32(x86),它似乎没有使用此补丁构建.如何确定此补丁是否已成为稳定版本? (3认同)
  • 仍为空白`Ver 10.13 Distrib 5.7.19,for Linux(x86_64)` (2认同)
  • 2021年10.18依然缺失,这个补丁怎么了? (2认同)

poc*_*sov 10

完整版的Russell E Glaue答案.得到舍入的db大小,因为pv只接受整数,并且根据@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';")
Run Code Online (Sandbox Code Playgroud)

创建时间戳文件名的备份:

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
Run Code Online (Sandbox Code Playgroud)


小智 7

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
...
Run Code Online (Sandbox Code Playgroud)