我们的生产数据库中有一个数据库转储导入脚本,可用于重建沙箱数据库.我们为此使用的语法是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;
表格广告中没有数据,因此DISABLE KEYS行之后没有import语句.无论如何,导入此时就挂起了,当我们使用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 | |
有人知道会导致这种情况发生的原因吗?更好的是,如何解决呢?
我们的SA根本不希望重新启动mysql,因为他担心它将无法重新启动(这是上次发生类似情况时发生的情况,他不得不重建整个数据库,包括所有沙箱的数据库. ,来自备份).
随后,我们创建了一个新数据库dbname2,并且能够在processlist中没有挂起,没有表锁定消息的情况下成功运行导入.
解决方法:
作为此问题中引用的SA,我想指出一些事情:
>在删除数据库之前,已为该数据库删除了ibdata文件(我们使用表每个idb)
>然后删除数据库并重新创建
>导入时,第一个表是ad,它似乎已经被锁定.
对我来说,这意味着在InnoDB元数据中仍然存储有锁定信息,该信息保存在共享ibdata文件中.
上次我遇到InnoDB元数据与单个表ibdata文件不同步的问题时,我删除了所有内容并重新导入.当我尝试重新启动时,MySQL拒绝了,因为它无法找到已删除但仍在元数据中的表ibd文件.
这里的持久性问题是通过命令行除去ibd文件,而不是删除数据库.
佩布卡茨.