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

mysql如何利用binlog進行數(shù)據(jù)恢復詳解

 更新時間:2018年10月13日 16:36:54   作者:陳芳志  
MySQL的binlog日志是MySQL日志中非常重要的一種日志,下面這篇文章主要給大家介紹了關于mysql如何利用binlog進行數(shù)據(jù)恢復的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

最近線上誤操作了一個數(shù)據(jù),由于是直接修改的數(shù)據(jù)庫,所有唯一的恢復方式就在mysql的binlog。binlog使用的是ROW模式,即受影響的每條記錄都會生成一個sql。同時利用了binlog2sql項目。

MySQL Binary Log也就是常說的bin-log, ,是mysql執(zhí)行改動產生的二進制日志文件,其主要作用有兩個:

* 數(shù)據(jù)回復

* 主從數(shù)據(jù)庫。用于slave端執(zhí)行增刪改,保持與master同步。

binlog基本配置和格式

binlog基本配置

binlog需要在mysql的配置文件的mysqld節(jié)點中進行配置:

# 日志中的Serverid
server-id = 1
# 日志路徑
log_bin  = /var/log/mysql/mysql-bin.log
# 保存幾天的日志
expire_logs_days = 10
# 每個binlog的大小
max_binlog_size = 1000M
#binlgo模式
binlog_format=ROW
# 默認是所有記錄,可以配置哪些需要記錄,哪些不記錄
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name

查看binlog狀態(tài)

  • SHOW BINARY LOGS; 查看binlog文件
  • SHOW VARIABLES LIKE '%log_bin%' 查看日志狀態(tài)
  • SHOW MASTER STATUS 查看日志文件位置

binlog的三種格式

1.ROW

針對行記錄日志,每行修改產生一條記錄。

優(yōu)點:上下文信息比較全,恢復某條誤操作時可以直接在日志中查找到原文信息,對于主從復制支持好。

缺點:輸出非常大,如果是Alter語句將產生大量的記錄

格式如下:

DELETE FROM `back`.`sys_user` WHERE `deptid`=27 AND `status`=1 AND `account`='admin' AND `name`='張三' AND `phone`='18200000000' AND `roleid`='1' AND `createtime`='2016-01-29 08:49:53' AND `sex`=2 AND `email`='sn93@qq.com' AND `birthday`='2017-05-05 00:00:00' AND `avatar`='girl.gif' AND `version`=25 AND `password`='ecfadcde9305f8891bcfe5a1e28c253e' AND `salt`='8pgby' AND `id`=1 LIMIT 1; #start 4 end 796 time 2018-10-12 17:03:19

2.STATEMENT

針對sql語句的,每條語句產生一條記錄

優(yōu)點:產生的日志量比較小,主從版本可以不一致

缺點:主從有些語句不能支持,像自增主鍵和UUID這種類型的

格式如下:

delete from `sys_role`;

3.MIX

結合了兩種的優(yōu)點,一般情況下都采用STATEMENT模式,對于不支持的語句采用ROW模式

轉換成sql

mysql自帶的mysqlbinlog

由于binlog是二進制的,所以需要先轉換成文本文件,一般可以采用Mysql自帶的mysqlbinlog轉換成文本。

mysqlbinlog --no-defaults --base64-output='decode-rows' -d room -v mysql-bin.011012 > /root/binlog_2018-10-10

參數(shù)說明

  • --no-defaults 為了防止報錯:mysqlbinlog: unknown variable 'default_character_set=utf8mb4'
  • --base64-output='decode-rows' 和-v一起使用, 進行base64解碼
    其他有很多用來限定范圍的參數(shù),比如數(shù)據(jù)庫,起始時間,起始位置等等。這些參數(shù)在查找誤操作的時候非常有用。

binlog的基本塊如下:

# at 417750
#181007 1:50:38 server id 1630000 end_log_pos 417844 CRC32 0x9fc3e3cd Query thread_id=440109962 exec_time=0 error_code=0
SET TIMESTAMP=1538877038/*!*/;
BEGIN

1、# at 417750

指明的當前位置相對文件開始的偏移位置,這個在mysqlbinlog命令中可以作為--start-position的參數(shù)

2、#181007 1:50:38 server id 1630000 end_log_pos 417844 CRC32 0x9fc3e3cd Query thread_id=440109962 exec_time=0 error_code=0

181007 1:50:38指明時間為18年10月7號1:50:38,serverid也就是你在配置文件中的配置的,end_log_pos 417844,這個塊在417844結束。thread_id執(zhí)行的線程id,exec_time執(zhí)行時間,error_code錯誤碼

3、SET TIMESTAMP=1538877038/!/;

BEGIN

具體的執(zhí)行語句

一行記錄產生的日志如下所示

