MySQL 8 - DROP или ALTER вызывает ОШИБКУ 3664 (HY000): не удалось установить SDI - PullRequest
0 голосов
/ 21 мая 2018
ERROR 3664 (HY000): Failed to set SDI 'MyDatabase.MyTable' in tablespace 'mydatabase/mytable'.

Я сталкиваюсь с этой ошибкой, когда пытаюсь DROP База данных или ALTER Таблица.Я не могу удалить или изменить любую созданную мной таблицу.

Теперь действительно интересно, что эти ошибки возникают только после перезапуска MySQL и последующего входа в систему (пользователем root) в MySQL .Вот шаблон:

  1. Войдите в MySQL как пользователь root.
  2. Создайте базу данных и создайте таблицы.
  3. DROP База данных или ALTER Таблицы снет проблем :)
  4. Выход из MySQL
  5. Перезапустите MySQL (остановите, затем запустите)
  6. Войдите в MySQL как пользователь root.
  7. Получите ОШИБКУ 3664 при попытке DROP базы данных или ALTER таблиц, которые я ранее создал, мешая любым DROP или ALTER : (

Кажется, чтоперезапуск MySQL позволяет ему распознавать новые изменения в базе данных и таблицах и обновлять некие метаданные SDI (информация о сериализованном словаре) , связанные с моими InnoDB таблицами базы данных и табличным пространством, которые я хочу изменить.Информация SDI мешает моим ALTER и DROP командам. Может ли это быть ошибкой в ​​MySQL? Или, может ли мой пользователь root не иметь разрешения на запуск команд, которые изменяют данные SDI? (Хотя в документации сказано, что SDIданные изменяются внутреннимAPI.)

Это происходит со мной КАЖДЫЙ РАЗ, когда я создаю базу данных и таблицы.Итак, мой очень вредный обходной путь для этой ошибки :

  1. Вручную удалите файлы данных, связанные с базой данных, в каталоге данных.
  2. Вызовите DROP DATABASE IF EXISTS MyDatabase; (может потребоваться выйти из системы / выполнить пару раз или перезапустить MySQL и попытаться получить доступ к таблицам с помощью операторов SELECT, чтобы это наконец заработало)
  3. Создайте заново необходимую базу данных и таблицы.

Любая помощь будет принята с благодарностью!Спасибо!


Я использую MySQL 8.0.11 Community Server на Mac.

Та же проблема без решения: Невозможно удалить базу данных mysql: ОШИБКА 3664(HY000)

Ответы [ 5 ]

0 голосов
/ 26 октября 2018

Я и несколько моих учеников видим, что эта проблема возникает все больше и больше.

В качестве обходного пути я нашел, что если вы зайдете и сделаете analyze table для всех таблиц в базе данных проблемэта ошибка будет исправлена ​​до следующей перезагрузки сервера.

0 голосов
/ 26 октября 2018

FWIW, я получаю ту же ошибку «Не удалось установить SDI» при попытке:

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

В моем случае движки таблиц представляли собой сочетание InnoDB и MyISAM.Все они должны были быть InnoDB, и когда я переключил их и перезапустил сервер MySQL, казалось, что все работает.

В каталоге данных MySql (/usr/local/mysql/data/MyDb/ на моем компьютере) было множество .sdi файлов.) ... который представляет собой простой json файл с метаданными, относящимися к конкретной таблице.Эти SDI-файлы, по-видимому, существуют только для таблиц MyISAM.

Прежде чем я это понял, я решил, что SDI-файл для конкретной таблицы должен отсутствовать или что-то в этом роде, и выясняется, что mysql имеет ibd2sdi утилита в своем каталоге bin, которая может создавать SDI-файл из таблиц ibd файлов (которые также находятся в каталоге данных).

Если вам нужно придерживаться MyISAM, она можетстоит взглянуть на это.Будьте осторожны с изменением содержимого файла SDI, хотя, когда я наткнулся на эту цитату в рабочих журналах MySql :

При этом нужно быть очень осторожным - изменения, которыенесовместимы с тем, что хранится в файлах .MYD и .MYI, например, изменение типа данных столбца может привести к катастрофическим последствиям, и его следует избегать.

Не знаю, так ли этополезно, но думал, что поделюсь.

0 голосов
/ 10 августа 2018

Если вы очистите все таблицы, вы можете удалить схему.

Интересно, что этот оператор работает, если используется PDO в PHP

$conn->exec("DROP DATABASE IF EXISTS $dbname");
0 голосов
/ 22 августа 2018

Проблема связана с внешними ключами.Этот оператор не выполняется:

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.

Раздражает, мягко говоря.

0 голосов
/ 21 мая 2018

Это связанный патч, который есть в mysql-8.0.11:

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

sdi_debug.result , кажется, указывает, что

SET GLOBAL DEBUG = '-d, sdi_delete_failure';

необходим для преодоления проблемы.

...