一、資料庫資訊:
資料庫版本: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
技術交流群:
微信:掃碼新增
GreatSQL社群助手
微信好友,傳送驗證資訊加群
。