我尝试执行以下 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 创建的一些临时表。
有没有人以前遇到过这个错误,我该如何解决? 谢谢
编辑 我试过亚历克斯建议的脚本,但我没有工作:
drop table `#mysql50##sql-ib520`;
ERROR 1051 (42S02): Unknown table 'my_db.#mysql50##sql-ib520'
更新 我将 Amazon RDS 与 MySQL 5.6.12 结合使用
最佳答案
我也在使用 AWS RDS 实例,并就此问题进行了大量阅读。虽然我没有找到很好的解决方案,但我通过以下方式解决了这个问题,只替换一个表而不是整个数据库。
如果你运行这个命令:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
您可以看到数据库表的完整列表,包括通常不可见的孤立表。我的两个问题表是:
ID NAME
407 my_database/#sql-ib379
379 my_database/users
因为当数据库崩溃时我正试图更改我的用户表。现在,如上所述,我无法运行任何进一步的 ALTER TABLE 命令,因为它试图为任何后续查询创建相同的临时表。我尝试了所有方法来删除孤立表,但是对于“my_database/”部分,这似乎是不可能的。我也不想删除并重新创建我的整个数据库,我注意到孤立表正在引用用户表的内部 ID (#sql-ib379),所以我想我会把它换掉。这是一个小的 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,这可能会导致数据丢失问题。
希望这对您有所帮助。
关于MySql 1050 : MySQLSyntaxErrorException: Table 'my_db/#sql-ib520' already exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325915/