怎么损坏mysql_如何修复MySQL中损坏的表
本指南旨在用作診斷MySQL設(shè)置時的故障排除資源和起點。 我們將討論許多MySQL用戶遇到的一些問題,并提供解決特定問題的指導(dǎo)。 我們還將包含指向DigitalOcean教程的鏈接以及在某些情況下可能有用的官方MySQL文檔。
有時,MySQL表可能會損壞,這意味著發(fā)生了錯誤,并且其中包含的數(shù)據(jù)是不可讀的。 嘗試從損壞的表中讀取通常會導(dǎo)致服務(wù)器崩潰。
表損壞的一些常見原因是:MySQL服務(wù)器在寫入過程中停止。
外部程序修改由服務(wù)器同時修改的表。
機器意外關(guān)閉。
計算機硬件出現(xiàn)故障。
MySQL代碼中有一個軟件錯誤。
如果您懷疑其中一個表已損壞,則應(yīng)在排除故障或嘗試修復(fù)表之前備份數(shù)據(jù)目錄。 這有助于最大限度地降低數(shù)據(jù)丟失的風(fēng)險。
首先,停止MySQL服務(wù):sudo systemctl stop mysql
然后將所有數(shù)據(jù)復(fù)制到新的備份目錄中。 在Ubuntu系統(tǒng)上,默認數(shù)據(jù)目錄是/var/lib/mysql/ :cp -r /var/lib/mysql /var/lib/mysql_bkp
進行備份后,您就可以開始調(diào)查表實際上是否已損壞。 如果表使用MyISAM存儲引擎 ,您可以通過從MySQL提示符運行CHECK TABLE語句來檢查它是否已損壞:CHECK TABLE table_name;
此語句的輸出中將顯示一條消息,告知您是否已損壞。 如果MyISAM表確實已損壞,通常可以通過發(fā)出REPAIR TABLE語句來修復(fù)它:REPAIR TABLE table_name;
假設(shè)修復(fù)成功,您將在輸出中看到如下消息:Output+--------------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status | OK |
+--------------------------+--------+----------+----------+
但是,如果表仍然存在損壞,那么MySQL文檔提供了一些修復(fù)損壞表的替代方法 。
另一方面,如果損壞的表使用InnoDB存儲引擎 ,那么修復(fù)它的過程將會有所不同。 從版本5.5開始,InnoDB是MySQL中的默認存儲引擎,它具有自動損壞檢查和修復(fù)操作。 InnoDB通過在其讀取的每個頁面上執(zhí)行校驗和來檢查損壞的頁面,如果它發(fā)現(xiàn)校驗和差異,它將自動停止MySQL服務(wù)器。
很少需要修復(fù)InnoDB表,因為InnoDB具有崩潰恢復(fù)機制,可以在服務(wù)器重新啟動時解決大多數(shù)問題。 但是,如果您確實遇到需要重建損壞的InnoDB表的情況,則MySQL文檔建議使用“轉(zhuǎn)儲和重新加載”方法 。 這涉及重新訪問損壞的表,使用mysqldump實用程序創(chuàng)建表的邏輯備份 ,該表將保留表結(jié)構(gòu)及其中的數(shù)據(jù),然后將表重新加載回數(shù)據(jù)庫。
考慮到這一點,嘗試重新啟動MySQL服務(wù),看看這樣做是否允許您訪問服務(wù)器:sudo systemctl restart mysql
如果服務(wù)器仍然崩潰或無法訪問,那么啟用InnoDB的force_recovery選項可能會有所幫助。 您可以通過編輯mysqld.cnf文件來完成此操作:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]部分中,添加以下行:
/etc/mysql/mysql.conf.d/mysqld.cnf. . .
[mysqld]
. . .
innodb_force_recovery=1
保存并關(guān)閉該文件,然后再次嘗試重新啟動MySQL服務(wù)。 如果可以成功訪問損壞的表,請使用mysqldump實用程序?qū)⒈頂?shù)據(jù)轉(zhuǎn)儲到新文件。 你可以隨意命名這個文件,但是在這里我們將它命名為out.sql :mysqldump database_name table_name > out.sql
然后從數(shù)據(jù)庫中刪除表。 為避免重新打開MySQL提示符,可以使用以下語法:mysql -u user -p --execute="DROP TABLE database_name.table_name"
在此之后,使用剛剛創(chuàng)建的轉(zhuǎn)儲文件恢復(fù)表:mysql -u user -p < out.sql
請注意,InnoDB存儲引擎通常比舊的MyISAM引擎更具容錯能力。 使用InnoDB的表仍然可以被破壞,但由于其自動恢復(fù)功能 ,表損壞和崩潰的風(fēng)險明顯降低。
總結(jié)
以上是生活随笔為你收集整理的怎么损坏mysql_如何修复MySQL中损坏的表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp连接mysql数据库代码_JSP连
- 下一篇: mysql 随机update_MySQL