最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)誤刪或者誤更新如何恢復(fù)詳細(xì)步驟(一看就會)

 更新時間:2024年10月30日 09:52:09   作者:家鄉(xiāng)的落日  
本文主要為開發(fā)人員提供在測試環(huán)境中恢復(fù)近期誤操作的少量數(shù)據(jù)的方法,首先介紹了如何下載并安裝MyFlash工具,然后詳細(xì)講解了如何利用該工具和MySQL的binlog日志來恢復(fù)誤刪或誤更新的數(shù)據(jù),介紹的非常詳細(xì),需要的朋友可以參考下

本篇文章適用場景

①、測試環(huán)境少量近期誤刪除或者誤更新的數(shù)據(jù)恢復(fù)。

②、測試環(huán)境少量從庫數(shù)據(jù)不一致問題。

備注:大量數(shù)據(jù)的恢復(fù)或者復(fù)制還是需要使用備份數(shù)據(jù),例如使用mysqldump或者M(jìn)ydumper、mysqlshell。(本篇文章對此不做討論)

警告:數(shù)據(jù)恢復(fù)為DBA專業(yè)人員負(fù)責(zé)處理的事情,本文章僅為開發(fā)人員測試環(huán)境恢復(fù)近期誤操作的少量數(shù)據(jù)提供參考。
請對生產(chǎn)環(huán)境數(shù)據(jù)心存敬畏~

一、下載MyFlash工具

# 創(chuàng)建文件夾
mkdir  /web
cd /web

# 下載壓縮包
wget https://codeload.github.com/Meituan-Dianping/MyFlash/zip/master 

# 安裝編譯相關(guān)軟件
yum install gcc -y
yum install glib2 glib2-devel -y

# 解壓縮包
unzip master

# 進(jìn)入軟件目錄
cd /web/MyFlash-master

# 編譯
sh build.sh

編譯完成后:

驗證:

cd /web/MyFlash-master/binary
./flashback --help

輸入:

MyFlash工具 安裝完成

二、誤刪數(shù)據(jù)恢復(fù)

先檢查MySQL有沒有開啟binlog日志

SHOW VARIABLES LIKE 'log_%';

如果發(fā)現(xiàn)數(shù)據(jù)庫未開啟binlog,那么這次恢復(fù)數(shù)據(jù)的旅程到此結(jié)束~

下面進(jìn)入亡羊補(bǔ)牢時刻 (如果已經(jīng)開啟了 跳過這個步驟)。

打開MySQL的binlog日志:

# 找到MySQL的配置文件(一般情況下這樣都能找到,找不到就要去問DBA或者運維了)
find / -name my.cnf

一般情況下都是在 下面這個目錄

添加配置:

vi /etc/my.cnf

添加一下配置

# 如果有集群這個id不用重復(fù)
server_id =6
# binlog日志位置
log_bin =/web/mysql/binlog/mysql-bin
# binlog日志格式
binlog_format =row

重啟MysQL

# 如果 systemctl 無法重啟  就直接進(jìn)入mysqld所在的目錄重啟
systemctl restart mysqld

演示誤刪除數(shù)據(jù)

先了解一些命令 后續(xù)要用到

# 查看所有binglog日志
SHOW MASTER LOGS;

# 當(dāng)前使用的日志
show master status;

# 查看日志記錄
show binlog events in '日志文件名';

下面開始演示:

先看下當(dāng)前使用的binlog日志是哪個

# 當(dāng)前使用的日志
show master status;

可以看到我目前的數(shù)據(jù)庫使用的是 mysql-bin.000003 這個binlog日志

現(xiàn)在我有一張表 t_ph_uc_login

假如我誤刪了 t_ph_uc_login 表中的某條數(shù)據(jù)

這里我刪除 id為 10f7a6c619e14b228df0e226bd84db5c 的數(shù)據(jù)

DELETE FROM `t_ph_uc_login` WHERE id = '10f7a6c619e14b228df0e226bd84db5c';

此時再查已經(jīng)查不到這條數(shù)據(jù)了:

一般情況下我們并不知道到底刪除的是哪條數(shù)據(jù),更不知道刪除數(shù)據(jù)的id。

我一開始說的前提是這種方法適合最近誤操作的數(shù)據(jù)恢復(fù)。

下面我們?nèi)ゲ榭碽inlog日志。

# 查看日志記錄
SHOW BINLOG EVENTS IN 'mysql-bin.000003';  

我查到了3258行,經(jīng)常更新的表一定比這個數(shù)值大得多。所以我們要查看最后幾十行就行。

這里利用分頁查看最后幾百條數(shù)據(jù):

SHOW BINLOG EVENTS IN 'mysql-bin.000003' LIMIT 300 OFFSET 3000;