# at 417750
#181010  9:50:38 server id 1630000  end_log_pos 417844 CRC32 0x9fc3e3cd     Query   thread_id=440109962 exec_time=0 error_code=0
SET TIMESTAMP=1539136238/*!*/;
BEGIN
/*!*/;
# at 417844
#181010  9:50:38 server id 1630000  end_log_pos 417930 CRC32 0xce36551b     Table_map: `goods`.`good_info` mapped to number 129411
# at 417930
#181010  9:50:38 server id 1630000  end_log_pos 418030 CRC32 0x5827674a     Update_rows: table id 129411 flags: STMT_END_F
### UPDATE `goods`.`good_info`
### WHERE
###   @1='2018:10:07' /* DATE meta=0 nullable=0 is_null=0 */
###   @2=9033404 /* INT meta=0 nullable=0 is_null=0 */
###   @3=1 /* INT meta=0 nullable=0 is_null=0 */
###   @4=8691108 /* INT meta=0 nullable=0 is_null=0 */
###   @5=9033404 /* INT meta=0 nullable=0 is_null=0 */
###   @6=20 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @7=1538877024 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
###   @1='2018:10:07' /* DATE meta=0 nullable=0 is_null=0 */
###   @2=9033404 /* INT meta=0 nullable=0 is_null=0 */
###   @3=1 /* INT meta=0 nullable=0 is_null=0 */
###   @4=8691108 /* INT meta=0 nullable=0 is_null=0 */
###   @5=9033404 /* INT meta=0 nullable=0 is_null=0 */
###   @6=21 /* LONGINT meta=0 nullable=0 is_null=0 */
###   @7=1538877024 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at 418030
#181010  9:50:38 server id 1630000  end_log_pos 418061 CRC32 0x468fb30e     Xid = 212760460521
COMMIT/*!*/;
# at 418061

一行記錄產生的日志如上所示。以SET TIMESTAMP=1539136238/*!*/;開始,以COMMIT/*!*/;結尾。我們可以根據(jù)兩個at指明的位置來限定范圍。

注意一條記錄開始的SET TIMESTAMP之前的# at 417750和結尾的COMMIT之后的# at 418061

利用binlog2sql

binlog2sql官網介紹:從MySQL binlog解析出你要的SQL。根據(jù)不同選項,你可以得到原始SQL、回滾SQL、去除主鍵的INSERT SQL等。

基本使用如下:

python binlog2sql.py -hlocalhost -P3306 -udev -p'\*' -d room -t room_info --start-file='mysql-bin.011012' --start-position 129886892 --stop-position 130917280 > rollback.sql

具體的使用我就不講解了github上講解的十分清楚,主要看下很多用來篩選的條件,比如起止時間--start-datetime/--stop-datetime,表名限定-t,數(shù)據(jù)庫限定-d,語句限定--sql-type,主要說說我遇到的一些問題。

mysql的binlog模式

這里需要設置為ROW,因為ROW模式有原來的信息,如果可以直接利用binlog2sql反向生成回滾sql,如果是STATEMENT無法生成,需要利用的mysql定時備份的文件再去做回滾

恢復數(shù)據(jù)的具體操作

因為當時線上執(zhí)行的是一條update語句,沒有唯一鍵索引的。導致有兩千多條記錄被更新。語句如下:

update room_info set status=1 where status=2;
  • 根據(jù)操作時間先定位對應的binlog文件
    我記得當時操作的時間大概的是上午9多左右,所以去找對應的binlog文件最后修改時間大于9點并且時間最接近的一個文件。使用linux的ll命令查看文件的修改時間。
  • 篩選具體的數(shù)據(jù)庫
    因為一個mysql實例的所有binlog文件是在一個文件中的,所以我們先要去除其他不想關的數(shù)據(jù)庫。利用-d參數(shù)來指明數(shù)據(jù)實例。然后在利用開始時間(--start-datetime)和結束時間(--stop-datetime)來進一步篩選
mysqlbinlog --no-defaults -v --base64-output='decode-rows' -d room --start-datetime='2018-10-10 9:00:00' --stop-datetime='2018-10-10 10:00:00' mysql-bin.011012>temp.sql
  • 壓縮取回文件分析
zip temp.zip temp.sql && sz temp.zip 

取回文件在本地用文本工具如vscode分析,里面有正則匹配,根據(jù)你改動過的特征,比如我有個房間號888888,這個不應該被修改,你就查看這個房間號的修改記錄,ROW模式的語句是Where在前,set在后。利用正則room_id=888888.*show_state=1.*AND show_state=2很快就能匹配到。我當時的語句影響了兩千多條記錄,你根據(jù)找到的語句去找開始的SET TIMESTAMP=1539136238的位置之前的at和結尾的COMMIT之后的at。

  • 利用binlog2sql生成回滾語句
python binlog2sql.py -hlocalhost -P3306 -udev -p'*' -d room -t room_info -B --start-file='mysql-bin.011012' --start-position 129886892 --stop-position 130917280 > rollback.sql

另外

