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,并且能够成功运行导入,进程列表中没有挂起和表锁定消息。
小智 1
作为这个问题中提到的 SA,我想指出一些事情:
对我来说,这意味着共享 ibdata 文件中保存的 InnoDB 元数据中仍然存储有锁定信息。上次我遇到了 InnoDB 元数据与单个表 ibdata 文件不同步的问题,我把所有东西都扔掉了并重新导入。当我尝试重新启动时,MySQL 拒绝了,因为它找不到已删除但仍在元数据中的表 ibd 文件。
这里持续存在的问题是通过命令行删除 ibd 文件而不是删除数据库。佩布卡克。