9
ERROR 3664 (HY000): Failed to set SDI 'MyDatabase.MyTable' in tablespace 'mydatabase/mytable'.

DROP每当尝试数据库或ALTER表时,我都会遇到此错误。我无法删除或更改我创建的任何表。

现在,真正有趣的是,这些错误仅在重新启动 MySQL 并随后登录(由 root 用户)到 MySQL 之后发生。这是模式:

  1. 以 root 用户身份登录 MySQL。
  2. 创建数据库并创建表。
  3. DROPALTER没有问题的数据库或表:)
  4. 退出 MySQL
  5. 重新启动 MySQL(停止然后启动)
  6. 以 root 用户身份登录 MySQL。
  7. 尝试访问我之前创建DROP的数据库或ALTER表时出现错误 3664,阻碍任何DROPALTER :(

似乎 MySQL 的重新启动允许它识别新的数据库和表更改并更新与我想要更改的数据库表和表空间相关的某种SDI(序列化字典信息)元数据。InnoDB不知何故,这种对 SDI 信息的识别阻碍了我的ALTER命令DROP这可能是 MySQL 中的错误吗?或者,我的 root 用户是否无权运行修改 SDI 数据的命令?(尽管文档说 SDI 数据是由内部 API 修改的。)

每次我创建数据库和表时都会发生这种情况。所以,我对这个错误非常严重的解决方法

  1. 手动删除数据目录下与数据库关联的数据文件。
  2. 调用DROP DATABASE IF EXISTS MyDatabase;(可能需要注销/登录几次,或重新启动 MySQL 并尝试使用SELECT语句访问表以使其最终起作用)
  3. 重新创建所需的数据库和表。

任何帮助将不胜感激!谢谢!


我在 Mac 上运行 MySQL 8.0.11 社区服务器。

没有解决方案的相同问题:无法删除数据库 mysql: ERROR 3664 (HY000)

4

5 回答 5

10

我和我的几个学生已经看到这个问题越来越多地出现。

作为一种解决方法,我发现如果您进入analyze table并对问题数据库中的所有表执行操作,它将修复此错误,直到您下次重新启动服务器。

于 2018-10-26T14:23:20.543 回答
2

这是 mysql-8.0.11 中的相关补丁:

https://github.com/mysql/mysql-server/commit/261981bdf42c110f08f98ad2cf84ce6fdef1949e

sdi_debug.result似乎表明

SET GLOBAL DEBUG = '-d, sdi_delete_failure';

需要克服这个问题。

于 2018-05-20T23:45:22.317 回答
1

如果清空所有表,则可以删除架构。

有趣的是,如果在 PHP 中使用 PDO,则此语句有效

$conn->exec("DROP DATABASE IF EXISTS $dbname");
于 2018-08-10T09:48:52.383 回答
0

FWIW,我在尝试时遇到了同样的“无法设置 SDI”错误:

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

在我的情况下,表引擎是InnoDBMyISAM. 它们应该都是InnoDB,当我切换它们并重新启动 MySQL 服务器时,一切似乎都奏效了。

.sdiMySql 的数据目录中有各种文件(/usr/local/mysql/data/MyDb/在我的机器上)......这只是一个简单的json文件,其中包含与特定表相关的元数据。这些 SDI 文件似乎只存在于 MyISAM 表中。

在我意识到这一点之前,我认为特定表的 SDI 文件一定是丢失了,或者其他什么,结果 mysqlibd2sdi在其 bin 目录中有一个实用程序,可以从表ibd文件(也在数据目录)。

如果您需要坚持下去,MyISAM可能值得一看。不过,在修改 SDI 文件的内容时要小心,因为我在 MySql 工作日志中遇到了这句话

执行此操作时必须非常小心 - 与存储在 .MYD 和 .MYI 文件中的内容不兼容的更改(例如更改列的数据类型)可能是灾难性的,必须避免。

不知道这是否有帮助,但我想我会分享。

于 2018-10-26T03:21:54.973 回答
0

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

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;

创建之后,我必须使用 ALTER TABLE 重新添加这些键。

至少可以说很烦人。

于 2018-08-22T19:54:17.667 回答