我正在尝试恢复一个半损坏的InnoDB表。在尝试向表中添加新索引时,我注意到了这个问题。
ALTER TABLE `<table>` ADD INDEX `<name>`
ERROR 1712 (HY000): Index "TEST008"--temporary-- is corruptedcheck 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重新创建表
发布于 2020-07-02 12:43:25
我同意@nbk的观点,如果您不能处理损坏的索引,您将需要重新构建表。你偶尔会做备份吗?在示例中,我停止了数据库服务并复制了整个数据库目录,包括MariaDB二进制文件和所有内容。在你需要冗余之前,冗余看起来有点过头了。
完成重建表的最基本方法是使用以下方法:
INSERT INTO `table_new` SELECT * FROM `table_old`;网上有一些关于如何更快做到这一点的帖子,不过这个帖子我可以用MariaDB测试一下,没有错误。只需重命名旧表,以防在重新构建表后找到更好的方法。我最近更新了我十年前创建的一些数据库表,因为有人给了我关于命名约定的糟糕建议,现在如果需要的话,我可以极大地扩展该软件的功能。
祝好运!
发布于 2020-07-02 13:51:49
您应该检查索引状态,这些状态不会在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`;有关更多信息,请阅读Create Temporary table
确保会发生这种情况,因为这个内存表可能会因为索引大小而失败。如果发生这种情况,您应该增加或更改正在使用的散列索引算法。
如果一切正常,则在下一条语句中添加临时表行
注意::请确保添加所有缺少的字段
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表,但我对此表示怀疑。
https://stackoverflow.com/questions/62402675
复制相似问题