Spec-Zone .ru
спецификации, руководства, описания, API
|
Информация о табличных определениях хранится оба в .frm
файлы, и в словаре
данных InnoDB. Если Вы перемещаетесь .frm
файлы вокруг, или если
катастрофические отказы сервера в середине работы словаря данных, эти источники информации могут стать
непоследовательными.
Признак словаря данных из синхронизации - это a CREATE
TABLE
сбои оператора. Если это происходит, смотрите в журнале ошибок сервера. Если журнал говорит,
что таблица уже существует в InnoDB
внутренний словарь данных, у Вас есть
осиротевшая таблица в InnoDB
файлы табличной области, у которого нет никакого
соответствия .frm
файл. Сообщение об ошибке похоже на это:
InnoDB: Error: table test/parent already exists in InnoDB internalInnoDB: data dictionary. Have you deleted the .frm fileInnoDB: and not used DROP TABLE? Have you used DROP DATABASEInnoDB: for InnoDB tables in MySQL version <= 3.23.43?InnoDB: See the Restrictions section of the InnoDB manual.InnoDB: You can drop the orphaned table inside InnoDB byInnoDB: creating an InnoDB table with the same name in anotherInnoDB: database and moving the .frm file to the current database.InnoDB: Then MySQL thinks the table exists, and DROP TABLE willInnoDB: succeed.
Можно отбросить осиротевшую таблицу, следуя инструкциям, данным в сообщении об ошибке. Если Вы все еще
неспособны использовать DROP TABLE
успешно, проблема может быть должна назвать завершение в mysql клиенте. Чтобы работать вокруг этой проблемы,
запустите mysql клиент с --skip-auto-rehash
опция и попытка DROP TABLE
снова. (С завершением имени на mysql пытается создать список имен таблиц, который перестал
работать, когда проблема такой как только описано существует.)
Другой признак словаря данных из синхронизации - то, что MySQL печатает ошибку, что он не может открыть a .InnoDB
файл:
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
В журнале ошибок можно найти сообщение как это:
InnoDB: Cannot find table test/child2 from the internal data dictionaryInnoDB: of InnoDB though the .frm file for the table exists. Maybe youInnoDB: have deleted and recreated InnoDB data files but have forgottenInnoDB: to delete the corresponding .frm files of InnoDB tables?
Это означает, что есть осиротевшее .frm
файл без соответствующей таблицы внутри
InnoDB
. Можно отбросить осиротевшее .frm
файл, удаляя
это вручную.
Если MySQL отказывает в середине ALTER TABLE
работа, можно закончить с осиротевшей временной таблицей в InnoDB
табличная
область. Используя Табличный Монитор, можно видеть, перечислял таблицу с именем, которое начинается #sql-
. Можно выполнить SQL-операторы на таблицах, имя которых содержит
символ"#
"если Вы
включаете имя в пределах обратных галочек. Таким образом можно отбросить такую осиротевшую таблицу как любая
другая осиротевшая таблица, используя метод, описанный ранее. Чтобы скопировать или переименовать файл в
оболочке Unix, Вы должны поместить имя файла в двойные кавычки, если имя файла содержит"#
".
С innodb_file_per_table
включенный, следующее сообщение могло бы произойти если .frm
или .ibd
файлы (или оба) отсутствуют:
InnoDB: in InnoDB data dictionary has tablespace id N
,InnoDB: but tablespace with that id or name does not exist. HaveInnoDB: you deleted or moved .ibd files?InnoDB: This may also be a table created with CREATE TEMPORARY TABLEInnoDB: whose .ibd and .frm files MySQL automatically removed, but theInnoDB: table still exists in the InnoDB internal data dictionary.
Если это происходит, попробуйте следующую процедуру, чтобы разрешить проблему:
Создайте соответствие .frm
файл в некотором другом
каталоге базы данных и копии это к каталогу базы данных, где таблица висячей строки располагается.
Проблема DROP
TABLE
для исходной таблицы. Это должно успешно отбросить таблицу и InnoDB
должен напечатать предупреждение журналу ошибок что .ibd
файл
отсутствовал.