MySQL5

MySQL數據庫5

  • mysqldump備份恢復數據庫
  • 冷備份還原數據庫
  • 邏輯卷快照備份還原數據庫
  • xtrabackup備份還原數據庫

1. 備份和恢復概述

  • 適用場景
    硬件故障、軟件故障、天然災害、黑客攻擊、誤操做測試等數據丟失場景php

  • 備份注意要點css

    1. 能容忍最多丟失多少數據
    2. 恢復數據須要在多長時間內完成
    3. 須要恢復哪些數據
    4. 還原要點
    5. 作還原測試,用於測試備份的可用性
    6. 還原演練
  • 備份類型
    二進制日誌文件不該該與數據文件放在同一磁盤html

    1. 按備份範圍
      1. 徹底備份:整個數據集
      2. 部分備份:只備份數據子集,如部分庫或表
    2. 按備份時間
      1. 增量備份:僅備份最近一次徹底備份或增量備份(若是存在增量)以來變化的數據,備份較快,還原複雜,備份的是二進制文件
      2. 差別備份:僅備份最近一次徹底備份以來變化的數據,備份較慢,還原簡單
  • 冷、溫、熱備份mysql

    1. 冷備
      讀寫操做均不可進行,相似複製文件操做, 數據庫對應的數據文件,二進制日誌、InnoDB的事務日誌, 服務器的配置文件
    2. 溫備
      讀操做可執行;但寫操做不可執行
    3. 熱備
      讀寫操做都可執行
  • 經常使用存儲引擎支持備份類型web

    1. MyISAM:溫備,不支持熱備
    2. InnoDB:都支持
  • 備份方法sql

    1. 物理備份
      直接複製數據文件進行備份,與存儲引擎有關,佔用較多的空間,速度快,可能將沒有釋放空間的空數據文件一塊兒備份,佔用空間
    2. 邏輯備份
      從數據庫中「導出」數據另存而進行的備份,與存儲引擎無關,佔用空間少,速度慢,可能丟失精度,經過mysql協議鏈接到mysql的數據庫,執行命令將數據查出來,導出到備份主機上,有什麼數據拿什麼數據。
  • 備份時須要考慮的因素shell

    1. 溫備的持鎖多久
    2. 備份產生的負載
    3. 備份過程的時長
    4. 恢復過程的時長
  • 備份什麼數據庫

    1. 數據
    2. 二進制日誌、InnoDB的事務日誌
    3. 程序代碼(存儲過程、函數、觸發器、事件調度器)
    4. 服務器的配置文件
  • 備份工具vim

    1. cp, tar等複製歸檔工具:
      物理備份工具,適用全部存儲引擎;只支持冷備;徹底和部分備份
    2. LVM的快照:
      爲保證數據一致性,先對真個實例加鎖,作快照後解鎖,幾乎熱備;藉助文件系統工具進行備份
    3. mysqldump
      邏輯備份工具,適用全部存儲引擎,溫備;支持徹底或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份
    4. xtrabackup:
      由Percona公司提供支持對InnoDB作熱備(物理備份)的工具,支持徹底備份、增量備份
    5. MariaDB Backup:
      從MariaDB 10.1.26開始集成,基於Percona XtraBackup 2.3.8實現
    6. mysqlbackup:
      熱備份, MySQL Enterprise Edition(企業版)組件
    7. mysqlhotcopy:
      PERL 語言實現,幾乎冷備,僅適用於MyISAM存儲引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp來快速備份數據庫

2. 冷備份示例

  • 實驗目標
    冷備方法備份數據,還原數據到另外一臺主機上
  • 實驗步驟
    1. 數據庫中止服務
             
             
             
             
             
      • 1
      [root@hai7-6 hellodb]$systemctl stop mariadb
    2. 打包數據文件,並傳送給預還原主機
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      1. '打包數據庫工做目錄並壓縮' [root@hai7-8 data]$tar Jcvf /data/mysql.bak.`date +%F`.tar.xz /data/mysql/ 2. '將數據發送到預還原主機上' [root@hai7-8 data]$scp /data/mysql.bak.2018-10-13.tar.xz 192.168.50.100:/data 3. '將配置文件發送到預還原主機' [root@hai7-8 data]$scp /etc/my.cnf 192.168.50.100:/data
    3. 將備份的配置文件覆蓋還原主機上的配置文件
             
             
             
             
             
      • 1
      [root@hai7-8 mysql]$mv /data/my.cnf /etc/my.cnf
    4. 解壓文件到/var/lib/mysql目錄下,並重啓服務,還原完成
             
             
             
             
             
      • 1
      • 2
      [root@hai7-8 mysql]$tar xf mysql.2018-10-13.tar.xz [root@hai7-8 mysql]$mv * /var/lib/mysql

