导入 MySQL 数据库时获取进度指示器

导入 MySQL 数据库时获取进度指示器

我经常导入 MySQL 数据库,这可能需要一段时间。没有任何进度指示器。可以以某种方式展示吗?导入记录、导入 MB 或导入表...任何事情都比只是等待要好。有人有什么想法吗?

我使用这个命令:

mysql -uuser -p -hhost database < largefile.sql

文件大小在 40-300 MB 之间,并且主机位于本地网络内。

答案1

有一个很好的工具叫做pv.

# On Ubuntu/Debian system
$ sudo apt-get install pv

# On Redhat/CentOS
$ sudo yum install pv

那么例如你可以像这样使用它

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname

注意:请查看此博客 http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html以获得更多见解。

注意:带有完整进度条的更好解决方案。为此,您必须使用两个内置pv选项。一是--progress指示进度条,二是--size告诉pv整个文件有多大。

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES

..问题出在.gz原始文件大小上。您需要以某种方式获取解压后的原始文件大小信息而不解压本身,否则,您将浪费宝贵的时间来解压此文件两次(第一次为pv,第二次为zcat)。但幸运的是,您可以gzip -l选择包含有关我们的 gzip 压缩文件的未压缩信息。不幸的是,它是表格格式的,因此您需要先将其提取才能使用。全部都可以在下面看到:

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'

注意:这是最常见的存档工具和方法的列表,如何从这些存档中提取大量未压缩的字节:

 tar -tvf database.sql.tar | awk '{print $3}' | paste -sd+ | bc

 unzip -Zt database.sql.zip | awk '{print $3}'

 unrar l database.sql.rar | tail -n2 | head -n1 | awk '{ print $1 }'

 7z l database.sql.7z | tail -n1 | awk '{ print $3 }'

呃..所以你需要做的最后一件事就是将它们组合在一起。

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname

为了让它更好,你可以像这样添加进度名称

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass dbname

最后结果:

Importing.. : [===========================================>] 100%

为了快速使用,您可以创建自定义函数。

mysql_import() {
  zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass $1
}

..然后像这样使用它:

mysql_import dbname /path/to/our/database.sql.gz

注意:如果您不知道将其放在哪里,请阅读以下答案: https://unix.stackexchange.com/a/106606/20056

注意:您可以在别名之间添加函数,例如在~/.bash_aliases文件中。

答案2

为什么这么复杂?

这工作正常:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database

答案3

我总是从 MySql shell 导入数据库。它不提供进度指示器,但它确实(快速)滚动其正在执行的操作,因此我知道它正在工作。

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;

答案4

sobi3ch 的回答对于大多数情况来说都很好,但是 Pipe Viewer 在 tty 不可用的情况下无法正常工作,例如监视 mysql docker 容器的初始化输出或要将进度记录到文件时。

管道监测仪github) 是一种替代方案,旨在通过 STDERR 将更新输出到日志流。免责声明:我是作者。

它们的基本功能非常相似:从 STDIN 或文件读取。将内容通过管道传输到 STDOUT。显示进度。然而,管道视图使用终端控制序列来更新单行上的可视进度条,而管道监视器输出适合非终端应用程序的文本更新。

Pipe Monitor 支持以下基本选项。输出可通过 --format 选项自定义:

Usage: pm [--size SIZE] [--name NAME] [--format FORMAT] INPUT_FILE

Positional arguments:
  INPUT_FILE             Optional input file. If not provided input will be read from STDIN

Options:
  --size SIZE, -s SIZE   Size of input from STDIN. Ignored if using INPUT_FILE
  --name NAME, -n NAME   A NAME tag for this output. Will be pre-pended to default FORMAT string
  --format FORMAT, -f FORMAT
                         Output format string. Allowed keys: %name, %size, %time, %eta, %percent, %written, %buffered
  --help, -h             display this help and exit

这是在非终端环境下每个输出的比较。

管道查看器(非终端):

$ pv -nf testin > testout
40
70
77
84
90
96
100

管道监控器:

$ pm testin > testout
Processed 0 bytes of 2456678400 (0% complete). 0 bytes buffered. Running 0s, eta: <unknown>
Processed 1750794240 bytes of 2456678400 (71% complete). 327680 bytes buffered. Running 2s, eta: 1s
Processed 2106937344 bytes of 2456678400 (85% complete). 700416 bytes buffered. Running 4s, eta: 1s
Processed 2419339264 bytes of 2456678400 (98% complete). 2871296 bytes buffered. Running 6s, eta: 0s
Processed 2456678400 bytes of 2456678400 (100% complete). 0 bytes buffered. Running 6s, eta: 0s

相关内容