drop或alter导致错误3664(hy000):无法设置sdi

x8diyxa7  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(383)
ERROR 3664 (HY000): Failed to set SDI 'MyDatabase.MyTable' in tablespace 'mydatabase/mytable'.

每当我试图 DROP 数据库或 ALTER 一张table。我无法删除或更改我创建的任何表。
现在,真正有趣的是,这些错误只有在重新启动mysql并随后(由root用户)登录mysql之后才会发生。模式如下:
以root用户身份登录mysql。
创建数据库并创建表。 DROP 数据库或 ALTER 没有问题的表:)
退出mysql
重新启动mysql(先停止,然后启动)
以root用户身份登录mysql。
尝试删除时出现错误3664 DROP 数据库或 ALTER 我以前创建的表 DROP 或者 ALTER :(
似乎mysql的重新启动允许它识别新的数据库和表更改,并更新与我的数据库相关联的某种sdi(序列化字典信息)元数据 InnoDB 我要更改的数据库表和表空间。不知何故,这种对sdi信息的认知妨碍了我的工作 ALTER 以及 DROP 命令。这可能是mysql中的错误吗?或者,我的根用户是否有权运行修改sdi数据的命令(不过,文档中说sdi数据是由内部api修改的。)
每次创建数据库和表时都会发生这种情况。所以,我对这个错误的解决方法是:
手动删除数据目录中与数据库关联的数据文件。
呼叫 DROP DATABASE IF EXISTS MyDatabase; (可能需要注销/登录几次,或者重新启动mysql并尝试使用 SELECT 声明(最终有效)
重新创建所需的数据库和表。
任何帮助都将不胜感激!谢谢您!
我正在mac上运行MySQL8.0.11社区服务器。
同样的问题没有解决方案:无法删除数据库mysql:error 3664(hy000)

kx7yvsdv

kx7yvsdv1#

我和我的几个学生看到这个问题越来越多。
作为一个解决办法,我发现如果你进去做一个 analyze table 在问题数据库中的所有表上,它将修复此错误,直到下次重新启动服务器。

qlckcl4x

qlckcl4x2#

问题与外键有关。此语句失败:

CREATE TABLE `lottery` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `club_id` int(11) unsigned DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `details` text,
  `open_date` date DEFAULT NULL,
  `close_date` date DEFAULT NULL,
  `status_id` smallint(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `fk_lottery_club` (`club_id`),
  CONSTRAINT `fk_lottery_club` FOREIGN KEY (`club_id`) REFERENCES `club` (`id`) ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

但是如果我去掉key和constraint子句,它就可以工作了。

CREATE TABLE `lottery` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `club_id` int(11) unsigned DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `details` text,
  `open_date` date DEFAULT NULL,
  `close_date` date DEFAULT NULL,
  `status_id` smallint(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在创建之后,我必须使用altertable添加这些键。
至少可以说很烦人。

c0vxltue

c0vxltue3#

fwiw,我在尝试时遇到相同的“设置sdi失败”错误:

ALTER TABLE 'MyDb.MyTable' ADD COLUMN 'myCol' VARCHAR(255)

在我的例子中,table引擎是 InnoDB 以及 MyISAM . 他们应该都是 InnoDB 当我切换它们并重新启动mysql服务器时,一切似乎都正常了。
有各种各样的 .sdi mysql数据目录中的文件( /usr/local/mysql/data/MyDb/ 在我的机器上)。。。这只是一个简单的问题 json 包含与特定表相关的元数据的文件。这些sdi文件似乎只存在于myisam表中。
在我意识到这一点之前,我认为特定表的sdi文件肯定丢失了,或者是什么,结果发现mysql有一个 ibd2sdi 实用程序,可以从表中创建sdi文件 ibd 文件(也在数据目录中)。
如果你需要坚持 MyISAM 也许值得一看。但是,在修改sdi文件的内容时要小心,因为我在mysql worklogs中遇到了以下引用:
执行此操作时必须非常小心-与.myd和.myi文件中存储的内容不兼容的更改(如更改列的数据类型)可能会带来灾难性后果,必须避免。
不知道这是否有用,但我想和大家分享一下。

piztneat

piztneat4#

如果清空所有表,则可以删除模式。
有趣的是,如果在php中使用pdo,则该语句可以工作

$conn->exec("DROP DATABASE IF EXISTS $dbname");
4ktjp1zp

4ktjp1zp5#

这是mysql-8.0.11中的相关修补程序:
https://github.com/mysql/mysql-server/commit/261981bdf42c110f08f98ad2cf84ce6fdef1949e
sdi\u debug.result似乎表明

SET GLOBAL DEBUG = '-d, sdi_delete_failure';

是克服这个问题所需要的。

相关问题