Отбросьте - временные-- индексы в Mysql / Mariadb - PullRequest
3 голосов
/ 16 июня 2020

Я пытаюсь восстановить частично поврежденную таблицу InnoDB. Я заметил проблему при попытке добавить новый индекс в таблицу.

ALTER TABLE `<table>` ADD INDEX `<name>`
ERROR 1712 (HY000): Index "TEST008"--temporary-- is corrupted

check table <table> EXTENDED не улавливает проблему.

+---------------+-------+----------+----------+
| Table         | Op    | Msg_type | Msg_text |
+---------------+-------+----------+----------+
| <table>       | check | status   | OK       |
+---------------+-------+----------+----------+

Я пытался удалить поврежденный индекс с помощью ALTER TABLE table DROP INDEX "TEST008"--temporary--\, но в итоге получится

ERROR 1091 (42000): Can't DROP '"TEST008"--temporary--'; check that column/key exists

Я вынужден воссоздать таблицу, например, OPTIMIZE?

Ответы [ 2 ]

1 голос
/ 02 июля 2020

Вы должны проверить статус индексов, который не будет отображаться под CHECK TABLE.

Для этого попробуйте следующее

SHOW VARIABLES LIKE 'userstat';
SET GLOBAL USERSTAT = ON;
-- just to get all columns used from the stats table
-- SHOW COLUMNS FROM `INFORMATION_SCHEMA`.`INDEX_STATISTICS`

-- get all indices just in case
SELECT * FROM  `INFORMATION_SCHEMA`.`INDEX_STATISTICS`;

-- get all indices for the table
SELECT * FROM  `INFORMATION_SCHEMA`.`INDEX_STATISTICS` WHERE `TABLE_NAME` = 'yourTable';

Это позволит выяснить, что индексировано, а что не в ваших таблицах.

Другое дело, что при добавлении / удалении индексов лучше использовать тики типа \ TEST008``, чем "TEST008". Если это не работает ... клонируйте / скопируйте содержимое таблицы, отбросьте его и создайте заново.

CREATE TEMPORARY TABLE `backupTable`
  SELECT * FROM `yourTable`;

Для получения дополнительной информации прочтите: Создать временную таблицу

Убедитесь, что это произойдет, поскольку эта таблица памяти может выйти из строя из-за размера индекса. Если это произойдет, вам следует увеличить или изменить используемый алгоритм индексации HA SH.

Если все работает как ожидалось ADD строки временной таблицы в следующем операторе

Примечание : обязательно добавьте все недостающие поля

DROP TABLE IF EXISTS `yourTable`;
CREATE TABLE `yourTable`(
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  -- other columns
  PRIMARY KEY(`id`)
) Engine=InnoDB; -- or extend this with collation, and other instructions

INSERT INTO `yourTable`
  SELECT * FROM `backup`;

Это должно сработать.

Последнее решение - жесткое удаление из файловая система таблица InnoDB, но я сомневаюсь, что это так.

1 голос
/ 02 июля 2020

Я согласен с @ nbk , если вы не можете избавиться от поврежденного индекса, вам нужно будет восстановить таблицу. Вы делаете резервные копии время от времени? В примере я буквально останавливаю службу базы данных и копирую весь каталог базы данных, включая двоичный файл MariaDB и все остальное. Избыточность кажется излишней, пока она вам не понадобится.

Самый простой c способ выполнить sh реконструкцию таблицы - использовать следующее:

INSERT INTO `table_new` SELECT * FROM `table_old`;

Есть несколько плавающих потоков в Интернете о том, как сделать это быстрее, хотя этот я мог протестировать без ошибок в MariaDB. Просто переименуйте старую таблицу, если вы найдете лучший подход после , который вы восстановите. Я недавно обновил некоторые таблицы базы данных, которые я создал десять лет спустя go после того, как мне дали плохой совет от кого-то по поводу соглашений об именах, и теперь я могу значительно расширить функциональность этого программного обеспечения, если это необходимо.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...