我有一个非常大的.csv文件,我用LOAD DATA INFILE命令将它加载到mysql中。因为它花了这么长时间,我想看看上传进展的程度。
到目前为止,我尝试了两种方法 - 首先,我只是执行SELECT COUNT(*)命令来查看在上载过程中插入了多少行,但总是返回0。 其次,我尝试了SHOW PROCESSLIST并查看了查询运行了多长时间。有时候状态会说“释放数据”或类似的东西。
有没有人知道跟踪LOAD DATA INFILE命令进度的好方法?此外,有谁知道如何跟踪插入率?
由于
答案 0 :(得分:25)
在Linux上,您可以打印有关文件描述符(ls -l / proc // fd)和文件位置读取器(cat / proc // fdinfo)的信息。所以:
查找mysqld pid(在此示例中: 1234 ):
$ ps -ef | grep mysqld
mysql 1234 1 0 feb12 ? 00:00:55 /usr/sbin/mysqld
查找已加载文件的文件描述符编号(在此示例中为: 45 ):
$ sudo ls -l /proc/1234/fd
lr-x------ 1 root root 64 Feb 13 10:56 45 -> /var/lib/mysql/db/Loaded_file.txt
打印有关该文件描述符的信息并检查已读取的字节数(在此示例中为: 494927872 ):
$ cat /proc/1234/fdinfo/45
pos: 494927872
flags: 0100000
您可以将此进度指示器(以字节为单位)与正在加载的实际文件大小进行比较。
您也可以使用'lsof'命令代替步骤1和2:
$ lsof /var/lib/mysql/db/Loaded_file.txt | grep mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1234 youknowwho 45r REG 252,0 190312 5505353 /var/lib/mysql/db/Loaded_file.txt
答案 1 :(得分:8)
从http://www.stephenchu.com/2008/12/speed-up-your-mysql-data-load.html开始,您可以使用SHOW INNODB STATUS
如果您的表格是Innodb类型,那么您没有提及。
我链接到的页面也有一些很好的调整建议,可以通过这种方式加载数据来提高整体性能。
答案 2 :(得分:5)
这里有几种方法......
set session transaction isolation level read uncommitted
;然后count(*)将起作用select
rows_read as 'Read',
round((rows_read/{linecount})*100, 2) as 'Complete',
round(time/60, 2) as 'Elapsed',
round(time * 100 / round((rows_read/<line count>)*100, 2) / 60, 2) as 'ETA'
from INFORMATION_SCHEMA.PROCESSLIST
where id = <id>;