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

qaz*_*wsx 256 mysql mysqldump import mysql-5.0

我正在导入 7 GBfoobar.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
Run Code Online (Sandbox Code Playgroud)

我如何监控它的进度?

小智 339

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

mysql -uxxx -pxxx dbname < /sqlfile.sql
Run Code Online (Sandbox Code Playgroud)

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

pv sqlfile.sql | mysql -uxxx -pxxxx dbname
Run Code Online (Sandbox Code Playgroud)

它会在程序运行时显示一个进度条。

它非常有用,您还可以使用它来估计 mysqldump 进度。

pv 转储sqlfile.sql并将它们传递给 mysql(因为管道操作符)。在倾倒时,它显示了进度。很酷的事情是 mysql 只在数据可以处理的情况下尽可能快地获取数据,因此 pv 可以显示导入的进度。我没有任何证据。但似乎是这样。我想使用了一些缓冲区,但在某些时候我认为mysql当它仍然忙于处理时不会再读取任何数据。

管道查看器屏幕截图

  • @snapfractalpop `pv` 在许多情况下不会过于准确,因为某些 SQL 块比其他 SQL 块需要更多的时间来处理。例如,构成简单插入的一行将比在已经有很多行的表上创建索引的行运行得快得多。*但是* 一个粗略的进度想法,除非`mysql` 使用的读取缓冲区特别大(对于 7Gb 输入,缓冲区需要非常大以使 `pv` 的输出根本没有用处),否则输出应该会有所帮助. (4认同)

小智 38

如果您已经开始导入,则可以在另一个窗口中执行此命令以查看数据库的当前大小。如果您知道要导入的 .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;  
Run Code Online (Sandbox Code Playgroud)

归功于: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 页大小。

  • @lucidbrot 你的 sql 文件是 gzip 压缩的吗? (2认同)

Rol*_*DBA 18

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

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

你可以做一个节目主持人;并找出运行 mysqldump 的数据库连接。重新加载转储时,数据库连接将消失。

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

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)

更新 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 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;
Run Code Online (Sandbox Code Playgroud)

然后,在表锁被释放之前,没有办法从 mysql 获得进展。

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

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

  • 表重新加载是线性的。索引重建是线性的。几年前,我并没有冒险向 MySQL (http://lists.mysql.com/mysql/202489) 提出这个问题,而且我在 DBA StackExchange (http://dba.stackexchange.com/a) 中提到过它/2697/877) (2认同)

小智 14

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

watch 'echo "show processlist;" | mysql -uuser -ppassword';
Run Code Online (Sandbox Code Playgroud)

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

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';
Run Code Online (Sandbox Code Playgroud)


小智 10

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

show processlist; 
Run Code Online (Sandbox Code Playgroud)

并查看正在执行的内容。


小智 5

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

如果有很多表,你也可以在/var/lib/mysql/<数据库名>中观察它们一一出现。

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

我认为,当数据库不涉及某处或其他地方的文件时,这一天是极不可能的。同时,您可以监控文件以查看传输的进展情况。自从编写第一个 sql 数据库以来,我建议的方法一直是您可以以一种或另一种形式执行的操作。我从未打算暗示这是手动骑师可以依靠的任何“官方”技术。它假定一般的计算机熟练程度,特别是 Unix。


归档时间:

查看次数:

227908 次

最近记录:

4 年,4 月 前