首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Drop --temporary--索引在Mysql/Mariadb中

Drop --temporary--索引在Mysql/Mariadb中
EN

Stack Overflow用户
提问于 2020-06-16 15:00:10
回答 2查看 274关注 0票数 3

我正在尝试恢复一个半损坏的InnoDB表。在尝试向表中添加新索引时,我注意到了这个问题。

代码语言:javascript
复制
ALTER TABLE `<table>` ADD INDEX `<name>`
ERROR 1712 (HY000): Index "TEST008"--temporary-- is corrupted

check table <table> EXTENDED没有注意到这个问题。

代码语言:javascript
复制
+---------------+-------+----------+----------+
| Table         | Op    | Msg_type | Msg_text |
+---------------+-------+----------+----------+
| <table>       | check | status   | OK       |
+---------------+-------+----------+----------+

我曾尝试使用ALTER TABLE table drop index "TEST008"--temporary--\删除损坏的索引,但以

代码语言:javascript
复制
ERROR 1091 (42000): Can't DROP '"TEST008"--temporary--'; check that column/key exists

我是否被迫使用例如OPTIMIZE重新创建表

EN

回答 2

Stack Overflow用户

发布于 2020-07-02 12:43:25

我同意@nbk的观点,如果您不能处理损坏的索引,您将需要重新构建表。你偶尔会做备份吗?在示例中,我停止了数据库服务并复制了整个数据库目录,包括MariaDB二进制文件和所有内容。在你需要冗余之前,冗余看起来有点过头了。

完成重建表的最基本方法是使用以下方法:

代码语言:javascript
复制
INSERT INTO `table_new` SELECT * FROM `table_old`;

网上有一些关于如何更快做到这一点的帖子,不过这个帖子我可以用MariaDB测试一下,没有错误。只需重命名旧表,以防在重新构建表后找到更好的方法。我最近更新了我十年前创建的一些数据库表,因为有人给了我关于命名约定的糟糕建议,现在如果需要的话,我可以极大地扩展该软件的功能。

祝好运!

票数 1
EN

Stack Overflow用户

发布于 2020-07-02 13:51:49

您应该检查索引状态,这些状态不会在CHECK TABLE下显示。

要执行此操作,请尝试执行以下操作

代码语言:javascript
复制
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"。如果这都不起作用..。克隆/复制表内容,将其删除并重新创建。

代码语言:javascript
复制
CREATE TEMPORARY TABLE `backupTable`
  SELECT * FROM `yourTable`;

有关更多信息,请阅读Create Temporary table

确保会发生这种情况,因为这个内存表可能会因为索引大小而失败。如果发生这种情况,您应该增加或更改正在使用的散列索引算法。

如果一切正常,则在下一条语句中添加临时表行

注意::请确保添加所有缺少的字段

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62402675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档