MySQL 是最受歡迎的開源 RDBMS(關聯式資料庫管理系統)。它是快速增長的 LAMP Stack 中不可或缺的一部分,並在開發人員和系統管理員中贏得了極高的人氣。與 非關聯式資料庫 相比,SQL 提供了出色的功能來有效地整理、儲存和管理資料。SQL 資料庫獨特的資料表排列功能和卓越的能力,使其成為各種規模(無論大小)組織中所有層級的首選。
MySQL 資料表在極少數情況下可能會損壞,這表示發生了此類錯誤,且其中儲存的資料無法讀取。當您嘗試從損壞的資料表中讀取資料時,伺服器會崩潰並拋出錯誤或錯誤列表。
MySQL 資料表損壞的潛在原因
以下是資料表損壞的一些最典型原因:
- MySQL 服務在重啟後崩潰。
- 機器因電力中斷而意外關機。
- 記憶體損壞或硬體故障。
- 軟體錯誤,存在於 OS 或 SQL 程式碼中。
- MySQL 在寫入時關閉。
- 系統轉為 OFF 狀態,此時正在更新 SQL。
在修復您懷疑已損壞的資料表之前,請先建立資訊目錄的備份。這將有助於降低資料遺失的可能性。在此快速指南中,我們將引導您完成在 MySQL 中修復損壞資料表的疑難排解步驟。
先決條件
要進行本教學,您需要滿足以下條件:
- 您的系統上已安裝最新版本的 Ubuntu。
- 系統使用者必須擁有 sudo 權限.
- 如果您在存取 sudo 帳戶時遇到困難,請考慮變更 MySQL root 密碼.
- MySQL 已設定 於您的伺服器上。
步驟 1:停止 MySQL 服務並備份資料
首先,使用 systemctl 指令停止 MySQL 服務:
|
1 |
sudo systemctl stop mysql |
停止 SQL 服務後,下一步是將所有現有檔案備份到新目錄中。使用 Ubuntu 的預設資料目錄 /var/lib/mysql/ 來複製所有系統資料:
|
1 |
cp -r /var/lib/mysql /var/lib/mysql_bkp |
步驟 2:識別錯誤
接下來,我們將開始調查並識別損壞的資料表。如果該資料表使用的是 MyISAM 儲存引擎,請使用 CHECK TABLE 陳述式並驗證資料表的狀態:
|
1 |
mysql> CHECK TABLE table_name; |
您將在輸出中看到一條訊息,確認損壞的一個或多個資料表。
步驟 3:修復損壞的資料表
如果 MyISAM 資料表上存在錯誤且您已識別出該錯誤,請使用 REPAIR TABLE 陳述式來修復錯誤:
|
1 |
mysql> REPAIR TABLE table_name; |
如果修復成功,您應該會看到以下無錯誤的訊息作為輸出:
|
1 2 3 4 5 6 7 8 9 10 11 |
Output: +--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+ |
但是,如果您發現錯誤再次出現,請遵循 MySQL 8.0 版本官方文件 來重建或修復資料表。
與 MyISAM 儲存引擎 不同,在 InnoDB 儲存引擎 中修復資料表所涉及的 InnoDB 程序有所不同。InnoDB 是 MySQL 8.0 中的預設儲存引擎。它具有自動損壞檢查和修復操作功能。MySQL InnoDB 會透過對其讀取的每個頁面執行總和檢查碼(checksum)來檢查損壞的頁面。如果偵測到不一致,它將自動停止 MySQL 伺服器。
總之,極少需要修復 InnoDB 資料表。InnoDB 具有崩潰復原機制,可以透過重新啟動來解決大多數問題。
嘗試重新啟動 MySQL 服務,看看是否可以存取伺服器:
|
1 |
sudo systemctl restart mysql |
如果您在重啟後仍無法重建損壞的 InnoDB 資料表,請嘗試 MySQL 文件中建議的「Dump and Reload」方法。此方法涉及使用 mysqldump 工具重新取得對損壞資料表的存取權。必須建立一個資料夾來儲存並保留該資料表的 邏輯備份。錯誤修復後,它會將資料表重新載入回資料庫中。
步驟 4:利用 innodb_force_recovery 選項
如果伺服器持續崩潰或無法連線,請嘗試使用 InnoDB 中的 force_recovery 選項。將 ON the force_recovery 選項是還原 MySQL 資料庫的極佳方法。您可以透過在 mysqld.cnf 檔案中,使用 nano 文字編輯器進行修改來啟用此選項:
|
1 |
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf |
在 [mysqld] 區段下方插入以下行:

儲存並關閉檔案,然後重啟 MySQL 服務。
步驟 5:建立 a mysqldump 檔案
如果您能夠存取損壞的資料表,請使用 mysqldump 選項將所有傾印內容放入新檔案中。根據您的偏好為新檔案命名,並確保在末尾加上 .sql 副檔名。在這裡,我們將檔案命名為 demo.sql:
|
1 |
mysqldump database_name table_name > demo.sql |
之後,使用 DROP TABLE 查詢從資料庫中移除該資料表。您可以使用以下語法,以避免需要重新開啟 MySQL 提示字元:
|
1 |
mysql -u user -p --execute="DROP TABLE database_name.table_name" |
然後,使用您剛剛準備的傾印文件 demo.sql 來還原資料表:
|
1 |
mysql -u user -p --database=database_name < demo.sql |
您已成功修復 MySQL 損壞的資料表,並準備好無縫地操作資料庫。
結論
如果您正在處理大量數據,則很可能會發生資料表損壞或非預期的系統崩潰。值得一提的是,MySQL InnoDB 儲存引擎比以前的 MyISAM 引擎更具容錯能力。使用 InnoDB 儲存引擎的資料表仍有可能損壞,但由於其 自動復原功能.
,資料表損壞和故障的危險已顯著降低。 最後,您可以在我們的 部落格:
祝您使用愉快!
留言
目前尚無留言。成為第一個留言的人吧。