GreatSQL資料庫DROP表後無法重建

GreatSQL發表於2024-05-17

一、資料庫資訊:

資料庫版本:5.7.21-log

某銀行測試資料庫,APP業務庫內有一個含有大量(幾百個)分割槽表的大表test_app。DROP該分割槽表的大表後導致無法重建該分割槽表。

二、問題描述:

客戶使用“drop table test_app;”時,顯示錶刪除成功。當重新執行該表的建表語句時,報錯“Table 'app.test_app /* Partition p0 */' already exists”

三、問題分析:

3.1> 原因是GreatSQL 5.7資料庫DDL沒有原子性,drop表的刪除動作沒有執行完成;

3.2> 進入資料庫“show tables”檢視test_app表已不存在;

3.3> 進入資料庫所在的目錄下,檢視test_app表的相關檔案。test_app.frm檔案已不存在,但是有大量的"test_app#P***.ibd"分割槽表檔案存在。關閉資料庫,移除這些分割槽表檔案到其他目錄,啟動資料庫;資料庫無法啟動,報“無法找到這些分割槽表檔案”的錯誤;

3.4> 重新建立test_app表時,報“table already exists”錯。

3.5> 感覺進入了死衚衕,最先想到的直截了當方法是備份APP業務庫內除這張表的其他表,刪除該資料庫後,進行APP業務資料庫的恢復,該方法沒有測試,覺得太麻煩。

四、問題處理(方法一,測試步驟):

4.1> 新建一個臨時庫test,依據app庫目錄裡的資料檔名稱,修改建表語句後,執行test_app表的建表SQL語句,生成test_app.frm檔案;

4.2> 關閉資料庫,修改資料庫配置檔案my.cnf檔案的引數為“innodb_file_per_table=OFF”;

4.3> 把臨時庫test目錄下的test_app.frm檔案複製到業務資料庫app目錄下,啟動資料庫;

4.4> 進入業務資料庫APP,可以看到test_app表;

4.5> 執行“drop table test_app;”語句,成功刪除了表。關閉資料庫;

4.6> 進入業務資料庫app對應的目錄下,test_app.frm檔案已不存在,但是有個test_app#P***.ibd分割槽表檔案存在。手工刪除該ibd檔案。

4.7>修改資料庫配置檔案my.cnf檔案的引數為“innodb_file_per_table=ON”;啟動資料庫。

4.8> 重新執行test_app表的建表SQL語句。即可成功建立表。

五、問題處理(方法二,客戶執行步驟):

5.1> 設定innodb_file_per_table=OFF:set global innodb_file_per_table='OFF';

5.2> 執行test_app表的建表語句,建表成功。

5.3> 刪除test_app表drop table test_app;

5.4> 重啟資料庫。

5.5> 再執行test_app表的建表語句,建表成功。


Enjoy GreatSQL 😃

關於 GreatSQL

GreatSQL是適用於金融級應用的國內自主開源資料庫,具備高效能、高可靠、高易用性、高安全等多個核心特性,可以作為MySQL或Percona Server的可選替換,用於線上生產環境,且完全免費併相容MySQL或Percona Server。

相關連結: GreatSQL社群 Gitee GitHub Bilibili

GreatSQL社群:

社群部落格有獎徵稿詳情:https://greatsql.cn/thread-100-1-1.html

image-20230105161905827

技術交流群:

微信:掃碼新增GreatSQL社群助手微信好友,傳送驗證資訊加群

image-20221030163217640

相關文章