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