新聞中心
在 MySQL 數(shù)據(jù)庫(kù)中,刪除數(shù)據(jù)是一項(xiàng)非常常見(jiàn)的操作,但有時(shí)候我們會(huì)意外地刪除了一些數(shù)據(jù),導(dǎo)致不可逆的損失。為了避免這種情況的發(fā)生,MySQL 數(shù)據(jù)庫(kù)提供了回滾刪除操作的功能,可以恢復(fù)被誤刪的數(shù)據(jù)。接下來(lái)我們將詳細(xì)介紹。

十多年的北京網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整北京建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“北京網(wǎng)站設(shè)計(jì)”,“北京網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
什么是回滾操作?
回滾操作是指將數(shù)據(jù)庫(kù)操作回退到之前的狀態(tài),取消未提交的操作。比如,當(dāng)您對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次更新操作后,您可能會(huì)發(fā)現(xiàn),您的操作并不是您期望的結(jié)果,此時(shí)您可以使用回滾操作來(lái)取消這個(gè)操作?;貪L操作可以讓您將數(shù)據(jù)庫(kù)狀態(tài)回退到修改前,從而實(shí)現(xiàn)恢復(fù)數(shù)據(jù)的目的。
MySQL 的回滾操作支持事務(wù),事務(wù)是 MySQL 中執(zhí)行多個(gè) DML(數(shù)據(jù)操作語(yǔ)言)語(yǔ)句的一個(gè)邏輯單元,事務(wù)中包含的語(yǔ)句要么全部執(zhí)行,要么全部不執(zhí)行。如果在執(zhí)行某個(gè)事務(wù)過(guò)程中,其中一個(gè)語(yǔ)句失敗了,整個(gè)操作將被回滾。
如何使用回滾操作?
接下來(lái)我們將介紹。
之一步:備份數(shù)據(jù)庫(kù)
在進(jìn)行任何的操作之前,我們首先需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份,以避免因誤操作造成的不可逆性損失。在 MySQL 中,我們可以通過(guò) mysqldump 命令將數(shù)據(jù)庫(kù)備份到文件中。以下是備份命令的語(yǔ)法:
“`
mysqldump -u 用戶名 -p 密碼 數(shù)據(jù)庫(kù)名 > 備份文件名.sql
“`
例如:
“`
mysqldump -u root -p123456 test > test.sql
“`
以上命令表示將 test 數(shù)據(jù)庫(kù)備份至 test.sql 文件中。
第二步:查詢刪除語(yǔ)句
如果您誤刪了某個(gè)數(shù)據(jù),那么之一步是找到刪除數(shù)據(jù)的語(yǔ)句,因?yàn)槟枰ㄟ^(guò)這條語(yǔ)句回滾數(shù)據(jù)庫(kù)。在 MySQL 中,我們可以通過(guò)以下方式查找刪除語(yǔ)句:
1.我們需要查找最后一次刪除操作的時(shí)間:
“`
SELECT * FROM mysql.general_log WHERE command_type=’Query’ AND argument LIKE ‘%DELETE%’ ORDER BY event_time DESC LIMIT 1;
“`
以上命令將返回最近一次的刪除操作的詳細(xì)信息,包括時(shí)間、用戶、主機(jī)名、數(shù)據(jù)庫(kù)名和刪除語(yǔ)句等。
2.將刪除語(yǔ)句復(fù)制下來(lái),注意不要執(zhí)行它。
第三步:使用回滾操作
接下來(lái)就是使用回滾操作了。如果您要回滾的是一條 DML(數(shù)據(jù)操作語(yǔ)言)語(yǔ)句,可以使用回滾語(yǔ)句來(lái)撤銷該操作。以下是回滾語(yǔ)句的語(yǔ)法:
“`
ROLLBACK;
“`
例如:
“`
ROLLBACK;
“`
以上命令表示回滾最近的事務(wù)。
如果您要回滾的是某個(gè)時(shí)間段內(nèi)的操作,可以使用以下命令進(jìn)行回滾:
“`
START TRANSACTION;
回滾語(yǔ)句
COMMIT;
“`
例如:
“`
START TRANSACTION;
DELETE FROM test WHERE id=1;
ROLLBACK;
COMMIT;
“`
以上命令表示在一個(gè)事務(wù)中執(zhí)行了 DELETE FROM test WHERE id=1 操作,隨后回滾該操作。
需要注意的是,回滾操作只能恢復(fù)未提交的操作,如果您已經(jīng)提交了操作,那么回滾操作將無(wú)法恢復(fù)。
在使用 MySQL 數(shù)據(jù)庫(kù)時(shí),誤操作是不可避免的,但是我們可以通過(guò)備份數(shù)據(jù)庫(kù)以及回滾操作來(lái)保護(hù)數(shù)據(jù)的完整性。回滾操作能夠幫助我們恢復(fù)誤刪的數(shù)據(jù),但同時(shí)也需要謹(jǐn)慎使用,以避免進(jìn)一步的數(shù)據(jù)損失。
相關(guān)問(wèn)題拓展閱讀:
- mysql truncate 導(dǎo)致事務(wù)回滾失敗
- Mysql Innodb數(shù)據(jù)庫(kù)誤刪除了文件,怎么恢復(fù)?
mysql truncate 導(dǎo)致事務(wù)回滾失敗
mysql 中的truncate 和delete 都能夠清理表中數(shù)據(jù),但是它們有什么區(qū)別呢
在一個(gè)事務(wù)中使用了truncate 會(huì)導(dǎo)致后續(xù)的sql 無(wú)法回滾。
truncate 會(huì)刪除所有數(shù)據(jù),并且不記錄日志,不可以恢復(fù)數(shù)拍絕據(jù),相當(dāng)于保留了表結(jié)構(gòu)笑爛,重新建立了一張同樣的表。由于數(shù)據(jù)不可恢復(fù),truncate 之前的操作也不能回滾。碰賀漏
Mysql Innodb數(shù)據(jù)庫(kù)誤刪除了文件,怎么恢復(fù)?
經(jīng)常性備份,如果binlog在的話,試試看……
– 恢復(fù)策略
前面說(shuō)到未提交的事務(wù)和回滾了的事務(wù)也會(huì)記錄Redo Log,因此在進(jìn)行恢復(fù)時(shí),這些事務(wù)要進(jìn)行特殊的的處理.有2中不同的恢復(fù)策略:
A. 進(jìn)行恢復(fù)時(shí),只重做已經(jīng)提梁襪如交了的事務(wù)。
B. 進(jìn)行恢復(fù)時(shí),重做所有事務(wù)包括未提交的事務(wù)和回滾了的事務(wù)。然后通過(guò)Undo Log回滾那些未提交的事務(wù)。
– InnoDB存儲(chǔ)引擎的恢復(fù)機(jī)制
MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎使用了B策略, InnoDB存儲(chǔ)引擎中的恢復(fù)機(jī)制有幾個(gè)特點(diǎn):
A. 在重做Redo Log時(shí),并不關(guān)心事務(wù)性。 恢復(fù)時(shí),沒(méi)有BEGIN,也沒(méi)有COMMIT,ROLLBACK的行為。也不關(guān)心每個(gè)日志是哪個(gè)事務(wù)的。盡管事務(wù)ID等事務(wù)相關(guān)的內(nèi)容會(huì)記入Redo Log,這些內(nèi)容只是被當(dāng)作要操作的數(shù)據(jù)的一部分。
B. 使用B策略就必須要將Undo Log持久化,而且必須要在寫Redo Log之前將對(duì)應(yīng)的Undo Log寫入磁盤。Undo和Redo Log的這種關(guān)聯(lián),使得持久化變得復(fù)雜起來(lái)。為了降低復(fù)雜度,InnoDB將Undo Log看好燃作數(shù)據(jù),因此記錄Undo Log的操作也會(huì)記錄到redo log中。這樣undo log就可以像數(shù)據(jù)一樣緩存起來(lái),而不用再redo log之前寫入磁盤了。
包含Undo Log操作的Redo Log,看起來(lái)是這樣的:
記錄1: >
記錄2:
記錄3: >
記錄4:
記錄5: >
記錄6:
C. 到這里,還有一個(gè)問(wèn)題沒(méi)有弄清楚。既然Redo沒(méi)有事務(wù)性,那豈不是會(huì)重新執(zhí)行被回滾了的事務(wù)?確實(shí)是這樣。同時(shí)Innodb也會(huì)將事務(wù)回滾時(shí)的操作也記錄到redo log中?;貪L操作本質(zhì)上也是對(duì)數(shù)據(jù)進(jìn)行修改,因此回滾時(shí)對(duì)數(shù)據(jù)的操作也會(huì)記錄到Redo Log中。
一個(gè)回滾了的事務(wù)的Redo Log,看起來(lái)是這樣的:
記錄1: >
記錄2:
記錄3: >
記錄4:
記錄5: >
記錄6:
記錄7:
記錄8:
記錄9:
一個(gè)被回滾了的事務(wù)在恢復(fù)時(shí)的操作就是先redo再undo,因此不會(huì)破壞數(shù)據(jù)的一致性.
– InnoDB存儲(chǔ)引擎中相關(guān)的函數(shù)
Redo: recv_recovery_from_checkpoint_start()
Undo: recv_recovery_rollback_active()
Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()
還原也是有節(jié)點(diǎn)的,
既然只有前5、6天的備份,那腔此搜還原的話也只能還原到前伍歷5、扒燃6天的情況了。
個(gè)人認(rèn)為:重要的數(shù)據(jù)備份的頻率更好調(diào)高一點(diǎn),以免出現(xiàn)問(wèn)題時(shí)造成不必須的損失。
數(shù)據(jù)非常重要的話建議還是找專業(yè)的地方恢復(fù),自己嘗試恢復(fù)的話很可能導(dǎo)致數(shù)據(jù)損壞無(wú)法恢復(fù)的
bin-log也沒(méi)了嗎
mysql數(shù)據(jù)庫(kù)回滾刪除的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于mysql數(shù)據(jù)庫(kù)回滾刪除,如何使用 MySQL 數(shù)據(jù)庫(kù)回滾刪除操作,mysql truncate 導(dǎo)致事務(wù)回滾失敗,Mysql Innodb數(shù)據(jù)庫(kù)誤刪除了文件,怎么恢復(fù)?的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)網(wǎng)絡(luò)推廣網(wǎng)站建設(shè),網(wǎng)站設(shè)計(jì),網(wǎng)站建設(shè)公司,網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),1500元定制網(wǎng)站優(yōu)化全包,先排名后付費(fèi),已為上千家服務(wù),聯(lián)系電話:13518219792
當(dāng)前標(biāo)題:如何使用MySQL數(shù)據(jù)庫(kù)回滾刪除操作(mysql數(shù)據(jù)庫(kù)回滾刪除)
轉(zhuǎn)載來(lái)于:http://fisionsoft.com.cn/article/cohgcip.html


咨詢
建站咨詢
