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