3. 基於LVM的備份

  • 實驗目的
    1. 將數據庫數據文件和二進制文件分別存放
    2. 利用邏輯卷快照功能備份並恢復丟失數據
  • 準備邏輯卷
    1. 拿現有乾淨分區sda7做爲物理卷
             
             
             
             
             
      • 1
      [root@hai7-6 data]$pvcreate /dev/sda7
    2. 將物理卷加入卷組
             
             
             
             
             
      • 1
      [root@hai7-6 data]$vgcreate vg_mysql /dev/sda7
    3. 創建兩個邏輯卷分別存放數據mysqldata和二進制文件mysqlbin
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 data]$lvcreate -n mysqldata -L 2G vg_mysql [root@hai7-6 data]$lvcreate -n mysqlbin -L 4G vg_mysql
    4. 格式化文件系統
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 data]$mkfs.xfs /dev/vg_mysql/mysqlbin [root@hai7-6 data]$mkfs.xfs /dev/vg_mysql/mysqldata
    5. 創建兩個掛載點,分別掛載mysqldata與mysqlbin
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      [root@hai7-6 data]$mkdir /vg_data/{mysqlbin,mysqldata} -pv '將邏輯卷分別掛載到目錄上' [root@hai7-6 data]$mount /dev/vg_mysql/mysqlbin /vg_data/mysqlbin/ [root@hai7-6 data]$mount /dev/vg_mysql/mysqldata /vg_data/mysqldata/
  • 數據備份
    1. 修改以上邏輯卷掛載目錄權限,確保mysql程序有寫權限
             
             
             
             
             
      • 1
      [root@hai7-6 data]$chown mysql.mysql /vg_data/
    2. 修改配置文件指定數據保存路徑,啓動服務
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      [root@hai7-6 ~]$vim /etc/my.cnf [mysqld] innodb_file_per_table datadir=/vg_data/mysqldata <=將數據庫路徑修改成剛纔創建的路徑 log_bin=/vg_data/mysql-bin <=將二進制日誌保存路徑修改成以上創建的新目錄 '啓動服務' [root@hai7-6 data]$systemctl start mariadb
    3. 進入mysql,清空二進制日誌文件
             
             
             
             
             
      • 1
      MariaDB [(none)]> reset master;
    4. 準備一些數據庫文件,這裏導入數據庫hellodb
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql < hellodb_innodb.sql
    5. 請求鎖定全部表
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'FLUSH TABLES WITH READ LOCK'
    6. 記錄二進制文件及事件位置,方便之後使用二進制日誌文件恢復備份時間點之後的文件
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      [root@hai7-6 data]$mysql -e 'SHOW MASTER logs' > bin.log [root@hai7-6 data]$cat bin.log Log_name File_size mysql-bin.000001 7655 <==備份時二進制日誌位置
    7. 建立快照
             
             
             
             
             
      • 1
      [root@hai7-6 mapper]$lvcreate -p r -s -n snap_mysql -L 1G /dev/mapper/vg_mysql-mysqld
    8. 釋放鎖
             
             
             
             
             
      • 1
      [root@hai7-6 mapper]$mysql -e 'UNLOCK TABLES'
    9. 在mysql中增長几條記錄,後續使用二進制恢復到最新狀態
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      MariaDB [hellodb]> INSERT teachers values(6,'B','30','F'); MariaDB [hellodb]> SHOW BINARY LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 8059 | <==二進制日誌文件更新後大小
  • 數據恢復
    還原階段須要拒絕客戶訪問,保證數據不變,利用防火牆或者鎖等工具實現
    1. 掛載快照卷,執行數據備份
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      因爲UUID相同,因此掛載快照卷鬚要加-o nouuid,norecovery [root@hai7-6 vg_mysql]$mount -o nouuid,norecovery /dev/vg_mysql/snap_mysql /mnt 將快照下備份的數據拷貝到出來 [root@hai7-6 vg_mysql]$cp -av /mnt/* /data/
    2. 備份完成後,刪除快照卷(快照會影響系統性能)
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      取消掛載 [root@hai7-6 vg_mysql]$umount /mnt 刪除邏輯快照 [root@hai7-6 vg_mysql]$lvremove /dev/vg_mysql/snap_mysql
    3. 模擬損壞,刪除存放數據庫的目錄下全部文件
             
             
             
             
             
      • 1
      [root@hai7-6 vg_mysql]$rm -rf /vg_data/mysqldata/*
    4. 將備份的文件拷貝回數據庫目錄下,保留原屬性
             
             
             
             
             
      • 1
      [root@hai7-6 vg_mysql]$cp -av /data/* /vg_data/mysqldata/
    5. 利用二進制日誌還原數據到最
             
             
             
             
             
      • 1
      • 2
      • 3
      '備份數據時已經記錄的二進制日誌位置爲mysql-bin.000001 7655 ,導出以後全部記錄,多個文件需追加到同一文件' [root@hai7-6 ~]$mysqlbinlog --start-position=7655 /vg_data/mysql-bin.000001 > /root/binlong.sql [root@hai7-6 ~]$mysqlbinlog /vg_data/mysql-bin.000002 >> /root/binlong.sql
    6. 進入數據庫,暫時關閉二進制日誌記錄功能,防止導入數據時生成新的二進制日誌
             
             
             
             
             
      • 1
      MariaDB [(none)]> SET sql_log_bin=off;
    7. 將導出的二進制日誌數據導入mysql中,在數據庫中直接進行,命令爲SOURCE
             
             
             
             
             
      • 1
      MariaDB [(none)]> SOURCE /root/binlong.sql
    8. 啓動二進制日誌記錄功能,查看還原效果
             
             
             
             
             
      • 1
      • 2
      MariaDB [(none)]> SET sql_log_bin=on; MariaDB [hellodb]> SELECT * FROM teachers;

4. 邏輯備份工具(mysqldump, mydumper, phpMyAdmin)

  • 備份原理
    在mysql正常工做的狀況下,利用mysql協議,就像mysql客戶端同樣,直接鏈接到mysql數據庫上,發出查詢指令,把全部的數據庫讀出來
  • 參考資料
    https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
  • 缺點
    schema和數據存儲在一塊兒、巨大的SQL語句、單個巨大的備份文件

4.1 mysqldump工具

  • 語法格式
    mysqldump [OPTIONS] database [tables]
    mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…]
    mysqldump [OPTIONS] --all-databases [OPTIONS]緩存

  • 常見選項

    1. -A| --all-databases :備份全部數據庫,含create database

    2. -B| --databases db_name… :指定備份的數據庫,包括create database語句

    3. -E| --events:備份相關的全部event scheduler(調度器),計劃任務之類的,-A包含-E

    4. -R| --routines:備份全部存儲過程和自定義函數, -A包含

    5. --triggers:備份表相關觸發器,默認啓用,用--skip-triggers,不備份觸發器

    6. --default-character-set=utf8 :指定字符集

    7. --master-data[=#]: 此選項須啓用二進制日誌

      1. 所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1
      2. 記錄爲註釋的CHANGE MASTER TO語句
        此選項會自動關閉–lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啓–single-transaction)
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        '記錄備份時,二進制日誌文件所在位置,說明在此位置以前的數據作了備份' [root@hai7-6 data]$mysqldump -A --master-data=1 > all.sql '查看備份數據' [root@hai7-6 data]$vim all.sql '多出以下行,若是設置爲--master-data=2,只是將以下行註釋掉,僅作描述' CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=34742814;
    8. -F, --flush-logs :備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會致使刷新屢次數據庫。建議在同一時刻執行轉儲和日誌刷新,可經過和--single-transaction-x--master-data一塊兒使用實現,此時只刷新一第二天志,添加此選項能夠區分備份前二進制文件和備份後二進制文件,不須要去文件中找備份位置

             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      1. '當前二進制日誌文件是兩個1和2' [root@hai7-6 data]$mysql -e 'show master logs;' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 8078 | | mysql-bin.000002 | 34742814 | +------------------+-----------+ 2. '備份兩個數據庫hi和mysql' [root@hai7-6 data]$mysqldump -F -B hi mysql > ba.back.sql 3. '生成2個新的日誌文件,也就是選項描述中-A、-B是會刷新屢次,和備份多少個數據庫有關' [root@hai7-6 data]$mysql -e 'show master logs;' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 8078 | | mysql-bin.000002 | 34742857 | | mysql-bin.000003 | 288 | <==刷新的二進制日誌文件 | mysql-bin.000004 | 245 | <==刷新的二進制日誌文件 +------------------+-----------+
    9. --compact: 去掉註釋,適合調試,導出的文件沒有註釋描述,不推薦使用,有可能丟失關鍵信息,好比master-data=2記錄的二進制備份位置

    10. -d, --no-data: 只備份表結構

    11. -t, --no-create-info: 只備份數據,不備份create table

    12. -n,--no-create-db: 不備份create database,可被-A或-B覆蓋

    13. --flush-privileges:備份系統數據庫mysql時須要使用

    14. -f, --force: 忽略SQL錯誤,繼續執行

    15. --hex-blob: 使用十六進制符號轉儲二進制列(例如,「abc」變爲0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT

    16. -q, --quick: 不緩存查詢,直接輸出,加快備份速度

  • 備份還原示例

    1. 示例一: 默認設置讀取數據庫數據,並還原(不建議使用,須要手動建立數據庫,數據庫建立信息極可能不許確)
      1. 讀取數據庫hellodb數據,導出到文件hellodb_back.sql中
                 
                 
                 
                 
                 
        • 1
        [root@hai7-6 data]$mysqldump hellodb > /data/hellodb_bak.sql
      2. 模擬數據庫破壞,刪除hellodb數據庫
                 
                 
                 
                 
                 
        • 1
        [root@hai7-6 data]$mysql -e 'drop database hellodb'
      3. 使用默認選項讀出來的數據,並無建立數據庫命令,還原數據庫須要手動建立數據庫
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        1. '建立數據庫,極可能與原建立屬性不一樣' [root@hai7-6 data]$mysql -e 'create database hi' 2. '將數據導入新建的數據庫中(這裏必須指定數據庫),完成恢復' [root@hai7-6 data]$mysql hi < /data/hellodb_bak.sql
    2. 示例二:加上選項-A、-B備份,只要有的數據庫都會備份,使輸出的信息更完整包括建立命令
      1. 備份全部數據庫
        選項-A
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        [root@hai7-6 mysqldata]$mysqldump -A > /data/all'data+%F'.sql 查看導出的數據 [root@hai7-6 mysqldata]$vim /data/alldata+%F.sql CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hi` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `hi`; <==建立數據庫的SQL語句,只要有的數據庫都會輸出建立語句
        選項-B
                 
                 
                 
                 
                 
        • 1
        • 2
        '能夠同時備份多個,例如hi和mysql兩個數據庫' [root@hai7-6 mysqldata]$mysqldump -B hi mysql > /data/b'data+%F'.sql
      2. 模擬故障,刪除數據庫
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        [root@hai7-6 mysqldata]$mysql -e 'drop database hi' [root@hai7-6 mysqldata]$mysql -e 'drop database mysql' '查看刪除後數據庫保留狀況' [root@hai7-6 mysqldata]$mysql -e 'show databases' +--------------------+ | Database | +--------------------+ | information_schema | | performance_schema | | test | +--------------------+
      3. 還原,因爲備份中已經有庫建立語句,能夠直接導入
                 
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        [root@hai7-6 mysqldata]$mysql < /data/bdata+%F.sql [root@hai7-6 mysqldata]$mysql -e 'show databases' +--------------------+ | Database | +--------------------+ | information_schema | | hi | | mysql | | performance_schema | | test | +--------------------+
  • 輸出備份數據時同時壓縮
    壓縮工具默認是讀取屏幕輸出,壓縮導入指定文件,能夠配合mysqldump工具,直接壓縮備份文件

         
         
         
         
         
    • 1
    [root@hai7-6 ~]$mysqldump -B hi |gzip > /data/a.sql.gz
  • 編制腳本,實現將mysql中的數據庫分庫備份

    1. 數據庫庫信息輸出格式以下所示,首先挑出不須要備份的庫
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      [root@hai7-6 data]$mysql -e 'show databases' |cat Database <==表頭,不須要備份 information_schema <==狀態信息,不須要備份 hi mysql performance_schema <==狀態信息,不須要備份 test
    2. 實現方法
      方法1:while…do…done
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'show databases' | grep -Ev 'Database|information|performance'|while read dbname ;do mysqldump -B $dbname|gzip > /data/${dbname}_bak`date +%F`.gz;done
      方法2 :使用sed語句實現
      bash能夠接收標準輸出,標準輸出是一個可執行的腳本就能夠執行
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'show databases'|grep -Ev '^Database|info|perfor'|sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1_bak`date +%F`.gz@'|bash
      方法3:使用for循環
             
             
             
             
             
      • 1
      [root@hai7-6 data]$for db in `mysql -e 'show databases'|grep -Ev '^Database|info|perfor'`;do mysqldump -B $db |gzip > /data/${db}_bak`date +%F`.gz;done

4.2 MyISAM、InnoDB再mysqldump中特殊的備份選項

  • MyISAM
    支持溫備;不支持熱備,因此必須先鎖定要備份的庫,然後啓動備份操做
    鎖定方法以下:

    1. -x,--lock-all-tables:加全局讀鎖,鎖定全部庫的全部表,同時加–single-transaction或–lock-tables選項會關閉此選項功能
      注意:數據量大時,可能會致使長時間沒法併發訪問數據庫
    2. -l,--lock-tables:對於須要備份的每一個數據庫,在啓動備份以前分別鎖定其全部表,默認爲on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會形成數據不一致
      注:以上選項對InnoDB表同樣生效,實現溫備,但不推薦使用
  • InnoDB備份選項
    支持熱備,可用溫備但不建議用溫備

    1. 選項
      --single-transaction:單事務轉儲
      此選項Innodb中推薦使用,不適用MyISAM
      備份大型表時,建議將–single-transaction選項和–quick結合一塊兒使用
    2. 做用
      此選項會開始備份前,先執行START TRANSACTION指令開啓事務,經過在單個事務中轉儲全部表來建立一致的快照;僅適用於存儲在支持多版本控制的存儲引擎中的表(目前只有InnoDB能夠); 轉儲不保證與其餘存儲引擎保持一致。
    3. 注意實現
      1. 在進行單事務轉儲時,要確保有效的轉儲文件(正確的表內容和二進制日誌位置),沒有其餘鏈接使用如下語句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE(清空表),由於事務開啓時默認級別3,可重複讀狀態對DDL語言起不到徹底隔離做用,只有讀過的表纔會上鎖,沒有讀的表,其餘事務是能夠作刪除等操做的,再去讀取數據就會不一樣。
      2. 此選項和–lock-tables(此選項隱含提交掛起的事務)選項是相互排斥

4.3 生產環境實戰備份策略

  • InnoDB建議備份策略
         
         
         
         
         
    • 1
    mysqldump -uroot -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/backup/fullbak_$BACKUP_TIME.sql
  • MyISAM建議備份策略
         
         
         
         
         
    • 1
    mysqldump -uroot -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/BACKUP/fullbak_$BACKUP_TIME.sql
  • 示例
  1. 目的
    模擬生產環境數據庫恢復,徹底備份,並還原至最新狀態
  2. 步驟
    1. 將數據文件和二進制日誌文件分開存放,修改配置文件,並啓動二進制日誌功能
             
             
             
             
             
      • 1
      • 2
      • 3
      [root@hai7-6 ~]$vim /etc/my.cnf datadir=/vg_data/mysqldata <==數據文件路徑 log_bin=/vg_data/mysqlbin/mysql_bin <==二進制日誌文件路徑
    2. 備份數據
             
             
             
             
             
      • 1
      [root@hai7-6 ~]$mysqldump -A -F --single-transaction --master-data=2 --hex-blob|gzip > /data/all_back.aql.gz
    3. 備份後,再建立幾條記錄,供二進制日誌還原使用
             
             
             
             
             
      • 1
      • 2
      MariaDB [hi]> INSERT teachers VALUES(10,'A',40,'M') MariaDB [hi]> INSERT teachers VALUES(11,'B',50,'M');
    4. 模擬故障,刪除全部數據文件
             
             
             
             
             
      • 1
      [root@hai7-6 data]$rm -rf /vg_data/mysqldata/*
    5. 開始還原數據,從這裏開始禁止用戶訪問,直到還原完成,中止mariadb服務,再啓動服務,生成系統數據庫文件,若是是自編譯安裝,須要運行系統腳本生成
             
             
             
             
             
      • 1
      • 2
      • 3
      [root@hai7-6 mysqlbin]$systemctl stop mariadb '啓動服務,讓系統自動生成系統數據庫' [root@hai7-6 mysqlbin]$systemctl start mariadb
    6. 解壓備份文件
             
             
             
             
             
      • 1
      [root@hai7-6 data]$gzip -d all_back.aql.gz
    7. 中止二進制日誌服務,避免導入備份文件時生成大量二進制數據,影響備份時間點後的數據恢復,將備份文件導入mysql中
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      1. '中止二進制日誌服務' MariaDB [(none)]> SET sql_log_bin=off; 2. '還原徹底備份數據' MariaDB [(none)]> source /data/all_back.aql 3. '查看徹底備份還原效果' MariaDB [hi]> SELECT * FROM teachers; <==沒有第3步添加的,備份後數據 +-----+---------------+-----+--------+ | 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 | a | 20 | M | | 6 | B | 30 | F | | 8 | c | 100 | M | +-----+---------------+-----+--------+
    8. 查看備份文件,確認二進制日誌文件備份位置,將備份後生成的數據位置導入文件,恢復到最新狀態,開放用戶訪問數據庫
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      1. '查看備份文件,確認二進制日誌文件徹底備份時位置' [root@hai7-6 data]$vim all_back.aql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000002', MASTER_LOG_POS=245; 2. '將245位置後的二進制日誌內容導入至文件in.sql中' [root@hai7-6 data]$mysqlbinlog --start-position=245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql 3. '進入mysql,中止二進制日誌功能' MariaDB [(none)]> SET sql_log_bin=off; 4. '將備份後生成的二進制文件導入數據庫中' MariaDB [hi]> SOURCE /data/in.sql 5. '恢復二進制日誌記錄功能' MariaDB [hi]> SET sql_log_bin=on 6. '查看恢復效果' MariaDB [hi]> 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 | a | 20 | M | | 6 | B | 30 | F | | 8 | c | 100 | M | | 10 | A | 40 | M | <==備份後數據,恢復成功 | 11 | B | 50 | M | +-----+---------------+-----+--------+

4.4 誤刪除文件,致使系統問題

前面步驟相同,在恢復到備份文件點後,須要在二進制日誌文件中,找出誤刪除操做,註釋掉或者刪除,而後將備份後二進制日誌文件追加導出至指定文件,再導入系統

   
   
   
   
   
  • 1
  • 2
[root@hai7-6 data]$mysqlbinlog --start-position=245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql [root@hai7-6 data]$mysqlbinlog /vg_data/mysqlbin/mysql_bin.000003 >> in.sql

5. 專業恢復工具xtrabackup

5.1 概述

  • 官方網站
    xtrabackup是由Percona公司開發的工具
    官網:https://www.percona.com
    手冊:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html

  • 簡介
    percona提供的mysql數據庫備份工具,唯一開源的可以對innodb和xtradb數據庫進行熱備的工具

  • 特色:

    1. 備份還原過程快速、可靠
    2. 備份過程不會打斷正在執行的事務
    3. 可以基於壓縮等功能節約磁盤空間和流量
    4. 自動實現備份檢驗
    5. 開源,免費
  • Xtrabackup備份過程
    在這裏插入圖片描述

    1. 開啓innobackupex 腳本,打開調用xtrabackup
    2. xtrabackup二進制程序建立一些對應線程,redo拷貝線程,來拷貝事務日誌
    3. 開啓另一個線程ibd拷貝線程來拷貝數據庫文件,待數據庫文件拷貝完成,結束線程,通知innobackupex 腳本,數據庫文件拷貝完成
    4. innobackupex 腳本收到通知,立刻加一個全局鎖,開始複製MyISAM 數據庫存儲引擎的相關數據,當MyISAM 數據庫相關數據拷貝結束,發出中止redo拷貝的指令,xtrabackup收到指令後中止redo拷貝線程
    5. 解鎖,而後等待子進程xtrabackup結束退出,整個備份結束

5.2 舊版(2.2以前)與新版xtrabackup區別

  • 舊版
    1. 包括4個可執行文件:
      1. innobackupex:Perl 腳本
        1. 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上作了一層封裝實現的
        2. 雖然目前通常不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,所以備份基本都經過 innobackupex 命令進行
      2. xtrabackup:C/C++ 編譯的二進制
        用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 MySQL Server 沒有交互
      3. xbcrypt:加解密
      4. xbstream:支持併發寫的流文件格式
  • 新版變化
    xtrabackup版本升級到2.4後,相比以前的2.1有了比較大的變化
    1. innobackupex 功能所有集成到 xtrabackup 裏面,只有一個 binary程序
    2. 爲了兼容考慮,innobackupex做爲 xtrabackup 的軟連接,即xtrabackup如今支持非Innodb表備份,
    3. Innobackupex在下一版本中移除,建議經過xtrabackup替換innobackupex

5.3 xtrabackup語法選項

  • 安裝xtrabackup

    1. 在EPEL源中
      yum install percona-xtrabackup
    2. 最新版本下載安裝:下載格式爲rpm能夠直接使用yum安裝,須要依賴EPEL源中一些程序
      https://www.percona.com/downloads/XtraBackup/LATEST/
      新版將xtrabackup和innobackupex組合在一塊兒,顯示爲軟鏈接
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 data]$ll /usr/bin/innobackupex lrwxrwxrwx 1 root root 10 Oct 14 18:23 /usr/bin/innobackupex -> xtrabackup
  • Xtrabackup備份

    1. 語法格式
      innobackupex [option] BACKUP-ROOT-DIR
    2. 選項說明
      https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
      1. --user
        該選項表示備份帳號
      2. --password
        該選項表示備份的密碼
      3. --host
        該選項表示備份數據庫的地址
      4. --databases
        該選項接受的參數爲數據庫名,若是要指定多個數據庫,彼此間須要以空格隔開;如:「xtra_test dba_test」,同時,在指定某數據庫時,也能夠只指定其中的某張表。如:「mydatabase.mytable」。該選項對innodb引擎表無效,仍是會備份全部innodb表
      5. --defaults-file
        該選項指定從哪一個文件讀取MySQL配置,必須放在命令行第一個選項位置
      6. --incremental
        該選項表示建立一個增量備份,須要指定–incremental-basedir
      7. --incremental-basedir
        該選項指定爲前一次全備份或增量備份的目錄,與–incremental同時使用
      8. --incremental-dir
        該選項表示還原時增量備份的目錄
      9. --include=name
        指定表名,格式:databasename.tablename
  • Xtrabackup準備階段(Prepare)

    1. 語法格式
      innobackupex --apply-log [option] BACKUP-DIR
    2. 選項說明:
      1. --apply-log
        通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態,最後一次還原須要作的,例以下圖中的T3回滾到T4,至關於零時目錄的扎口,說明數據補入到此完成
      2. --use-memory
        --apply-log選項一塊兒使用,當prepare 備份時,作crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G
      3. --export
        表示開啓可導出單獨的表以後再導入其餘Mysql中
      4. --redo-only
        此選項在prepare base full backup,往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併,用在T3以前的備份,確保事務不回滾,新版本爲--apply-log-only
  • Xtrabackup還原階段

    1. 語法格式
      innobackupex --copy-back [選項] BACKUP-DIR
      innobackupex --move-back [選項] [–defaults-group=GROUP-NAME] BACKUP-DIR
    2. 選項說明
      1. --copy-back
        作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
      2. --move-back
        這個選項與–copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本
      3. --force-non-empty-directories
        指定該參數時候,使得innobackupex --copy-back--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。若是--copy-back--move-back文件須要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗

5.4 Xtrabackup還原原理

在這裏插入圖片描述

  • Xtrabackup使用這個過程分爲三個階段

    1. 備份階段
    2. 準備階段:整理數據
    3. 還原階段
  • 還原工做原理

    1. Xtrabackup在備份時會執行redo進程將事務日誌進行備份,可能出現事務日誌不徹底備份狀況,如上圖所示事務A和B,在2次增量備份中各備份了一半
    2. Xtrabackup在準備階段會找一個零時目錄,在目錄中將T一、T二、T3都還原進去,湊齊完整數據,以後再進行還原階段操做
      1. 在準備階段,先進行徹底備份還原T1(假設T1沒有不完整事務,實際工做中晚徹底備份也可能存在不完整事務,原理相同)
      2. 還原增量備份T2,因爲存在不完整事務,須要增長--apply-log-only或--read-only,使其處於中間狀態,在還原T3時,湊齊另外一半,儘量的保證數據完整
      3. 還原增量備份T3(後續沒有備份),只能還原事務B的一半,當系統工做時事務B就會回滾,因此真實還原的時間點爲回滾後的T4
      4. 若是二進制日誌沒有丟能夠經過二進制日誌找回事務B
  • 還原注意事項

    1. datadir目錄必須爲空。
      除非指定innobackupex --force-non-empty-directorires選項指定(強制使用非空目錄 ),不然–copy-backup選項不會覆蓋
    2. 在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中
    3. 因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶
      chown -R mysql:mysql /data/mysql
      以上須要在用戶調用innobackupex以前完成
  • 備份生成的相關文件
    使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立以下文件:

    1. xtrabackup_info:innobackupex
      工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置
    2. xtrabackup_checkpoints
      備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息。數據庫存放數據一樣是以塊(InnoDB頁)爲單位(16k大小),每一個塊都會包含一個日誌序列號,即LSN,系統備份會根據LSN記錄這次備份位置,在下次增量備份時,以此位置的LSN序列號向後備份都最新數據。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的
    3. xtrabackup_binlog_info
      MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復
    4. backup-my.cnf
      備份命令用到的配置選項信息
    5. xtrabackup_logfile
      備份生成的日誌文件,xtrabackip還原過程的日誌

5.5 舊版Xtrabackup徹底備份及還原

  • 在原主機
    1. 備份數據到目錄/backups下
      innobackupex --user=root /backups
    2. 將備份數據傳送到目標主機
      scp -r /backups/2018-02-23_11-55-57/ 目標主機:/data/
      舊版會自動在備份目錄下生成以時間格式命名的目錄如2018-02-23_11-55-57
  • 在目標主機
    1. 整理數據,將不完整的事務回滾
      innobackupex --apply-log /data/2018-02-23_11-55-57/
    2. 中止服務
      systemctl stop mariadb
    3. 刪除原數據庫數據
      rm -rf /var/lib/mysql/*
    4. 將整理過的數據複製到數據庫工做目錄,系統會自動根據配置文件找到工做目錄
      innobackupex --copy-back /data/2018-02-23_11-55-57/
    5. 修改權限是mysql具備寫權限
      chown -R mysql.mysql /var/lib/mysql/
    6. 啓動服務
      systemctl start mariadb

5.5 新版Xtrabackup徹底備份及還原

  • 在原主機

    1. 作徹底備份到/data目錄下
             
             
             
             
             
      • 1
      [root@hai7-6 ~]$xtrabackup --backup --target-dir=/data
    2. 將備份拷貝到目標目錄
             
             
             
             
             
      • 1
      [root@hai7-6 ~]$scp -r /data 192.168.50.111:/data
  • 在目標主機上

    1. 模擬故障,中止服務,清空數據庫
             
             
             
             
             
      • 1
      • 2
      [root@hai7-6 ~]$systemctl stop mariadb [root@hai7-6 ~]$rm -rf /var/lib/mysql/*
    2. 預準備:確保數據一致,提交完成的事務,回滾未完成的事務
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --target-dir=/data/data
    3. 複製到數據庫目錄
      注意:數據庫目錄必須爲空,MySQL服務不能啓動
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --copy-back --target-dir=/data/data
    4. 還原屬性
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      '拷貝完成後的屬性' [root@hai7-8 ~]$ll /var/lib/mysql/ drwxr-x--- 2 root root 310 Oct 15 10:04 hi '還原屬性' [root@hai7-8 ~]$chown -R mysql:mysql /var/lib/mysql
    5. 啓動服務
      systemctl start mariadb

5.6 舊版Xtrabackup徹底,增量備份及還原

  • 在原主機
    1. 徹底備份數據
      innobackupex /backups
    2. 創建兩個目錄存放增量備份
      mkdir /backups/inc{1,2}
    3. 修改數據庫內容,作第一增量備份,加--incremental選項,表示爲增量備份
             
             
             
             
             
      • 1
      innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42(徹底備份生成的路徑)
    4. 再次修改數據庫內容,基於inc1再次增量備份
             
             
             
             
             
      • 1
      innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17 (上次增量備份生成的路徑)
    5. 所有備份後,將數據發送給目標端
      scp -r /backups/* 目標主機:/data/
  • 在目標主機
    1. 不啓動mariadb,刪除數據庫原工做目錄下全部文件
      rm -rf /var/lib/mysql/*
    2. 第一次整理,徹底備份
      innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
    3. 第二次整理,將增量備份與徹底備份整理在一塊兒
             
             
             
             
             
      • 1
      innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc1/2018-02-23_14-26-17
    4. 第三次整理,將第三次增量與第二次整理結果整理在一塊兒
             
             
             
             
             
      • 1
      innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc2/2018-02-23_14-28-29/
    5. 將整理好的數據複製到數據庫工做目錄
      innobackupex --copy-back /data/2018-02-23_14-21-42/
    6. 修改權限
      chown -R mysql.mysql /var/lib/mysql/
    7. 啓動服務
      systemctl start mariadb

5.6 新版Xtrabackup徹底,增量備份及還原

  • 原主機,備份過程
    1. 備份過程,服務器必須啓動
      創建3各目錄,分別存放徹底備份和2次增量備份
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mkdir {base,inc1,inc2}
    2. 徹底備份
             
             
             
             
             
      • 1
      [root@hai7-6 data]$xtrabackup --backup --target-dir=/data/base
    3. 第一次修改數據
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'use hi; INSERT teachers VALUES(12,"AB",25,"F")'
    4. 第一次基於徹底備份的增量備份inc1
             
             
             
             
             
      • 1
      [root@hai7-6 data]$xtrabackup --backup --target-dir=/data/inc1 --incremental-basedir=/data/base
    5. 第二次修改數據
             
             
             
             
             
      • 1
      [root@hai7-6 data]$mysql -e 'use hi; INSERT teachers VALUES(13,"BB",31,"M")'
    6. 基於inc1的二次增量備份
             
             
             
             
             
      • 1
      [root@hai7-6 data]$xtrabackup --backup --target-dir=/data/inc2 --incremental-basedir=/data/inc1
    7. 拷貝備份文件到目標主機
             
             
             
             
             
      • 1
      [root@hai7-6 data]$scp -r /data/ 192.168.50.111:/data
  • 目標主機準備階段(prepare)
    1. 整理徹底備份,此選項–apply-log-only阻止回滾未完成的事務
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --apply-log-only --target-dir=/data/data/base
    2. 合併第1次增量備份到徹底備份
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --apply-log-only --target-dir=/data/data/base --incremental-dir=/data/data/inc1
    3. 合併第2次增量備份到徹底備份:最後一次還原不須要加選項–apply-log-only
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --prepare --target-dir=/data/data/base --incremental-dir=/data/data/inc2
  • 目標主機還原階段
    1. 複製到數據庫目錄,注意數據庫目錄必須爲空,MySQL服務不能啓動
             
             
             
             
             
      • 1
      [root@hai7-8 data]$xtrabackup --copy-back --target-dir=/data/data/base
    2. 還原屬性,啓動服務
             
             
             
             
             
      • 1
      • 2
      [root@hai7-8 base]$chown -R mysql:mysql /var/lib/mysql [root@hai7-8 base]$systemctl start mariadb

5.7 Xtrabackup單表備份與還原

  • 版本要求
    mariadb在5.6以上版本
  • 實驗目標
    用Xtrabackup備份單表,並恢復
  • 步驟
    1. 單表備份hellodb數據庫的students表: --include表示指定哪一個表來備份,後跟導出目錄
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$innobackupex -uroot -p123456 --include='hellodb.students' /backups
    2. 備份表結構,備份文件內有描述信息,還原時須要刪除
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$mysql -p123456 -e 'SHOW CREATE TABLE hellodb.students'> students.sql
    3. 模擬誤操做,刪除表
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$mysql -pfree123456 -e 'DROP TABLE hellodb.students'
    4. 將備份的表設爲導出狀態,關鍵詞--export
             
             
             
             
             
      • 1
      • 2
      '導出後會在備份目錄多出2個文件students.cfg和students.exp' [root@hai7-8 ~]$innobackupex --apply-log --export /backups/2018-10-15_11-19-23/
    5. 按照表結構建立表,參考步驟2中的表結構,從CREATE開始日後的內容,建立表後會生成表結構文件students.frm和空的數據文件students.ibd(直接拷貝文件到數據庫中,會報錯‘doesn’t exist in engine’,系統數據庫是識別不了的)
             
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      MariaDB [hellodb]> CREATE TABLE `students` > (\n `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT, > \n `Name` varchar(50) NOT NULL, > \n `Age` tinyint(3) unsigned NOT NULL, > \n `Gender` enum('F','M') NOT NULL, > \n `ClassID` tinyint(3) unsigned DEFAULT NULL, > \n `TeacherID` int(10) unsigned DEFAULT NULL, > \n PRIMARY KEY (`StuID`), > \n KEY `index_age` (`Age`), > \n KEY `idx_name_age` (`Name`,`Age`)\n) > ENGINE=InnoDB > AUTO_INCREMENT=26 > DEFAULT CHARSET=utf8;
    6. 刪除表空間,也就是students.ibd文件,不能直接覆蓋,須要執行SQL語句
             
             
             
             
             
      • 1
      MariaDB [hellodb]> ALTER TABLE students DISCARD TABLESPACE;
    7. 將備份表下的cfg,exp,ibd三個文件,拷貝到對應數據庫工做目錄
             
             
             
             
             
      • 1
      [root@hai7-8 ~]$cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /data/mysql/hellodb/
    8. 修改權限屬性
             
             
             
             
             
      • 1
      [root@hai7-8 hellodb]$ chown -R mysql.mysql /data/mysql/hellodb
    9. 將表空間數據文件恢復回去,只拷貝過去不識別
             
             
             
             
             
      • 1
      MariaDB [hellodb]> ALTER TABLE hellodb.students IMPORT TABLESPACE;
</div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
            </div>
相關文章
相關標籤/搜索