1. 程式人生 > >MariaDB數據庫的備份與恢復

MariaDB數據庫的備份與恢復

導致 one 直接 恢復 info quick 邏輯 應該 none

MariaDB數據庫的備份與恢復

前提條件:

開啟二進制日誌:二進制日誌可用於數據庫恢復時使用,建議二進制日誌與數據庫數據分開存放。

開啟二進制日誌的方法:

[ [email protected]~]# vim /etc/my.cnf
[mysqld]
log_bin=/data/binary-log/mariadb-bin

註:日誌會存放在/data/binary-log目錄下,文件名為mariadb-bin.000001下

mysqldump

邏輯備份工具,適用所有存儲引擎,溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份

mysqldump工具:客戶端命令,通過mysql協議連接至mysql服務器進行備份

  • 用法1:

    mysqldump [OPTIONS] database [tables]:默認只將查詢結果打印到屏幕

    • 備份
      mysqldump -uroot -ppasswd database > database.sql
    • 還原
      mysql database [table] < database.sql
    • 註:還原的時候,直接重定向執行,但是前提是database數據庫存在,如果不存在擇不能還原
  • 用法2:

    mysqldump [OPTIONS] –B DB1 [DB2 DB3...] (會備份數據庫的定義)

    • 備份:
      mysqldump -B database > database.sql
    • 還原:
      mysql [table] < database.sql
  • 用法3:

    mysqldump [OPTIONS] –A [OPTIONS](備份所有數據庫不包括performance_schema和information_schema庫)

    • 備份
      mysqldump -A > alltabase.sql
    • 還原:
      mysql> set sql_log_bin=OFF; 臨時關閉二進制日誌
      mysql> reset master; 清除所有二進制日誌
      mysql> source ~/alltabase.sql
      mysql> set sql_log_bin=ON; 開啟二進制日誌
      註意:在還原數據庫時,都應該臨時關閉二進制日誌,因為還原數據庫的操作,沒有必要記錄到二進制日誌

mysqldump常見選項:

  • -A, --all-databases 備份所有數據庫,含create database
  • -B , --databases db_name… 指定備份的數據庫,包括create database語句
  • -E, --events:備份相關的所有event scheduler 計劃任務
  • -R, --routines:備份所有存儲過程和自定義函數
  • --triggers:備份表相關觸發器,默認啟用,用--skip-triggers,不備份觸發器
  • --default-character-set=utf8 指定字符集
  • --master-data[=#]: 此選項須啟用二進制日誌
    1:所備份的數據之前加一條記錄為CHANGE MASTER TO語句,非註釋,不指定#,默認為1
    2:記錄為註釋的CHANGE MASTER TO語句此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啟--single-transaction)
  • -F, --flush-logs :備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會導致刷新多次數據庫。建議在同一時刻執行轉儲和日誌刷新,可通過和--single-transaction或-x,--master-data 一起使用實現,此時只刷新一次日誌
  • --compact 去掉註釋,適合調試,生產不使用
  • -d, --no-data 只備份表結構
  • -t, --no-create-info 只備份數據,不備份create table
  • -n,--no-create-db 不備份create database,可被-A或-B覆蓋
  • --flush-privileges 刷新權限,備份mysql或相關時需要使用
  • -f, --force 忽略SQL錯誤,繼續執行
  • --hex-blob 使用十六進制符號轉儲二進制列,當有包括BINARY,VARBINARY,BLOB,BIT的數據類型的列時使用,避免亂碼
  • -q, --quick 不緩存查詢,直接輸出,加快備份速度

通過備份文件和二進制文件恢復數據庫到當前裝填

通常數據庫的備份都發生在淩晨用戶訪問量較少的時候進行,例如我們在淩晨3點對數據庫進行了完全備份,但是在上午11點的時候,因為管理員的誤操作,到時候數據庫某張表被刪除,如果我們用數據庫的完整備份的話,就只能恢復到淩晨3點,那麽要恢復3點到11點這段時間的數據,就需要用到二進制日誌

前提:在進行數據庫備份的時候加了--master-data=[1|2]選項,記錄了數據庫備份時,日誌的位置

具體步驟

  1. 對數據庫進行完整備份
    [ [email protected]~]# mysqldump -A --master-data=2 > database.sql
    [ [email protected]~]# less database.sql
        -- CHANGE MASTER TO MASTER_LOG_FILE=‘mariadb-bin.000007‘, MASTER_LOG_POS=8134;
        這條記錄了當前的備份所在的日誌位置,為mariadb-bin.000007的8134
  2. 對數據庫的數據進行修改
    MariaDB [hellodb]> select * from teachers;
        +-----+---------------+-----+--------+
        | TID | Name          | Age | Gender |
        +-----+---------------+-----+--------+
        |   1 | Song Jiang    |  45 | M      |
        |   2 | Zhang Sanfeng |  94 | M      |
        |   3 | Miejue Shitai |  77 | F      |
        |   4 | Lin Chaoying  |  93 | F      |
        |   5 | weiying       |  25 | NULL   |
        +-----+---------------+-----+--------+
    MariaDB [hellodb]> insert teachers(name,age) value("xiao ming",20);
    MariaDB [hellodb]> select * from teachers;
        +-----+---------------+-----+--------+
        | TID | Name          | Age | Gender |
        +-----+---------------+-----+--------+
        |   1 | Song Jiang    |  45 | M      |
        |   2 | Zhang Sanfeng |  94 | M      |
        |   3 | Miejue Shitai |  77 | F      |
        |   4 | Lin Chaoying  |  93 | F      |
        |   5 | weiying       |  25 | NULL   |
        |   6 | xiao ming     |  20 | NULL   |
        +-----+---------------+-----+--------+
  3. 查看當前二進制日誌記錄的位置
    MariaDB [hellodb]> show master logs;
        +--------------------+-----------+
        | Log_name           | File_size |
        +--------------------+-----------+
        | mariadb-bin.000001 |     15763 |
        | mariadb-bin.000002 |     30376 |
        | mariadb-bin.000003 |   1038814 |
        | mariadb-bin.000004 |      8153 |
        | mariadb-bin.000005 |     30376 |
        | mariadb-bin.000006 |   1038814 |
        | mariadb-bin.000007 |      8373 |
        +--------------------+-----------+
    之前數據庫備份時二進制的位置為8134
  4. 刪除數據庫並恢復
    • 停止服務並刪除數據庫:
      [ [email protected]~]# systemctl stop mariadb
      [ [email protected]~]# rm -rf /var/lib/mysql/*  
      [ [email protected]~]# systemctl start mariadb
    • 恢復:
    • 先獲取備份之後二進制日誌文件的內容:
      [ [email protected]~]# mysqlbinlog --start-position=8134 /data/binary-log/mariadb-bin.000007  > binary.sql

      導入備份和二進制日誌恢復:

      MariaDB [(none)] set sql_log_bin=OFF; 臨時關閉二進制日誌  
      MariaDB [(none)] reset master; 清除所有二進制日誌        
      MariaDB [(none)] source database.sql
      MariaDB [(none)] source binary.sql
      MariaDB [(none)] mysql> set sql_log_bin=ON; 開啟二進制日誌
    • 查詢數據表:數據庫恢復到最新狀態
    • 註:如果在備份完成之後,是因為刪除了某張表導致的數據庫崩潰,那麽在提取出來的二進制文件中找到該條drop語句,並將其註釋。

MariaDB數據庫的備份與恢復