我正在导入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


如何监视其进度?

评论

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

#1 楼

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

mysql -uxxx -pxxx dbname < /sqlfile.sql


,那么请先在操作系统上安装管道查看器,然后尝试如下操作:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname


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

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

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



评论


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

–snapfractalpop
2015年8月21日在15:34



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

– David Spillett
16年1月20日在14:38

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

–snapfractalpop
16年1月20日在15:19

@rob这真是帅哥,您还可以提供mysqldump的示例吗?

–乔·亚历山大·伊巴拉(Josue Alexander Ibarra)
16年5月26日在18:03

非常好的解决方案!如果密码是手动密码,则pv不会等待它显示其进度,尽管

– Pierre de LESPINAY
17年2月10日在14:40

#2 楼

如果您已经开始导入,则可以在另一个窗口中执行此命令以查看数据库的当前大小。如果您知道要导入的.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参考声明了以下有关准确性的信息: br />对于MyISAM,DATA_LENGTH是数据文件的长度,以字节为单位。

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


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

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


评论


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

–lucidbrot
19年8月10日在5:58

@lucidbrot是您的sql文件是否已压缩?

– Tschallacka
19年11月27日在16:10

#3 楼

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

自然地,将mysqldump重新加载到数据库中也将按字母顺序转储。 >您可以只显示一个SHOW PROCESSLIST;并找出运行mysqldump的数据库连接。重新装入转储时,数据库连接将消失。

如果您想知道转储文件中包含哪些表,请对foobar.sql进行运行。

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


UPDATE 2012-05-02 13:53 EDT

对不起,因为您没有注意到只有一个表。

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

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

如果表为InnoDB并且禁用了innodb_file_per_table,则即使从操作系统的角度来看

UPDATE 2012-05-02 13:56 EDT

我去年曾这样说过:我如何获得%db.sql类型的进度? mysql“

UPDATE 2012-05-02 14:09 EDT

由于标准的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年5月2日21:06



表重新加载是线性的。索引重建是线性的。几年前,这并不是我作为MySQL的一个问题冒险(list.mysql.com/mysql/202489),而是在DBA StackExchange(dba.stackexchange.com/a/2697/877)中提到的

– RolandoMySQLDBA
2012年5月2日在21:12



#4 楼

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

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


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

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


评论


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

– qazwsx
16 Dec 9'在17:29

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

– NarayaN
17年8月5日在20:52

在上传SQL文件并开始还原查询后,这真的很有帮助

–安库尔·洛里亚(Ankur Loriya)
19/12/5在9:16

即使它没有以%的形式显示进度,也确实表明它确实在工作并且没有卡住。

–大卫
4月7日下午16:12

#5 楼

如果只想检查它是否已停止,则可以查询

show processlist; 


并查看正在执行的操作。

#6 楼

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

如果有很多表,您还可以在/ var / lib / mysql / <数据库名称>。

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

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

#7 楼

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

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


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

例如,如果要插入,您将看到类似以下内容: >其中28958是在您的间隔内插入的行数(在我的情况下为10秒)。

#8 楼

我有一个500 MB的SQL文件要导入。我花了大约2个小时。在导入过程开始时,mysqld CPU使用率接近100%。但是几分钟后,CPU使用率降到了15%。 mysql的导入只花了3分钟! CPU利用率一直都是100%。

如果您想使用此设置,则需要编辑“ /etc/mysql/my.cnf”文件并使用“ sudo”重新启动mysql服务器。服务mysql重新启动”。

这是我的“ my.conf”文件的设置:

    [mysqld]
    innodb_log_buffer_size = 256M
    innodb_fast_shutdown = 0
    innodb-doublewrite = OFF
    innodb_io_capacity = 1000
    innodb_flush_log_at_trx_commit = 0


请注意:“ innodb_flush_log_at_trx_commit = 0“仅每秒执行一次提交。因此它不符合ACID,但可以接受批量进口。导入后,可以将“ innodb_flush_log_at_trx_commit”的值设置回1并重新启动数据库。
链接到mySQL文档

#9 楼

对于正在使用mysqldump查找管道查看器示例的人,您将可以执行以下操作:

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


-W标志只是告诉pv等待第一个字节在显示进度之前(提示后)

#10 楼

您可以在文件夹\ Msql \ Data [DB name]
中监视导入。

#11 楼

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

这就是我的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


#12 楼

如果您有gnu coreutils / dd版本> = 8.24(2015年7月3日发布),则可以使用dd的status = progress参数,

例如

cat dbdump.gz | gzip -d | mysql --password=root -v | time dd of=/dev/null status=progress


* PS:不适用于busybox,busybox dd无法理解“ status = progress”

#13 楼

我使用https://github.com/Xfennec/progress并通过watch监控

watch progress


导入zcat example.sql.gz | mysql -u root -proot -h localhost example

#14 楼

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

评论


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

–必须
16年3月3日在19:25

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

–dtc
16年3月3日在20:46

这个建议帮助我查明了一个问题,但是对于大文件使用来说可能不切实际。 (我的很小)。

– Casey Perkins
16-2-26在15:46