1. 程式人生 > >mysql利用binlog恢復資料

mysql利用binlog恢復資料

需求:需要給開發提供一個2018年9月30號的資料,按照我們公司正常備份策略來說,直接找到對應時間的備份資料,解壓匯入即可,恰好這個時間節點的資料沒有,只備份到2018年9月25號的,糟糕了吧

          咋辦呢,咱們利用binlog日誌來恢復吧,如果二進位制日誌都沒有,那還恢復啥呢,運維咋當滴

          話不多說,進入正題

一、匯入資料

我的源資料:baodian_2018-09-25_329010659.tar.bz2               #這一串數字是pos節點位置,等下利用二進位制恢復的時候需要用到,時間:9月 25 01:08

隨便在哪個mysql資料庫解壓匯入即可,根據自己的需求就行

二、找到對應的binlog

知道的時間節點:

1.開始pos位置:329010659

2.結束時間:2018-10-01 00:00:00

# 二進位制日誌分析
2018-09-22 12:34:23.459540935 2018-09-29 15:54:20.554318725 mysql-bin.000163
2018-09-29 15:54:20.554318725 2018-10-04 00:09:50.238484899 mysql-bin.000164

三、資料恢復

利用binlog恢復,一條命令搞定

/usr/local/mysql/bin/mysqlbinlog  --start-position=329010659  --stop-datetime='2018-10-01 00:00:00'  --database=baodian
     --set-charset=utf8      mysql-bin.000163      mysql-bin.000164    |mysql -h127.0.0.1 -P3036 -uroot -p123456 baodian

溫馨提示:

1.mysqlbinlog分析多個檔案的時候,不能分開寫,否則匯入的時候會報語法錯誤,如圖

2.儘量加上字符集編碼引數,否則中文是亂碼

   我的是: --set-charset=utf8 

3. mysqlbinlog分析分時候,不要加這個引數,--base64-output=decode-rows,否則資料導不進去    #當然是根據我的環境來說的

其實我覺得一般是可以的,可能是我my.cnf裡面設定了格式為row

4.如果導資料的時候,出現如下兩種報錯資訊

   1)ERROR 1609 (HY000): The BINLOG statement of type `Table_map` was not preceded by a format description BINLOG statement.    #直接在資料庫source的時候

   2) ERROR 2006 (HY000) at line xx: MySQL server has gone away  #出現這個原因有很多種,其他原因的解決辦法參考:https://www.cnblogs.com/fnlingnzb-learner/p/5984795.html

   這裡的原因是,sql操作時間過長,傳送的資料太大,可以設定max_allowed_packed來避免

  解決:在my.cnf裡面新增一行引數

  max_allowed_packed=16M     #如果不行將16M再加大

mysqlbinlog其他用法,參考:

https://www.cnblogs.com/kevingrace/p/5907254.html