如何监视大.sql文件的导入进度?


204

我正在导入7 GB的空间foobar.sql以还原本地数据库中的表。

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

如何监控进度?


1
该问题的答案表明这显然是mysql客户端的不足
William Entriken,

Answers:


267

如果您只是从* nix上的CLI从转储文件导入,例如

mysql -uxxx -pxxx dbname < /sqlfile.sql

然后先在您的操作系统上安装管道查看器,然后尝试执行以下操作:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

程序运行时将显示进度条。

它非常有用,您也可以使用它来估算mysqldump的进度。

pv转储sqlfile.sql并将它们传递给mysql(由于管道运算符)。在转储时,它显示进度。很酷的事情是,mysql仅以其可以处理数据的速度来获取数据,因此pv可以显示导入的进度。我没有任何证据。但似乎是这样。我想这里使用了一些缓冲区,但是在某些时候,我认为mysql当它仍在忙于处理时,它不再读取任何数据。

管道查看器屏幕截图


1
我猜想mysql可能有一个缓冲区,可以在不完全“处理”的情况下将一些数据传递到其中(即,如果出错,pv可能稍微报告了实际输入的内容)。但总的来说,这就是管道的工作方式。这是您可以做的原因,sudo hd /dev/sda1 | less并且您的整个系统分区都不在内存中。
snapfractalpop

2
@snapfractalpop pv在许多情况下不会过于准确,因为某些SQL块要比其他块花费更多的时间。例如,构成简单插入的一行的运行速度比在已经有许多行的表上的索引上创建的运行速度快得多。大致的进度思路是,输出应该会有所帮助,除非使用的读取缓冲区mysql特别大(对于7Gb输入,缓冲区必须非常大才能使pv输出完全无效。)
David Spillett

1
确实是@DavidSpillett。您的评论反映了我的观点。基本上,光伏是粗略的,但有效。我最喜欢它的地方是它的通用性。这就是Unix管道的美丽之处(感谢McIlroy)。
snapfractalpop

1
@rob这是一个很棒的家伙,您还可以提供一个示例mysqldump吗?
Josue Alexander Ibarra

非常好的解决方案!如果密码是手动密码,尽管如此,pv不会等待它显示其进程
Pierre de LESPINAY,2017年

26

如果您已经开始导入,则可以在另一个窗口中执行此命令以查看数据库的当前大小。如果您知道要导入的.sql文件的总大小,这将很有帮助。

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

致谢:http : //forums.mysql.com/read.php?108,201578,201578


MySQL 8.0参考》陈述了有关准确性的以下内容:

DATA_LENGTH

对于MyISAM,DATA_LENGTH是数据文件的长度,以字节为单位。

对于InnoDB,DATA_LENGTH是为聚簇索引分配的大约内存量(以字节为单位)。具体来说,它是聚簇索引大小(以页为单位)乘以InnoDB页大小。

 

INDEX_LENGTH

对于MyISAM,INDEX_LENGTH是索引文件的长度,以字节为单位。

对于InnoDB,INDEX_LENGTH是分配给非聚簇索引的大约内存量(以字节为单位)。具体来说,它是非聚集索引大小(以页为单位)的总和乘以InnoDB页面大小。


根据此答案中的命令,我的表现在位于12 GiB,并且仍在导入。我的sqldump文件只有5 GiB。我有兴趣在这个差异的解释
lucidbrot

17

当执行单个数据库的mysqldump时,所有表都按字母顺序转储。

自然地,将mysqldump重新加载到数据库中也将按字母顺序进行。

您可以只做一个SHOW PROCESSLIST;并找出运行mysqldump的数据库连接。重新装入转储后,数据库连接将消失。

如果您想知道转储文件中有哪些表,请对foobar.sql运行此表

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

更新2012-05-02 13:53 EDT

很抱歉没有注意到只有一张桌子。

如果表是MyISAM,则监视的唯一方法是从OS的角度来看。原因?该表在整个重装过程中被写锁定。你在找什么?.MYD.MYI文件的大小。当然,您需要将其与导入的其他数据库服务器上的表大小进行比较。

