Answers:
如果您只是从* nix上的CLI从转储文件导入,例如
mysql -uxxx -pxxx dbname < /sqlfile.sql
然后先在您的操作系统上安装管道查看器,然后尝试执行以下操作:
pv sqlfile.sql | mysql -uxxx -pxxxx dbname
程序运行时将显示进度条。
它非常有用,您也可以使用它来估算mysqldump的进度。
pv转储sqlfile.sql
并将它们传递给mysql(由于管道运算符)。在转储时,它显示进度。很酷的事情是,mysql仅以其可以处理数据的速度来获取数据,因此pv可以显示导入的进度。我没有任何证据。但似乎是这样。我想这里使用了一些缓冲区,但是在某些时候,我认为mysql
当它仍在忙于处理时,它不再读取任何数据。
sudo hd /dev/sda1 | less
并且您的整个系统分区都不在内存中。
pv
在许多情况下不会过于准确,因为某些SQL块要比其他块花费更多的时间。例如,构成简单插入的一行的运行速度比在已经有许多行的表上的索引上创建的运行速度快得多。但大致的进度思路是,输出应该会有所帮助,除非使用的读取缓冲区mysql
特别大(对于7Gb输入,缓冲区必须非常大才能使pv
输出完全无效。)
mysqldump
吗?
如果您已经开始导入,则可以在另一个窗口中执行此命令以查看数据库的当前大小。如果您知道要导入的.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页面大小。
当执行单个数据库的mysqldump时,所有表都按字母顺序转储。
自然地,将mysqldump重新加载到数据库中也将按字母顺序进行。
您可以只做一个SHOW PROCESSLIST;并找出运行mysqldump的数据库连接。重新装入转储后,数据库连接将消失。
如果您想知道转储文件中有哪些表,请对foobar.sql运行此表
cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'
很抱歉没有注意到只有一张桌子。
如果表是MyISAM,则监视的唯一方法是从OS的角度来看。原因?该表在整个重装过程中被写锁定。你在找什么?.MYD
和.MYI
文件的大小。当然,您需要将其与导入的其他数据库服务器上的表大小进行比较。
如果表是InnoDB,并且您启用了innodb_file_per_table,则监视的唯一方法是从OS的角度来看。原因?该表在整个重装过程中被写锁定。你在找什么?.ibd
文件大小。当然,您需要将其与导入的其他数据库服务器上的表大小进行比较。
如果表是InnoDB,并且您禁用了innodb_file_per_table,则即使从操作系统的角度来看也无济于事。
去年,我解决了类似问题:如何获得“ type db.sql | mysql”的进度
由于标准的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 TABLES
并UNLOCK TABLES
注释掉转储文件...
.MYD
.MYI
作为无法上电或上电说谎的人的解决方案。您可以在/ var / lib / mysql中监视包含数据的ibdata1文件的大小。这将最终达到源服务器中文件大小的相同大小(或大约相同)。
如果有很多表,您也可以在/ var / lib / mysql / <数据库名称>中逐一查看它们。
我最近在一个长期数据库在三到四年的时间内建立了大约20G的日志文件时碰巧使用了这个事实。我注意到该转移需要花费很多时间,并使用此技术监视进度。
我认为,当数据库不涉及某处或其他文件时,这一天不太可能出现。同时,您可以监视文件以查看传输进度。自从编写第一个sql数据库以来,我建议的方法就是可以一种形式或另一种形式进行的操作。我从不打算暗示手动骑师可以依靠任何一种“官方”技术。它假定一般水平的计算机,尤其是unix。
对于正在使用mysqldump
您的管道查看器示例的用户,只需执行以下操作:
mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql
该-W
标志只是告诉pv等待第一个字节到来,然后显示进度(在提示符后)
好的,另一个解决方法。但这可能是最糟糕和不准确的选择。
也就是说,这是我的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
我很惊讶没有人发布'mysql -v'作为选项。如果卡住,则输出将停止。
mysql -v
无法提供。另外,向终端发送7 GB的数据将大大降低还原速度。