导入数据库转储时mysql挂起

bar*_*lay 3 mysql import locking

我们有一个来自生产数据库的数据库转储导入脚本,用于重建我们的沙箱数据库。我们为此使用的语法是mysql -u uname -ppass dbname < prod_db_export.sql. 脚本继续创建第一个表,然后执行以下操作:

LOCK TABLES `ad` WRITE;
/*!40000 ALTER TABLE `ad` DISABLE KEYS */;
/*!40000 ALTER TABLE `ad` ENABLE KEYS */;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

表中没有数据,ad因此DISABLE KEYS行后没有导入语句。无论如何,此时导入挂起,当我们查询数据库时,processlist我们会看到如下输出:

| 5116 | uname     | localhost | dbname     | Field List |   85 | Waiting for table |                        | 
| 5121 | uname     | localhost | dbname     | Query      |   44 | Waiting for table | LOCK TABLES `ad` WRITE | 
| 5126 | uname     | localhost | dbname     | Field List |   23 | Waiting for table |                        | 
Run Code Online (Sandbox Code Playgroud)

任何人都知道什么会导致这种情况发生?更好的是,如何解决它?

如果可能的话,我们的 SA 不想重新启动 mysql,因为他担心它会无法重新启动(这发生在我们上次遇到类似情况时,他不得不重建整个数据库,包括所有沙箱的数据库) ,来自备份)。

我们随后创建了一个新数据库 dbname2,并且能够成功运行导入,进程列表中没有挂起和表锁定消息。

小智 5

在我的情况下,它在重新启动 mysql 服务后工作

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)


小智 1

作为这个问题中提到的 SA,我想指出一些事情:

  • 在删除数据库之前,该数据库的 ibdata 文件已被删除(我们使用每个 idb 的表)
  • 然后数据库被删除并重新创建
  • 导入后,第一个表是 ad 并且它似乎已经被锁定。

对我来说,这意味着共享 ibdata 文件中保存的 InnoDB 元数据中仍然存储有锁定信息。上次我遇到了 InnoDB 元数据与单个表 ibdata 文件不同步的问题,我把所有东西都扔掉了并重新导入。当我尝试重新启动时,MySQL 拒绝了,因为它找不到已删除但仍在元数据中的表 ibd 文件。

这里持续存在的问题是通过命令行删除 ibd 文件而不是删除数据库。佩布卡克。