一、问题再现
在运行scrapy爬虫,将大量数据存入到Mysql数据库中时,突然觉得数据太多了,想要将爬虫停掉。
这时你可能会使用Ctrl + Z
的方法强制停止掉爬虫,但是当我们再次运行爬虫的时候发现爬虫 停止在写入数据库的地方不继续运行了,并且一直停在那里,如果你在数据库中执行相应的其他操作也会发现一直停在那边等待。
二、问题分析
当我们强制关闭scrapy爬虫后,此时爬虫在终止后,相关的关闭数据连接的操作
pymysql.connect.cursor().close() # 关闭游标
pymysql.connect.close() # 断开数据库连接
并没有运行所以导致mysql连接没有关闭,导致Mysql出现了死锁。
三、解决办法
在mysql中执行
mysql > show precesslist;
显示如下:(其中db为scrapy就是我运来存储爬虫数据的数据库)
你会发现中间有许多process已经被死锁进入等待。
我们要做的就是杀死这些死锁的进程:
mysql > kill Id号 # 用来杀死那些已经被死锁process。
例如: kill 11 # 将会将Id号为11的那个process干掉