因為我這邊是一條update影響多條的情況,如果是帶唯一鍵的情況下,影響的只有一條記錄,完全沒必要這么麻煩,直接利用binlog2sql帶上-d和-t參數(shù)限定數(shù)據(jù)庫和表,然后利用grep來查找,直接可以得出對應的sql。mysqlbinlog少了一個限定表和限定語句的功能。比如精確到一張表的Delete語句,能減少很多的數(shù)據(jù),能快速定位。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • mysql之臟讀、不可重復讀、幻讀的區(qū)別及說明

    mysql之臟讀、不可重復讀、幻讀的區(qū)別及說明

    這篇文章主要介紹了mysql之臟讀、不可重復讀、幻讀的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • mysql數(shù)據(jù)庫視圖和執(zhí)行計劃實戰(zhàn)案例

    mysql數(shù)據(jù)庫視圖和執(zhí)行計劃實戰(zhàn)案例

    這篇文章主要給大家介紹了關于mysql數(shù)據(jù)庫視圖和執(zhí)行計劃的相關資料,在使用MySQL過程中視圖和執(zhí)行計劃是一個很好的工具,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • 一個案例徹底弄懂如何正確使用mysql inndb聯(lián)合索引

    一個案例徹底弄懂如何正確使用mysql inndb聯(lián)合索引

    今天小編就為大家分享一篇關于一個案例徹底弄懂如何正確使用mysql inndb聯(lián)合索引,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 允許遠程訪問MySQL的實現(xiàn)方式

    允許遠程訪問MySQL的實現(xiàn)方式

    這篇文章主要介紹了允許遠程訪問MySQL的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL定位CPU利用率過高的SQL方法

    MySQL定位CPU利用率過高的SQL方法

    當mysql CPU告警利用率過高的時候,我們應該怎么定位是哪些SQL導致的呢,本文將介紹一下定位的方法,文章通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-07-07
  • MySQL實現(xiàn)定時自動備份的流程步驟(Windows環(huán)境)

    MySQL實現(xiàn)定時自動備份的流程步驟(Windows環(huán)境)

    這篇文章主要介紹了MySQL實現(xiàn)定時自動備份的流程步驟(Windows環(huán)境),文中通過圖文結合的方式介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • mysql表優(yōu)化、分析、檢查和修復的方法詳解

    mysql表優(yōu)化、分析、檢查和修復的方法詳解

    這篇文章主要介紹了mysql表優(yōu)化、分析、檢查和修復的方法,結合實例形式較為詳細的分析了MySQL表進行優(yōu)化,分析與修復等操作的各種常見命令與使用技巧,需要的朋友可以參考下
    2016-04-04
  • 使用MySQL生成最近24小時整點時間臨時表

    使用MySQL生成最近24小時整點時間臨時表

    MySQL臨時表是一種只存在于當前數(shù)據(jù)庫連接或會話期間的表,它們可以被用來存儲臨時數(shù)據(jù),這些數(shù)據(jù)可以在查詢中被使用,但是它們不會在數(shù)據(jù)庫中永久存儲,這篇文章主要給大家介紹了關于如何使用MySQL生成最近24小時整點時間臨時表的相關資料,需要的朋友可以參考下
    2024-01-01
  • mysql查詢字符串替換語句小結(數(shù)據(jù)庫字符串替換)

    mysql查詢字符串替換語句小結(數(shù)據(jù)庫字符串替換)

    有時候我們需要對mysql的字符串進行替換,我們就可以通過sql語句直接實現(xiàn)了,不過對于大數(shù)據(jù)量的字段不建議使用此方法
    2012-07-07
  • Centos7中MySQL數(shù)據(jù)庫使用mysqldump進行每日自動備份的編寫

    Centos7中MySQL數(shù)據(jù)庫使用mysqldump進行每日自動備份的編寫

    數(shù)據(jù)庫的備份,對于生產環(huán)境來說尤為重要,數(shù)據(jù)庫的備份分為物理備份和邏輯備份。我們將使用mysqldump命令進行數(shù)據(jù)備份。使用自動任務進行每日備份,下邊我們將使用mysqldump命令進行數(shù)據(jù)備份,感興趣的朋友一起看看吧
    2021-07-07

最新評論

盐城市| 克山县| 舟山市| 建德市| 西城区| 林西县| 疏勒县| 夏河县| 伊金霍洛旗| 乐安县| 肃南| 昆山市| 玛纳斯县| 元氏县| 武鸣县| 河东区| 麻江县| 长汀县| 塔城市| 黄浦区| 梁河县| 岳普湖县| 宿迁市| 老河口市| 四子王旗| 揭阳市| 仁布县| 健康| 陈巴尔虎旗| 惠东县| 淳安县| 庆阳市| 蒲城县| 叙永县| 平顶山市| 聂拉木县| 西安市| 静海县| 梓潼县| 涿鹿县| 无锡市|