1. 程式人生 > >Mysql的增量備份 及基於時間點與位置的恢復

Mysql的增量備份 及基於時間點與位置的恢復

pre school 主從架構 http 二進制 全備 etc 復數 根據

  • 增量備份的優點是沒有重復數據,備份量不大,時間短。缺點也很明顯,需要上次完全備份及完全備份之後所有的增量備份才能恢復,反推恢復,操作較為繁瑣。
  • Mysql沒有提供增量備份的方法,但是可以通過二進制日誌間接實現增量備份。
  • 二進制日誌對備份的意義如下:
    1)二進制日誌保存了所有更新或者可能更新數據庫的日誌文件
    2)二進制日誌在啟動Mysql服務器後開始記錄,並在文件達到max_binlog_size 所設置的大小或者接收到的flush logs命令後重新創建新的日誌文件。
    3)只需要定時執行flush logs 方法重新創建新的日誌,生成二進制文件序列,並及時把這些日誌保存到安全的地方就完成了一個時間段的增量備份。

  • 增量備份
  • 開啟Mysql的二進制日誌功能

    # vim /etc/my.cnf
        [mysql]
        log-bin=mysql-bin    //在[mysql]項下添加
    # systemctl restart mysqld          //重啟服務  
    (此時usr/local/mysql/data/ 目錄下會生成 mysql-bin.000001二進制文件)
  • flush-logs 將上次至當前的數據及操作保存在上次生成的二進制文件中同時生成另一個新的二進制文件

        # mysqldump -u root -p school > /opt/school.sql   //完全備份 數據庫school
        # mysqladmin -u root -p flush-logs  //增量備份 生成新的二進制文件
        (此時usr/local/mysql/data/ 目錄下會生成 mysql-bin.000002二進制文件)
  • 查看二進制文件的內容

        # mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002
  • 增量恢復
  • 增量恢復的場景:
    1)認為的SQL語句破壞了數據庫
    2)在進行下一次全備份之前發生系統故障導致數據庫的數據丟失
    3)在主從架構中,主庫數據發生了故障。
  • 根據數據丟失的情況可以分為兩類:
    1)只丟失了完全備份之後更改的數據
    2)完全備份之後丟失所有數據

  • 丟失了完全備份之後更改的數據恢復

    # mysqlbinlog --no-defaults mysql-bin.000001 | mysql -u root -p
    (恢復操作  註意恢復的順序,要先恢復最先生成的二進制文件)
  • 丟失了完全備份之後所有的數據恢復

    # mysql -u root -p school < /opt/school.sql 
    # mysqlbinlog --no-defaults mysql-bin.000001 | mysql -u root -p
    # mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p
    (恢復操作  註意恢復的順序,要先恢復最先生成的二進制文件)
  • 下面對增量備份原理做個總結:首先是每周使用mysqldump完全備份整庫,在整庫備份的時間點之後,每天使用flush logs 生成新的二進制文件,二進制文件保存的是每天對數據庫的操作變化的內容,內容是不重復的。所以每周的備份整庫加上每天的二進制備份文件,相當於數據庫現在的數據狀態

    • 基於時間點與位置的數據恢復
    • 利用二進制日誌可以實現基於時間點和位置的恢復,列如我們在執行操作中途誤操作刪除了一張表,
    • 我們可以查看二進制日誌的時間或者位置恢復的時候跳過這一步錯誤操作。
    • 如圖我們誤刪了zhangsan
    • mysqladmin -u root -p flush-logs 先生成二進制文件
    • 然後查看這個二進制文件 誤操作的時間點、位置 和正確操作的時間點、位置

    技術分享圖片技術分享圖片技術分享圖片

    進入數據庫 
    # mysql -u root -p
    > use school;     
    > drop table info;    刪除表
    • 依次恢復

      # mysqldump -u root -p school > /opt/school.sql
      # mysqlbinlog --no-defaults mysql-bin.000001 | mysql -u root -p
      # mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p 
      # mysqlbinlog --no-defaults mysql-bin.000003 | mysql -u root -p
      # mysqlbinlog --no-defaults mysql-bin.000004 | mysql -u root -p
    • 基於時間的恢復
    • 跳過了錯誤的時間

      # mysqlbinlog --no-defaults --stop-datetime=‘2018-07-03 18:19:49‘ /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p
      # mysqlbinlog --no-defaults --start-datetime=‘2018-07-03 18:22:21‘ /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p
    • 基於位置的恢復
    • 跳過了錯誤的位置

      # mysqlbinlog --no-defaults --stop-position=‘347‘ /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p
      # mysqlbinlog --no-defaults --start-position=‘395‘ /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p

    Mysql的增量備份 及基於時間點與位置的恢復