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

Use*_*841 28 bash mysql

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

我使用这个命令:

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

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

sob*_*3ch 39

有一个很好的工具叫做 pv

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

# On Redhat/CentOS
$ sudo yum install pv
Run Code Online (Sandbox Code Playgroud)

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

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname
Run Code Online (Sandbox Code Playgroud)

请检查更新 2 以获取我的最新版本

ps:查看这个博客http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

更新:似乎上面的链接已损坏,但我在这里找到了相同的文章http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

更新 2:带有完整进度条的更好解决方案。为此,您需要使用 2 个内置pv选项。一是--progress指示进度条和第二就是--size要告诉pv整个文件有多大。

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES
Run Code Online (Sandbox Code Playgroud)

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

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

Uff .. 所以你需要做的最后一件事就是把所有东西组合在一起。

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

为了让它更好,你可以像这样添加progres NAME

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

最后结果:

Importing.. : [===========================================>] 100%
Run Code Online (Sandbox Code Playgroud)

更新 3:为了快速使用,请创建自定义函数。

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

用法:

mysql_import dbname /path/to/our/database.sql.gz
Run Code Online (Sandbox Code Playgroud)

如果你不知道把它放在哪里,请阅读这个答案:https : //unix.stackexchange.com/a/106606/20056

您可以在别名之间添加函数。所以你可以使用例如~/.bash_aliases文件。


小智 29

为什么这么复杂?

这工作正常:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database
Run Code Online (Sandbox Code Playgroud)


Geo*_*e M 12

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

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
Run Code Online (Sandbox Code Playgroud)


cmo*_*ris 5

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

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

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

管道查看器(非终端):

$ pv -nf testin > testout
40
70
77
84
90
96
100
Run Code Online (Sandbox Code Playgroud)

管道监控器:

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