我們可以在最后幾行中找到 刪除相關(guān)的語句,并記錄下事務(wù)開始設(shè)置時的位置 (Pos列的數(shù)字),和事務(wù)提交時的位置(End_log_pos列的數(shù)字)。

**注意圖中藍(lán)色標(biāo)注框 **
開始: 11138303
結(jié)束: 11138917

利用MyFlash工具 反寫SQL

delete語句反寫成insert語句

cd /web/MyFlash-master/binary
./flashback --databaseNames="phoenix-saas" --tableNames="t_ph_uc_login" --sqlTypes="delete" --start-position=11138303 --stop-position=11138917 --binlogFileNames=/web/mysql/binlog/mysql-bin.000003  --outBinlogFileNameBase=/web/recover.log

注意:上面數(shù)據(jù)庫名稱,表名稱,sql類型 要根據(jù)自身需求改動,輸出的文件也可以根據(jù)需求改動,我這里就輸出在/web目錄下了

尤其需要注意 --start-position 和 -stop-position 的數(shù)值 如果填的不對 很可能會報下面的錯

如果報了下面的錯就要好好檢查下 --start-position 和 -stop-position 的數(shù)值 取的對不對了

Segmentation fault (core dumped)

如果執(zhí)行成功 就能看到下面紅框的文件:

由于MyFlash工具反寫的數(shù)據(jù)也是二進(jìn)制文件,所以還需要使用MySQL自帶的 mysqlbinlog工具來執(zhí)行

這里還可以用mysqlbinlog把二進(jìn)制文件recover.log.flashback 解析成文本文件看下(這一步僅僅是看看 恢復(fù)數(shù)據(jù)可跳過這步)

# 先找一下mysqlbinlog在哪
find / -name mysqlbinlog
# 我的mysqlbinlog在/web/mysql/bin/mysqlbinlog文件夾中
cd /web/mysql/bin
# 解析查看二進(jìn)制文件recover.log.flashback 
mysqlbinlog -v /web/recover.log.flashback

可以看到MyFlash工具 已經(jīng)把

上面我執(zhí)行的delete語句反寫成INSERT語句了

DELETE FROM `t_ph_uc_login` WHERE id = '10f7a6c619e14b228df0e226bd84db5c';

利用mysqlbinlog 執(zhí)行反寫的sql二進(jìn)制文件

最后一步利用mysqlbinlog 工具執(zhí)行 反寫的二進(jìn)制文件 recover.log.flashback

# 先到 mysqlbinlog 所在的文件夾
cd /web/mysql/bin

# 恢復(fù)數(shù)據(jù)
mysqlbinlog  -v /web/recover.log.flashback | mysql -u用戶名 -p密碼

注意上面要輸入自己數(shù)據(jù)庫的用戶名和密碼

如果不報錯 就說明數(shù)據(jù)恢復(fù)完成了。

如果報錯下面的錯:

ERROR 1782 (HY000) at line 17: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.

使用下面的語句查看是否開啟了 全局事務(wù)ID (GTID) 功能

SELECT @@GLOBAL.GTID_MODE;

下圖就是開啟了。

可以 通過參數(shù) --skip-gtids 跳過,不把gtid信息寫到binlog中。不過如果數(shù)據(jù)庫是多主或者一主多從的情況可能從庫會出現(xiàn)數(shù)據(jù)不一致。

#  --skip-gtids  跳過gtid信息
mysqlbinlog  -v /web/recover.log.flashback  --skip-gtids  | mysql -u用戶名 -p密碼

恢復(fù)完成

執(zhí)行完成后 再查詢被刪除的數(shù)據(jù),可以發(fā)現(xiàn)已經(jīng)恢復(fù)了。

三、誤更新數(shù)據(jù)恢復(fù)

基本流程和上面誤刪除的恢復(fù)流程一致

演示誤更新數(shù)據(jù)

還是拿id為 10f7a6c619e14b228df0e226bd84db5c 這條數(shù)據(jù)測試:

誤更新前 user_id = 04f1fd53a4554e3fb5c9a40463a4ea4c

開始誤更新

UPDATE `t_ph_uc_login` SET user_id = '小明' WHERE id = '10f7a6c619e14b228df0e226bd84db5c';

誤更新后:

假如我們不知道 誤更新之前的user_id 是什么

查看binlog最近的更新記錄 ,確定起始、結(jié)束位置

SHOW MASTER STATUS;

SHOW BINLOG EVENTS IN 'mysql-bin.000004'  

這里再細(xì)說下 找position的技巧吧

這次是更新 那就先找 Update_rows ,找到后 往上找 INFO列的 BEGIN,再往上一行, SET @@SESSION.GTID_NEXT 設(shè)置全局事務(wù)ID的這行就是這次更新事務(wù)的始位置。開始position就確定了。

