我经常导入 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