如果表是InnoDB,并且您启用了innodb_file_per_table,则监视的唯一方法是从OS的角度来看。原因?该表在整个重装过程中被写锁定。你在找什么?.ibd文件大小。当然,您需要将其与导入的其他数据库服务器上的表大小进行比较。

如果表是InnoDB,并且您禁用了innodb_file_per_table,则即使从操作系统的角度来看也无济于事。

更新2012-05-02 13:56 EDT

去年,我解决了类似问题:如何获得“ type db.sql | mysql”的进度

更新美国东部时间2012-05-02 14:09

由于标准的mysqldump像这样写锁定表:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

然后,在释放表锁之前,无法从mysql获取进度。

如果可以获取LOCK TABLESUNLOCK TABLES注释掉转储文件...

  • 如果表是MyISAM,则SELECT COUNT(*)将起作用
  • 如果表是InnoDB,则SELECT COUNT(*)可能会减慢/暂停加载,直到完成计数

那行得通。谢谢。最后一个问题是,根据经验,您是否知道导入时间相对于和文件大小是否大致呈线性关系?.MYD.MYI
qazwsx 2012年

1
表重新加载是线性的。索引重建是线性的。几年前,它并不像我冒昧这是一个问题的MySQL(lists.mysql.com/mysql/202489)和我在DBA StackExchange(提到dba.stackexchange.com/a/2697/877
RolandoMySQLDBA

8

每隔2秒,您将看到进程正在运行。

watch 'echo "show processlist;" | mysql -uuser -ppassword';

如果您希望它不那么频繁,则在-n x其中x是秒数。5秒将是:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

您可以发布示例输出吗?另外,它只是显示过程还是真的指示导入的进度,而这正是我真正要求的?
qazwsx

这是一个很有帮助的代码。谢谢
NarayaN

6

如果您只想检查它是否停滞,可以查询

show processlist; 

看看正在执行什么。


5

作为无法上电或上电说谎的人的解决方案。您可以在/ var / lib / mysql中监视包含数据的ibdata1文件的大小。这将最终达到源服务器中文件大小的相同大小(或大约相同)。

如果有很多表,您也可以在/ var / lib / mysql / <数据库名称>中逐一查看它们。

我最近在一个长期数据库在三到四年的时间内建立了大约20G的日志文件时碰巧使用了这个事实。我注意到该转移需要花费很多时间,并使用此技术监视进度。

我认为,当数据库不涉及某处或其他文件时,这一天不太可能出现。同时,您可以监视文件以查看传输进度。自从编写第一个sql数据库以来,我建议的方法就是可以一种形式或另一种形式进行的操作。我从不打算暗示手动骑师可以依靠任何一种“官方”技术。它假定一般水平的计算机,尤其是unix。


2

如果您的数据库处于安静状态(即没有其他用户处于活动状态),并且您只想查看读/写活动,为什么不这样做:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

您将看到读取/写入/插入/等待/更新的数量。

例如,如果要插入,您将看到类似以下内容:

Innodb_rows_inserted                          | 28958 

其中28958是在您的时间间隔内插入的行数(在我的情况下为10秒)。


1

对于正在使用mysqldump您的管道查看器示例的用户,只需执行以下操作:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

-W标志只是告诉pv等待第一个字节到来,然后显示进度(在提示符后)


0

您可以监视文件夹\ Msql \ Data [DB name]中的Import。


0

好的,另一个解决方法。但这可能是最糟糕和不准确的选择。

也就是说,这是我的Windows解决方案:

打开任务管理器,按

CTRL + SHIFT + ESC

复制“ mysqld.exe”磁盘值速度

e.g. 11mb/s

将其放在这样的计算器中:https : //techinternets.com/copy_calc?do

估计ETA。我的情况是:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

结果:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

我很惊讶没有人发布'mysql -v'作为选项。如果卡住,则输出将停止。


3
“监视进度”通常意味着尝试估计该过程已进行了多长时间或何时完成,而mysql -v无法提供。另外,向终端发送7 GB的数据将大大降低还原速度。
mustaccio

我明白了,谢谢你的解释。没错,输出到终端的7 GB输出效果不好。我想我用-v只是一个小的本地测试用例,我的数据库只会卡住。
dtc

2
这个建议帮助我查明了一个问题,但是对于大文件使用来说可能不切实际。(我的很小)。
Casey Perkins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.