MySQL 5.6執行DDL報錯ERROR 1050 (42S01): Table 'sms/#sql-ib752' already exist

feelpurple發表於2018-09-30

執行ALTER TABLE增加欄位的時候報錯:

mysql> ALTER TABLE who_sku_relation ADD COLUMN red_line_price DECIMAL(10,2) NOT NULL DEFAULT '0.00';
ERROR 1050 (42S01): Table 'sms/#sql-ib75227' already exists


報錯原因:

在alter table的過程中,MySQL當機,會在資料目錄裡存在資料變更的中間表,中間表是以“#sql-”開頭的臨時表。

臨時表不手動刪除掉,無法在相應的表上執行 ALTER TABLE 語句。


在資料目錄裡面檢視臨時表的資訊,找不到 .frm表結構檔案和 .ibd資料檔案。

$ ls -l | grep  '#sql-ib75227*' | wc -l


解決方法:

手動建立 .frm表結構檔案和 .ibd資料檔案,之後刪除臨時表。


建立一張測試表。

mysql> use test
mysql> create table test.tmp like sms.who_sku_relation;
Query OK, 0 rows affected (0.00 sec)


將測試表的 .frm 表結構檔案複製成臨時表的 .frm 表結構檔案和 .ibd 資料檔案。

$ cp ../test/tmp.frm  "#sql-ib75227.frm"
$ cp ../test/tmp.frm  "#sql-ib75227.ibd"
$ ls -l \#sql-ib75227*
-rw-r----- 1 tungsten mysql 15007 Sep 29 21:23 #sql-ib75227.frm
-rw-r----- 1 tungsten mysql 15007 Sep 29 21:25 #sql-ib75227.ibd


在資料庫中 DROP 臨時表,並在原來增加表結構出錯的表上執行結構變更。

mysql> drop table `#mysql50##sql-ib75227`;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE who_sku_relation ADD COLUMN red_line_price DECIMAL(10,2) NOT NULL DEFAULT '0.00';
ERROR 1813 (HY000): Tablespace for table 'sms/#sql-ib75227' exists. Please DISCARD the tablespace before IMPORT.


刪除掉資料檔案中殘留的臨時表資料檔案。

$ ls -l \#sql-ib75227*
-rw-r----- 1 tungsten mysql 15007 Sep 29 21:25 #sql-ib75227.ibd
$ rm "#sql-ib75227.ibd"


執行資料庫表結構變更

mysql> ALTER TABLE who_sku_relation ADD COLUMN red_line_price DECIMAL(10,2) NOT NULL DEFAULT '0.00';
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-2215370/,如需轉載,請註明出處,否則將追究法律責任。

相關文章