47

每周一次,我需要在本地开发环境中运行一次巨大的数据库更新,如下所示:

$ gunzip < /path/to/database1.sql.gz | mysql -uUSER -p database1 &
$ gunzip < /path/to/database2.sql.gz | mysql -uUSER -p database2 &
$ gunzip < /path/to/database3.sql.gz | mysql -uUSER -p database3 &

我尝试在一夜之间运行这些,因为它可能需要几个小时才能完成。

你能帮我想出一种方法来显示这些任务的进展吗?

以下是一些猜测:

  1. 获取数据库的未压缩文件大小并与我的本地数据库大小进行比较
  2. 在mysql中运行show processlist看看它当前插入的是什么表(我目前的方法,但是有些表很大,而且我的至少一个db只有一个巨大的表所以大部分进程都卡在这个表中,留下这个选项小于有帮助)

所有 db.sql.gz 文件都是标准 gzip 压缩的 mysqldump,所以我认为我无法在转储中构建任何内容来给我更新。(但如果我遗漏了什么,我对此持开放态度)


赏金规则

答案必须:

  1. 提供有用且相当准确的进度(可视化scp(首选!)或通过可以轻松访问的简单进度数据库表)。
  2. 不破坏常规mysqldump导出或常规gunzip ... | mysql导入(对于可能不会使用您想出的任何东西的其他工程师)
  3. 不要让我的 DBA 心脏病发作——所以在特殊mysqldump或替代 mysql 分支请求上保持轻松。
4

2 回答 2

133

您可以在命令中使用 -v : 详细模式(显示进度),或者使用 Pipe Viewer ( pv) 的另一种方法显示 gzip、gunzip 命令的进度,如下所示:

$ pv database1.sql.gz | gunzip | mysql -u root -p database1

这将输出类似于 scp 的进度:

$ pv database1.sql.gz | gunzip | mysql -uroot -p database1
  593MiB 1:00:33 [ 225kiB/s] [====================>              ] 58% ETA 0:42:25

您还可以使用 Pipe Viewer 监控 mysqldump:

mysqldump -uroot -p database1 | pv | gzip -9 > database1.sql.gz

如果你还没有pv,你可以安装它:

yum install pv

或使用 macports

sudo port install pv

或自制

brew install pv
于 2013-10-28T04:21:43.220 回答
3

我想我会在加载数据之前执行一个删除数据库,然后在它发生之后我可以在数据库目录中运行一个连续的“du -sh”。如果我知道原始数据库目录的大小(为什么不知道?),那么我可以将它用作进度监视器。数据库是可丢弃的吗?

于 2013-10-28T11:01:19.690 回答