開始: 1159

順著Update_rows 再往下找,找到INFO列的 最近的一個COMMIT,這行的 End_log_pos列就是 結(jié)束position

結(jié)束: 1929

利用MyFlash工具 反寫SQL

這里update 還是會被反寫成update

cd /web/MyFlash-master/binary
./flashback --databaseNames="phoenix-saas" --tableNames="t_ph_uc_login" --sqlTypes="update" --start-position=1159 --stop-position=1929 --binlogFileNames=/web/mysql/binlog/mysql-bin.000004  --outBinlogFileNameBase=/web/recover.log

利用mysqlbinlog 執(zhí)行反寫的sql二進(jìn)制文件

#  --skip-gtids  跳過gtid信息
mysqlbinlog  -v /web/recover.log.flashback  --skip-gtids  | mysql -u用戶名 -p密碼

恢復(fù)完成

再查一下 可以看到 user_id 已經(jīng)恢復(fù)了

補(bǔ)充點 flush logs

如果當(dāng)前數(shù)據(jù)庫 還有大量連接正在更新 可以執(zhí)行flush logs 重新生成新的binlog日志

比如現(xiàn)在的日志名是001 執(zhí)行 flush logs 后 ,會生成一個002的文件 ,并且當(dāng)前會使用002文件記錄
那你再去找001文件的position時 就不會受到干擾了

四、警告

非專業(yè)DBA請勿在生產(chǎn)環(huán)境操作上述過程~

到此這篇關(guān)于MySQL數(shù)據(jù)誤刪或者誤更新如何恢復(fù)的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)誤刪或者誤更新恢復(fù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql 5.7.17 winx64免安裝版,win10環(huán)境下安裝配置圖文教程

    Mysql 5.7.17 winx64免安裝版,win10環(huán)境下安裝配置圖文教程

    這篇文章主要介紹了Mysql 5.7.17 winx64免安裝版,win10環(huán)境下安裝配置圖文教程,需要的朋友可以參考下
    2017-01-01
  • 詳解MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎

    詳解MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎

    在本文里我們給大家總結(jié)了關(guān)于MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎的相關(guān)知識點,需要的讀者們一起學(xué)習(xí)下。
    2019-02-02
  • MySQL錯誤1449: The user specified as a definer ('root'@'%') does not exist的原因及解決方法

    MySQL錯誤1449: The user specified as 

    在使用MySQL數(shù)據(jù)庫時,有時會遇到錯誤??1449: The user specified as a definer ('root'@'%') does not exist??,本文將詳細(xì)介紹這個錯誤的原因以及如何解決它,需要的朋友可以參考下
    2025-05-05
  • MySQl 索引的使用

    MySQl 索引的使用

    本文介紹了如何驗證索引效率,包括在未建立索引和建立索引前后的耗時對比,詳細(xì)解釋了最左前綴法則、范圍查詢、索引列運算、字符串不加引號、模糊匹配、or連接的條件和數(shù)據(jù)分布對索引使用的影響,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • linux/mac安裝mysql忘記密碼的解決辦法

    linux/mac安裝mysql忘記密碼的解決辦法

    這篇文章主要給大家介紹了關(guān)于linux/mac安裝mysql忘記密碼的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • MySql批量刪除多個表的方法

    MySql批量刪除多個表的方法

    本文主要介紹了MySql批量刪除多個表的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • mysql常見問題解決

    mysql常見問題解決

    網(wǎng)上看到了不錯的mysql下常見錯誤解決方法,特整理下,方便大家學(xué)習(xí)mysql
    2008-02-02
  • MySQL臨時表的使用方法舉例詳解

    MySQL臨時表的使用方法舉例詳解

    MySQL臨時表在我們需要保存一些臨時數(shù)據(jù)時是非常有用的,這篇文章主要介紹了MySQL臨時表的使用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • mysql設(shè)置某字段不能重復(fù)問題

    mysql設(shè)置某字段不能重復(fù)問題

    這篇文章主要介紹了mysql設(shè)置某字段不能重復(fù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

南投市| 洪湖市| 扶余县| 麦盖提县| 佛冈县| 深州市| 阿克| 堆龙德庆县| 都兰县| 阿鲁科尔沁旗| 延长县| 黑水县| 乳山市| 辉县市| 巴彦淖尔市| 丰台区| 长寿区| 嘉荫县| 德惠市| 洛川县| 太和县| 宜良县| 五华县| 壶关县| 保康县| 靖边县| 开鲁县| 祁阳县| 无锡市| 大渡口区| 虹口区| 双峰县| 兴海县| 马山县| 贡觉县| 嘉定区| 滕州市| 大足县| 石嘴山市| 义马市| 健康|