MySql 1050:MySQLSyntaxErrorException:表'my_db / #sql-ib520'已经存在

时间:2014-08-15 11:51:10

标签: mysql sql

我尝试执行以下ALTER TABLE语句:

ALTER TABLE `my_table` ADD COLUMN `new_column` LONGTEXT NULL DEFAULT NULL AFTER `old_column`;

在执行脚本期间我有

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

看来这使得数据库处于不一致状态,因为没有添加新字段,当我再次尝试执行脚本时,我收到了这个奇怪的错误。

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'my_db/#sql-ib520' already exists

我的数据库中没有 #sql-ib520 表,所以根据我的理解,它必须是MySQL创建的临时表。

之前是否有人遇到此错误,我该如何解决? 感谢名单

修改 我已经尝试了Alex建议的脚本,但我没有工作:

drop table `#mysql50##sql-ib520`;
ERROR 1051 (42S02): Unknown table 'my_db.#mysql50##sql-ib520'

更新 我正在使用Amazon RDS和MySQL 5.6.12

2 个答案:

答案 0 :(得分:1)

毕竟,由于我使用AWS RDS实例,因此Alex推荐的脚本不起作用。 MySQL文档还推荐使用此脚本,您可以找到有关孤立中间表的更多信息here

对于 AWS RDS ,我发现只有一个post没有亚马逊员工提供的解决方案。如果提供了一些解决方案,您可能需要关注此帖子。

所以,目前,我唯一的解决方案是转储现有数据库并创建一个新数据库。

答案 1 :(得分:1)

我也使用AWS RDS实例,并对此问题进行了大量阅读。虽然我没有找到一个很好的解决方案,但这里是我如何通过仅替换一个表而不是整个数据库来修复它。

如果您运行此命令:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES

您可以看到数据库表的完整列表,包括孤立表,它通常不可见。我的两个问题表是:

ID  NAME
407 my_database/#sql-ib379
379 my_database/users

因为我在DB崩溃时试图改变我的用户表。现在,如上所述,我无法运行任何进一步的ALTER TABLE命令,因为它试图为任何后续查询创建相同的临时表。我尝试了所有内容来删除孤立表,但使用了' my_database /'部分,它似乎没有可能。我也不想删除并重新创建整个数据库,我注意到孤立表引用了users表的内部ID(#sql-ib 379 ),所以我想我会换掉它。这里有一个小MySQL脚本为我做了诀窍:

-- temporarily disable foreign key checks
SET foreign_key_checks = 0;

-- replace this line with query to create a structural copy of the users table 
-- named users_copy, including foreign keys if you use them

-- copy everything from original table into new table
INSERT INTO `users_copy` SELECT * FROM `users`;

确保一切正常,然后运行:

-- rename the existing table
RENAME TABLE `users` TO `users_backup`;

-- in case the copy process took some time, and there were additional rows added 
-- to the original table, grab them and put them into the copy table
INSERT INTO `users_copy` SELECT * FROM `users_backup` WHERE `users_backup`.id > (SELECT MAX(id) FROM `users_copy`);

-- finally, rename the copy table to the original table name
RENAME TABLE `users_copy` TO `users`;

- re-enable foreign key checks
SET foreign_key_checks = 1;

如果你不使用外键,你现在应该好好去。我建议保留备份表以防万一,但是一旦删除该备份表,它也应该删除孤立表。 但是,如果您正在使用外键,更新对原始表名称的引用非常重要(在本例中为用户)!根据您设置外键的方式,依赖于用户的其他表现在将引用users_backup,这可能会导致数据丢失问题。

希望这有帮助。