Mysql 備份與恢復

Mysql Backup and Recover

1 備份簡介

 

1.1 備份分類

數據庫備份,分爲冷備、熱備,全備與增量備份,邏輯備份與物理備份。 以上三種不一樣的說法,是因爲側重點不一樣:css

類型 側重點
冷備與熱備 數據庫是否仍提供服務。不提供服務爲冷備,提供服務的同時進行備份爲熱備
全備與增量備份 備份全部數據爲全量,只備份自上次全量備份以來的有變更的數據爲增量
邏輯備份與物理備份 取數據方式:邏輯從數據庫取出數據而後以某種格式存儲
  物理備份直接拷貝數據文件

1.2 備份工具

如今主流的備份工具是mysqldump 和extrabackup(mariabackup). 其中 mysqldump 是邏輯備份工具,將數據從數據庫中讀取出,而後輸出到文本文件。咱們可使用平常的文本編輯工具 直接查看和編輯。html

而xtrabackup 是percona 公司開發的Mysql物理備份開源工具。可是隨着MySQL被Oracle收購後,原MySQL之父, 從新開發了一款MySQL: MariaDB, 成爲MySQL系列數據中的一個重要分支。不只支持MySQL的全部功能,還擁有MySQL 所不支持的存儲引擎,以及擁有更強大的性能。xtrabackup 目前不支持10.1.23以後的版本,由於Mariadb的新特性。 因此Mariadb在xtrabackup的基礎上進行了二次開發,並集成到安裝包裏。該工具支持MySQL數據庫的全備和增量備份。java

2 邏輯備份與恢復

mysqldump 在不一樣的分支及版本中, 參數可能不盡相同,可是大部分功能及做用是相同的。 下面是Mariadb 10.2.5 中的Mysqldump的基本用法、參數說明及示例。python

2.1 備份

mysqldump 的基本使用方法:mysql

Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

2.1.1 參數說明

這裏只列出平常使用的參數,linux

參數縮略 參數全稱 說明
-A –all-databases 導出全部的數據庫,包括系統自帶的數據
-Y –all-tablespaces 導出全部的表空間
-y –no-tablespaces 不導出表空間信息
  –add-drop-database 在create database語句以前先輸出drop database語句
  –add-drop-table 在建表語句以前,有刪除表的SQL(DROP TABLE IF EXISTS)
    默認打開
  –add-drop-trigger 建立觸發器以前,若是有同名觸發器,先刪除
  –add-locks 插入數據前,先鎖表,默認打開,使用–skip-add-locks關閉
  –allow-keywords 導出時,容許關鍵詞做爲表的字段名
  –apply-slave-statements 導出的內容, 在change master語句以前,先輸出stop slave
    而且將 start slave 放到導出文件的末尾
-B –databases 導出指定數據庫,多個數據庫名之間使用空格分隔
  –default-character-set 指定默認字符集
  –delayed-insert 使用 INSERT DELAYED 語法插入數據
  –dump-slave[=#] 此參數只適用於從節點. 值爲1, 會輸出"change master"命令,
    值爲2,"change master"命令會被註釋掉。同時會自動啓用
    –lock-all-tables,除非使用了–single-transaction
-F –flush-logs 將內存中的數據寫入磁盤,須要注意的是,若是導出多個數據庫
    須要配合–lock-all-tables或者 –master-data參數使用
    不然,每導出一個庫就會執行一次flush logs
  –gtid 使用gtid 替代 master_log信息,與–master-data 或者
    –dump-slave配合使用
  –ignore-table 不導出某張表
  –include-master-host-port 與–dump-slave配合使用, 導出時,將mast_host,
    master_port 信息補全,默認是沒有的
-x –lock-all-tables 在導出數據過程當中對全部表執行read lock鎖。並自動關閉
    –sgingle-transaction和–lock-tables
-l –lock-tables 對全部表執行read lock,默認開啓,可以使用
    –skip-lock-tables關閉
  –master-data 鏈接主庫備份時使用, 值爲1, 輸出change master 命令
    到文件,值爲2時,change master 命令被註釋。使用此
    選項,會自動開啓–lock-all-tables, 除非另外指定了
    –single-transaction,在5.3以前,即便如此,也會
    在剛開始時,有個短暫的全局的read lock.
  –max-allowed-packet 與服務器數據交換時單次包最大容量,通常用於性能優化
  –net-buffer-length 網絡buffer大小,通常用於性能優化
-n –no-create-db 導出內容不包含create database語句
-t –no-create-info 導出內容,不包含create table語句
-d –no-data 不導出表裏的數據
  –no-data-med 不導出管理外部數據的存儲引擎信息,默認開啓,
    能夠經過–skip-no-data-med關閉
  –order-by-primary 導出的數據按照主鍵排序(若是有的話),可是導出時間明顯加長
-p –password MySQL用戶密碼
-P –port mysql 端口
-q –quick 不查詢buffer,直接導出
  –replace 使用replace into語句代替insert into語句
-r –result-file 將導出內容輸出到該文件
-R –routines 導出函數和存儲過程
  –single-transaction 單事務處理,保證數據一致性,會自動關閉–lock-tables.
    僅支持InnoDB
  –dump-date 記錄導出時間,默認開啓,使用–skip-dump-date可關閉
  –skip-opt 關閉部分默認選項,好比 –add-drop-table, –add-locks,
    –create-options, –quick, –extended-insert,
    –lock-tables, –set-charset, and –disable-keys.
-S –socket 指定用於鏈接MySQL的socket file
-T –tab 只有在MySQL服務器上導出時生效,每張表一個文件
–tables   導出表,替代-B(–datebases)選項
–triggers   導出表時,導出與之相關的觸發器,默認開啓
    使用–skip-triggers關閉
-u –user=name 鏈接MySQL的用戶
-v –verbose 導出時,輸出每一個階段的明細
-V –version 輸出Mysqldump的版本
-w –where=name 根據where指定的條件,導出查詢結果

2.1.2 使用示例

  • 備份全部庫c++

    mysqldump -uroot -proot --all-databases -r alldb.sql
    
  • 備份指定數據庫正則表達式

    mysqldump -uroot -proot -B test -r structure.sql
    
  • 備份表算法

    mysqldump -uroot -proot --tables test.a1 test.a2 > tables.sql
    
  • 備份表中部分數據sql

    mysqldump -uroot -proot --tables test.a1 test.a2 --where="create_date>'2019-01-01'" -r partial_data.sql
    
  • 備份函數與存儲過程

    mysqldump -uroot -proot --routines --no-create-db --no-data --no-tablespaces --no-create-info -r routines.sql
    
  • 備份結構可是不備份數據

    mysqldump -uroot -proot -B test --no-data > structure_$(date "+%Y%m%d_%H%M%S").sql
    

2.2 恢復

邏輯備份的恢復很是簡單,由於備份的結果是可讀取的sql文件。能夠經過mysql 的 source 命令執行, 不過通常使用"<"來進行恢復。假如備份文件是test.sql,恢復 示例以下:

mysql -uroot -proot < test.sql

3 物理備份與恢復

mysql 物理庫的物理備份,特別要感謝percona公司開發的xtrabackup 工具,使Mysql 具有 了不停機物理備份(熱備)的能力。

而Mariadb在xtrabackup的基礎上進行了二次開發。使其可以在10.1.23及以後的版本中進行 在線熱備。

3.1 percona-xtrabackup

xtrabackup 只支持innodb和XtraDB 存儲引擎。雖然如今innodb 是最流行的。可是爲了 追求速度,不少數據庫會使用MYSIAM存儲引擎。爲了支持MYSIAM,咱們可使用innobackupex.

Percona 在2.3 版本用C重寫了 innobackupex ,innobackupex 功能所有集成到 xtrabackup 裏面,只有一個 binary,另外爲了使用上的兼容考慮,innobackupex 做爲 xtrabackup 的一個 軟連接。版本2.3 擺脫了以前2個進程協做的負擔,架構上明顯要好於以前版本,該版本以後推薦使用 xtrabackup 腳本進行備份。

3.1.1 版本兼容性

mysql5.1在源碼中配備了兩個版本的innodb存儲引擎源碼:innobase和innodb_plugin,編譯安裝的時候能夠經過參數 –with-plugins=innobase,innodb_plugin來指定將innodb存儲引擎引入,具體這兩個參數引入對編譯後的mysql產 生怎樣的差別,後面再作解析。然而對於Percona XtraBackup,在release版本中有2.0,2.1,2.2三個大版本,而後每 個版本都是與mysql發佈的innodb存儲引擎版本對應,舉例來講:

percona-xtrabackup-2.0.8在BUILD.txt中指定了utils/build.sh參數以下:

Build an xtrabackup binary against the specified InnoDB flavor.

Usage: build.sh CODEBASE
where CODEBASE can be one of the following values or aliases:
  innodb50         | 5.0                   build against innodb 5.1 builtin, but should be compatible with MySQL 5.0
  innodb51_builtin | 5.1                   build against built-in InnoDB in MySQL 5.1
  innodb51         | plugin                build against InnoDB plugin in MySQL 5.1
  innodb55         | 5.5                   build against InnoDB in MySQL 5.5
  innodb56         | 5.6,xtradb56,         build against InnoDB in MySQL 5.6
                   | mariadb100
  xtradb51         | xtradb,mariadb51      build against Percona Server with XtraDB 5.1
                   | mariadb52,mariadb53
  xtradb55         | galera55,mariadb55    build against Percona Server with XtraDB 5.5

而在percona-xtrabackup-2.1.9在BUILD.txt中指定了utils/build.sh參數以下:

The script needs the codebase for which the building is targeted, you must
provide it with one of the following values or aliases:

  ================== =========  =============================================
  Value              Alias      Server
  ================== =========  =============================================
  innodb51           plugin build against InnoDB plugin in MySQL 5.1
  innodb55           5.5    build against InnoDB in MySQL 5.5
  xtradb51           xtradb     build against Percona Server with XtraDB 5.1
  xtradb55           xtradb55   build against Percona Server with XtraDB 5.5
  innodb56           5.6        build against InnoDB in MySQL 5.6
  ================== =========  =============================================

從以上兩個版本對比中,咱們知道,從2.1版本開始,percona-xtrabackup 取消對Mysql innodb51_builtin 的支持。

所以在安裝percona xtrabackup 的時候,要先確認即將安裝的xtrabackup版本是否支持當前的MySQL版本。

3.1.2 安裝

  • 下載 perconna-xtrabackup
  • 下載Mysql 源碼包。 由於perconna-xtrabackup 版本與mysql 版本是有對應關係的。若是不知道須要安裝哪一個版本,能夠先進行安裝,在 沒有mysql 源碼包的狀況下,會有提示
  • 安裝 示例以下:

    wget https://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/source/percona-xtrabackup-2.0.8.tar.gz
    tar -xf percona-xtrabackup-2.0.8.tar.gz
    cd percona-xtrabackup-2.0.8
    wget https://cdn.mysql.com/archives/mysql-5.1/mysql-5.1.59.tar.gz
    ./utils/build.sh 5.1
    cp ./innobackupex /usr/bin/
    cp ./usr/xtrabackup_51 /usr/bin/xtrabackup
    

3.1.3 參數詳解

--apply-log
  經過應用錄下的事務日誌文件xtrabackup_logfile,在BACKUP-DIR目錄準備一個備份。頁創建一個新的事務日誌文件。innoDB的配置是從innobackupex備份時創建的文件backup-my.cnf讀取。
--close-files
  不保持文件被打開。默認備份時tablespace不關閉,但若是表空間很大而且不適合任何限制,有一個可選的方法是關閉再也不訪問的文件。使用該選項會產生不一致的備份。
--compact
  創建一個忽略耳機索引頁的簡潔備份。
--compress
創建一個innoDB數據文件的壓縮備份。它直接提交給xtrabackup的子進程
--compres-threads=#
並行壓縮的工做進場數量,它直接提交給xtrabackup的子進程
--compress-chunk-size=#
指定每一個壓縮進程的內部工做緩衝區的尺寸,用字節來測量。它直接提交給xtrabackup的子進程
--copy-back
複製全部的備份到他們原來的位置
--databases=LIST
指定將要備份的數據庫列表。支持databasename.tablename格式,若是沒指定參數,則備份全部數據庫
--decompress
解壓全部以選項--compress備份的,結尾是.qp的文件。使用參數--parallel容許多個文件同時被解密和或解壓。
--decrypt=ENCRPYTION-ALGORITHM
解密用--encrpyt選項加密的以.xbcrypt結尾的文件。
--defaults-file=[my.cnf]
經過制定一個字符串來設置MySQL的默認選項
--defaults-extra-file=[my.cnf]
在從標準的默認文件中取值默認以前的額外文件。接收一個字符串做爲選項
--defaults-group=GROUP-NAME
若是用了Mysqld_multi,可設置讀取配置文件的特定組
--encrypt=ENCRYPTION-ALGORITHM
該選項指引xtrabackup使用參數ENCRYPTION_ALGORITHM參數制定的算法,加密innoDB數據文件的備份,它直接指向子進程
--encrypt-key=ENCRYPTION_KEY
指示xtrabackup在備份時使用ENCRYPTION_KEY指定的key作--encrypt加密。它直接傳給子進程
--encrypt-key-file=ENCRYPTION_KEY_FILE
當用選項--encrpyt加密時使用存儲在ENCRYPTION_KEY_FILE裏存儲的加密key
--encrypt-threads=#
指定並行加密的工做線程數。它直接傳給子進程
--encrypt-chunk-size=#
指定每一個加密進程使用的內粗工做緩衝區的尺寸,以字節計算大小
--export
它用於導出單個表用於導入另外一個server
--extra-lsndir=DIRECTORY
指定xtrabackup_checkpoints文件的保留目錄
--force-non-empty-directories
  該參數使得選項--copy-back or --move-back選項傳輸文件到非空目錄。不存在的文件將被覆蓋。若是選項--copy-back or --move-back必須從備份目錄到一個已經存在的目標目錄,則將失敗
--galera-info
  該選項在備份時創建包含本地節點狀態xtrabackup_galera_info文件。用於執行Percona-XtraDB-Cluster備份
--host=HOST
  執行經過TCP/IP鏈接訪問數據庫的主機,它傳給mysql的子進程
--ibbackup=IBBACKUP-BINARY
  接收字符串參數,它用來指定要使用的xtrabackup binary、
--include=REGEXP
  指定一個正則表達式,用語匹配格式爲databasename.tablename的表名稱,它傳遞給--tables選項
--incremental
  創建一個增量備份,傳遞給xtrabackup的子進程。該參數能夠和參數--incremental-lsn or --incremental-basedir配合使用。
--incremental-basedir=DIRECTORY
  指定一個包換全庫備份的目錄做爲增量備份的基礎數據庫
--incremental-dir=DIRECTORY
  指定增量備份與全庫備份合併去創建一個新的全備份的目錄。
--incremental-lsn=LSN
  指定增量備份將要開始的LSN,它替代選項--incremental-basedir
--kill-long-queries-timeout=SECONDS
  該選項指定innobackupex在開始FLUSH TABLES WITH READ LOCK和殺掉這些阻礙他的查詢之間的時間的等待時間,以秒計算,默認爲0,意味着innobackupex不嘗試殺任何查詢,
  該選項須要process and super權限
--kill-long-query-type=all|select
  指定解鎖全局鎖時將被殺掉的查詢類型,默認是all
--lock-wait-timeout=SECONDS
  運行FLUSH TABLES WITH READ LOCK以前,innobackupex等待阻塞查詢的時間數(秒數)
--lock-wait-threashold=SECONDS
  選項指定查詢運行時間閥值,當innobackupex發現長運行查詢伴隨着--lock-wait-timeout的一個非0值,
--lock-wait-query-type=all|update
  指定innobackupex發出一個全局鎖以前什麼類型的查詢容許完成
--lock-copy-interval=#
  指定日誌日誌複製線程檢車完成的時間間隔,以毫秒計算
--move-back
  移動以前的全部備份從一個備份目錄到他們的原始位置
--no-lock
  不容許使用flush tables with read lock表鎖。若是你的全部表示INNODB而且你不關心二進制日誌備份的位置。若是有任何DDL語句被執行或任何非INNODB表上的update操做,這個選項就不能使用
--notimestamp
  把備份放在一個經過選項backup-root-dir指定的子目錄裏
--no-version-check
  禁止版本檢查
--parallel=NUMBER-OF-THREADS
  該選項接收一個整數,xtarbackup子進程將用於同時備份文件的併發數。若是有多個.ibd文件能夠並行,若是隻有一個表空間文件,則該選項無效
--password=PASSWORD
  指定鏈接到數據庫的帳戶密碼
--port=PORT
  該選項指定經過TCP/IP鏈接到數據庫時所用的端口
--rebuild-indexes
  只有用--apply-log選項時它纔有效,當應用日誌後使得xtrabackup重建全部的二級索引。通常用於準備簡約備份
--rebuild-threas=NUMBER-OF-THREADS
  當一塊兒使用選項--apply-log and --rebuild-indexes選項時纔有用,使用後,當重建索引時,xtrabackup處理表空間時用必定數量的線程的並行模式
--redo-only
  選項用於準備全庫備份和合並處最有一個備份外的全部增量備份。它強制xtrabackup忽略「rollback」階段只作「redo」.
--rsync
  使用rsync工具優化本地文件傳輸。它讓xtrabackup使用rsync複製全部非innoDB文件,而不是使用多個cp
--safe-slave-backup
  中止從SQL進程並等待啓動備份直到slave_open_temp_tables的值爲0。若是沒有打開臨時表,備份會進行,不然SQL進程將啓動並直到沒有打開的臨時表時中止。若是slave_open_temp_tables在--
safe-slave-backup-timeout秒後沒有變成0,則備份會失敗。備份結束後,從SQL進程將從新啓動
--safe-slave-backup-timeout=SECONDS
  --safe-slave-backup要等slave_open_temp_tables變成0的時間,默認爲300秒
--scopt=SCP-OPTIONS
  當參數--remost-host指定時傳遞給scp的參數
--slave-info
  當備份一個複製從庫操做的時候用,它打印二進制日誌的position和主庫的名字,它頁把這些信息寫入xtrabackup_slave_info文件做爲一個CHANGE MASTER命令
--socket=SOCKET
  指定鏈接到本地數據庫sever時使用的一個unix domain socket,它沒有修改的傳入mysql子進程
--sshopt=SSH-OPTIONS
  當使用參數--remost-host時,使用ssh的命令行參數
--stream=STREMNAME
  當使用流備份時使用的特定格式。備份將以特定格式傳到STDOUT。支持的格式爲tar and xbstream
--tables-file=FILE
  指定備份的表的列表,格式爲database.tablename
--throttle=IOS
  指定I/O操做的數量/秒。該參數只適用於備份階段。不適用於參數--apply-log,--copy-back
--tmpdir=DIRECTORY
  在參數--stream使用時指定,是指臨時文件被存儲的位置
--use-memory=#
  該參數只能和參數--apply-log配合使用,被用於xtrabackup作creash恢復時準備鎖使用的內存量(單位:字節)。也支持其餘單位,如:1MB,1M,1GB,1G
--user=USER
  指定鏈接到mysql時使用的用戶名
--version
  顯示innobackupex的版本信息和版權等信息
--version-check
  指定該選項後,innobackupex將在創建一個鏈接後,在備份階段執行一個版本檢查

3.1.4 備份與恢復

備份與恢復的示例與mariabackup的使用方法幾乎是同樣的。參見增量備份與恢復.

3.2 mariabackup

因爲 xtrabackup不支持MariaDB的InnoDB頁壓縮和靜態數據加密技術,因此Mariadb 基於 Percona XtraBackup 2.3.8 開發了開源產品 mariabackup ,並在MariaDB 10.1.23 和 MariaDB 10.2.7, GA版本 MariaDB 10.1.26 and MariaDB 10.2.10 中首次發佈。 用於對InnoDB,Aria和MyISAM表進行物理在線備份.

mariabackup是集成在MariaDB安裝包中的,所以不須要額外安裝

3.2.1 參數詳解

mariabackup的參數與extrabackup的參數用法與意義上基本相同,其使用方法與意義在下面 表格中進行詳細說明。其中參數選項部分,在使用時,應在其前面加上「–」, 如:"mariabackup –backup"。

以下:

參數選項 意義
apply-log-only 在10.1中,增量備份時可使用此參數,與prepare使用,只應用
  apply stage的binlog,忽略crash recovery stage的binlog
  10.2及之後的版本中再也不使用。
backup 執行備份操做,將生成的備份文件存放於target-dir指定的路徑中
binlog-info 告訴mariabackup如何讀取binlog的信息。有三個可用值:
  OFF: 不讀binlog
  ON: 讀取binlog,並在能夠保證數據一致性的位置執行blocking
  AUTO: 讀取binlog,並在支持的狀況下使用ON或者lockless選項
  LOCKLESS: mariabackup不支持此值。
close-files 是否關閉文件句柄。打開時,mariabackup能夠處理DDL。關閉時
  mariabackup對大文件的備份更加可控,可是有可能致使數據不一致
  ,所以我的建議不關閉。保持默認打開狀態。
compress 10.2.25中還是可用的。可是在10.3官方文檔中明確說明爲
  deprecated.對應的解壓參數也過時了。建議使用stream
  使用第三方的壓縮庫對數據流進行壓縮,示例以下:
  備份時進行加密和壓縮:
  mariabackup –user=root –backup –stream=xbstream |
  gzip | openssl enc -aes-256-cbc -k mypass >
  backup.xb.gz.enc
  解密和解壓縮:
  openssl enc -d -aes-256-cbc -k mypass -in
  backup.xb.gz.enc | gzip -d| mbstream -x
copy-back 將備份恢復至datadir變量指向的路徑。要求該路徑爲空。配合
  參數force-non-empty-directories可恢復至非空路徑
core-file 當導出時遇到fatal signals,能夠加上此參數,導出內核信息
  便於分析定位和解決問題。
databases 指定須要備份的數據或者表。對的,這個參數支持備份表,其語法:
  –databases="db[.table][db[.table] …]"
  若是要導出大部分庫或者表,可使用databases-exclude選項
  將不須要的庫或者表過濾掉,用法與databases是同樣的。
databases-file 將須要導出的庫或者表放到一個文件中,經過此參數來指定該文件
datadir 指定數據文件路徑。mariabackup將從這個路徑讀取數據進行備份
   
print-defaults 輸出各類參數及變量的值,並退出備份程序
no-defaults 不讀MySQL的參數文件。 也就是不讀my.cnf文件
defaults-file 指定mariabackup默認讀取的參數文件。指的是My.cnf文件,能夠不
  用默認的my.cnf. 此參數應在其餘全部參數以前。
defaults-extra-file defaults-file讀完後,讀取此參數配置的參數文件,經過此參數
  文件能夠修改 defaults-file中的默認配置
defaults-group 指定讀取參數文件中的哪一部份內容。好比讀取[mariabackup]
  中的配置。
export 與prepare配合使用,會生成一個cfg文件。針對file-per-table
  每一個表文件(表空間)會生成一個cfg文件,該文件可用於恢復備份
  中的部份內容,好比某張表或者某個分區。
extra-lsndir 複製一份xtrabackup_checkpoints、xtrabackup_info到另
  外一個路徑
force-non-empty-directories 與copy-back或者move-back配合使用。當datadir路徑非空時
  使用此參數,將強制恢復到datadir路徑。
ftwrl-wait-query-type 與backup配合使用,讓mariabackup等待相對應的操做完成再
  執行global lock. 有三個可用值: all| update | select
ftwrl-wait-threshold 與ftwrl-wait-query-type配合使用,SQL執行時間大於此參數
  設置的值時,進入等待,直到ftwrl-wait-timeout的時間。
  前提是ftwrl-wait-timeout 大於0.
ftwrl-wait-timeout 默認0,表示不等待任何SQL執行完即執行global lock.
  單位秒。表示mariabackup最多等待時間,超事後再也不等待。
incremental-basedir 對該路徑進行增量備份(備份上次備份以後有修改過的文件)
  與backup參數配合使用。
incremental-dir 針對已經prepare的路徑。對prepare路徑進行增量處理。
  主要是應用.delta文件和binlog文件。
incremental-force-scan 與incremental-basedir配合使用,對將要備份的文件進行全
  掃描,即便有對應的位圖信息(經過位圖信息保存增量對比)
incremental-history-name 爲每次增量指定一個邏輯名。
incremental-lsn 備份時只備份比lsn大的文件。
innobackupex 經過此參數,能夠啓用innobackupex的特性。
innodb-adaptive-hash-index 備份時開啓innodb adaptive hash index,也是默認設置
  關閉此特性,使用–skip-innodb-adaptive-hash-index
innodb-autoextend-increment 備份文件自動擴展,每次擴展的大小,單位M。
   
verbose 輸出備份日誌明細
version 輸出備份工具的版本號
target-dir 備份文件的存儲路徑
prepare 將備份文件進行數據一致性處理,以進行恢復。在徹底備份的狀況下
  文件不是時間點一致的,由於它們是在不一樣時間進行的快照,須要通
  mariabackup –prepare 處理成一致狀態。增量恢復時,須要使用
  prepare命令和incremental-dir選項將增量備份應用到全備中去.

3.2.2 使用mariabackup搭建主從複製

默認場景
  • 從庫的 MariaDB 已安裝,並配置好參數文件。
  • 主庫已運行一段時間,不方便停業務
  1. 準備工做
    • 主庫建立複製用戶

      主庫建立用於複製數據的用戶;

      GRANT replication slave ON *.* TO 'rep1'@'10.1.61.10' IDENTIFIED BY 'repl123';
      
      note
      10.1.61.10 爲從庫IP。
    • 建立存儲備份的路徑

      在主備兩端都須要建立。

      #建立備份路徑, mysql 用戶須要有權限訪問
      mkdir -p /home/mysql/backup
      
    • 安裝依賴包

      備庫須要安裝qpress工具(前提是備份時使用 compress 參數,若是不使用該參數也能夠 ,只要空間足夠). 請到qpress官網 下載最新版本。當前是 qpress-11 . 對於 Linux系統只須要如下三步:

      wget http://www.quicklz.com/qpress-11-linux-x64.tar
      tar xvf qpress-11-linux-x64.tar
      cp qpress /usr/bin
      
  2. 備份主庫
    • 備份

      mariabackup -uroot --backup --target-dir=/home/mysql/backup --all-databases --use-memory=10G
      

      備份示例:

      [root@tycxdb2 backup]#  mariabackup -uroot --backup --target-dir=/home/mysql/backup --all-databases --use-memory=10G
      [00] 2019-08-08 23:11:42 Connecting to MySQL server host: localhost, user: root, password: not set, port: not set, socket: not set
      [00] 2019-08-08 23:11:42 Using server version 10.2.25-MariaDB-log
      mariabackup based on MariaDB server 10.2.25-MariaDB Linux (x86_64)
      [00] 2019-08-08 23:11:42 uses posix_fadvise().
      [00] 2019-08-08 23:11:42 cd to /home/mysql/data/
      [00] 2019-08-08 23:11:42 open files limit requested 0, set to 1024
      [00] 2019-08-08 23:11:42 mariabackup: using the following InnoDB configuration:
      [00] 2019-08-08 23:11:42 innodb_data_home_dir =
      [00] 2019-08-08 23:11:42 innodb_data_file_path = ibdata1:12M:autoextend
      [00] 2019-08-08 23:11:42 innodb_log_group_home_dir = ./
      [00] 2019-08-08 23:11:42 InnoDB: Using Linux native AIO
      [00] 2019-08-08 23:11:42 using O_DIRECT
      ........ 內容過多省略 .....
      mariabackup: Stopping log copying thread.[00] 2019-08-08 23:45:00 >> log scanned up to (793437226795)
      
      [00] 2019-08-08 23:45:00 >> log scanned up to (793437226795)
      [00] 2019-08-08 23:45:00 Executing UNLOCK TABLES
      [00] 2019-08-08 23:45:00 All tables unlocked
      [00] 2019-08-08 23:45:00 Copying ib_buffer_pool to /home/mysql/backup/ib_buffer_pool
      [00] 2019-08-08 23:45:00         ...done
      [00] 2019-08-08 23:45:00 Backup created in directory '/home/mysql/backup/'
      [00] 2019-08-08 23:45:00 MySQL binlog position: filename 'mysql-bin.000939', position '48267434', GTID of the last change '0-22-190568113'
      [00] 2019-08-08 23:45:00 Writing backup-my.cnf
      [00] 2019-08-08 23:45:00         ...done
      [00] 2019-08-08 23:45:00 Writing xtrabackup_info
      [00] 2019-08-08 23:45:00         ...done
      [00] 2019-08-08 23:45:00 Redo log (from LSN 793366546585 to 793437226795) was copied.
      [00] 2019-08-08 23:45:00 completed OK!
      
      note
      • 物理備份的速度至關快,mysql datadir 路徑218G 數據 34分鐘備份完成,備份文件201G, 若是空間充足,建議不使用 compress 選項,雖然雖然節省了空間和傳輸時間,可是 解壓耗時至關長, 另外不可使用 prepare 選項對備份文件應用日誌, 恢復到另一個 數據庫的時候會存在問題。
      • use-memory 能夠加快導出的速度,可是要注意本機的可用物理內容。
    • 將備份傳送至目標服務器

      scp /home/mysql/backup 192.168.111.20:/home/mysql/backup
      
  3. 備份恢復
    • 數據文件一致性處理 在徹底備份的狀況下,文件不是時間點一致的,由於進行快照的時間點不同。若是嘗 試在未prepare數據的狀況下還原數據庫,雖然操做上支持恢復,可是在啓動的時候仍會 進行數據recovery。

      運行帶 /prepare/選項的 /mariabackup/命令會使數據文件進行統一,達到數據一 致性的目的,從而將其還原到MariaDB Server後不會有異常。

      使用增量備份時,須要 prepare 選項 和 incremental-dir 選項配合使用 以使用增量備份中的文件進行恢復。

      mariabackup --prepare --target-dri=/home/mysql/backup --user root
      

      示例:

        mariabackup --user root --prepare --target-dir=./
      mariabackup based on MariaDB server 10.2.25-MariaDB Linux (x86_64)
      [00] 2019-08-09 01:07:25 cd to /home/mysql/backup/
      [00] 2019-08-09 01:07:25 This target seems to be not prepared yet.
      [00] 2019-08-09 01:07:25 mariabackup: using the following InnoDB configuration for recovery:
      [00] 2019-08-09 01:07:25 innodb_data_home_dir = .
      [00] 2019-08-09 01:07:25 innodb_data_file_path = ibdata1:12M:autoextend
      [00] 2019-08-09 01:07:25 innodb_log_group_home_dir = .
      [00] 2019-08-09 01:07:25 InnoDB: Using Linux native AIO
      [00] 2019-08-09 01:07:25 Starting InnoDB instance for recovery.
      [00] 2019-08-09 01:07:25 mariabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Uses event mutexes
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Compressed tables use zlib 1.2.7
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Using Linux native AIO
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Number of pools: 1
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Using SSE2 crc32 instructions
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Initializing buffer pool, total size = 100M, instances = 1, chunk size = 100M
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Completed initialization of buffer pool
      2019-08-09  1:07:25 139813501150976 [Note] InnoDB: page_cleaner coordinator priority: -20
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Highest supported file format is Barracuda.
      2019-08-09  1:07:25 139813761947776 [Note] InnoDB: Starting crash recovery from checkpoint LSN=793366562214
      2019-08-09  1:07:27 139813761947776 [Note] InnoDB: Starting a batch to recover 7054 pages from redo log.
      2019-08-09  1:07:40 139813559899904 [Note] InnoDB: To recover: 2396 pages from log
      2019-08-09  1:07:55 139813761947776 [Note] InnoDB: Read redo log up to LSN=793393743872
      2019-08-09  1:07:55 139813761947776 [Note] InnoDB: Starting a batch to recover 6218 pages from redo log.
      2019-08-09  1:08:10 139813543114496 [Note] InnoDB: To recover: 1785 pages from log
      2019-08-09  1:08:21 139813761947776 [Note] InnoDB: Starting final batch to recover 3572 pages from redo log.
      2019-08-09  1:08:25 139813559899904 [Note] InnoDB: To recover: 1325 pages from log
      2019-08-09  1:08:29 139813761947776 [Note] InnoDB: Last binlog file './mysql-bin.000939', position 48267434
      [00] 2019-08-09 01:08:30 Last binlog file ./mysql-bin.000939, position 48267434
      
    • 恢復數據

      mariabackup --defaults-file=/etc/my.cnf --rsync --copy-back --target-dir=/home/mysql/backup/
      

      這裏的copy-back 的目標路徑是 –defualts-file 中匹配的datadir。就是從target-dir中將備份恢復到 datadir中。

    • 啓動從庫

      systemctl start mysqld
      
    • 創建主從複製關係

      1. 查看主的binlog起始點 因爲以前準備工做中已經建立了複製用戶, 這一步只須要修改從庫的master信息。而 master 信息咱們經過備份文件中的 xtrabackup_binlog_info 文件來查看。 文件內容示例:

        # cat xtrabackup_binlog_info
        mysql-bin.000938        658662639       0-22-190059068
        

        第一列對應master_log_file,第二列對應master_log_pos, 第三列主gtid值。

      2. 啓動從庫MySQL

        systemctl start mysqld
        

        copy-back 後,首次啓動,可能會花費比較長的時間,由於要進行數據一致性處理。 也可能僅一次啓動沒法完成數據recover,須要屢次從新啓動。 啓動時,注意觀察日誌,示例以下:

             ...........
        2019-08-08 22:37:41 140011134244608 [Note] InnoDB: To recover: 3497 pages from log
        2019-08-08 22:39:26 140012383484032 [Note] InnoDB: 5 transaction(s) which must be rolled back or cleaned up in total 22784714 row operations to undo
        2019-08-08 22:39:26 140012383484032 [Note] InnoDB: Trx id counter is 383051520
        2019-08-08 22:39:26 140012383484032 [Note] InnoDB: Starting final batch to recover 2661 pages from redo log.
        2019-08-08 22:39:26 140011159422720 [Note] InnoDB: To recover: 2660 pages from log
        2019-08-08 22:39:29 140012383484032 [Note] InnoDB: Last binlog file './mysql-bin.000938', position 658662639
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: 128 out of 128 rollback segments are active.
        2019-08-08 22:39:30 140011067102976 [Note] InnoDB: Starting in background the rollback of recovered transactions
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: Creating shared tablespace for temporary tables
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: Waiting for purge to start
        2019-08-08 22:39:30 140012383484032 [Note] InnoDB: 5.7.26 started; log sequence number 793713315141
        2019-08-08 22:39:30 140010019874560 [Note] InnoDB: Loading buffer pool(s) from /home/mysql/data/ib_buffer_pool
        2019-08-08 22:39:30 140012383484032 [Note] Plugin 'FEEDBACK' is disabled.
        2019-08-08 22:39:30 140012383484032 [Note] Semi-sync replication initialized for transactions.
        2019-08-08 22:39:30 140012383484032 [Note] Semi-sync replication enabled on the master.
        2019-08-08 22:39:30 140012383484032 [Note] Recovering after a crash using tc.log
        2019-08-08 22:39:30 140012383484032 [Note] Starting crash recovery...
        2019-08-08 22:39:30 140012383484032 [Note] Crash recovery finished.
        2019-08-08 22:39:30 140012383484032 [Note] Server socket created on IP: '::'.
        2019-08-08 22:39:30 140012383484032 [Note] Reading of all Master_info entries succeeded
        2019-08-08 22:39:30 140012383484032 [Note] Added new Master_info '' to hash table
        2019-08-08 22:39:30 140012383484032 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
        Version: '10.2.25-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution
        2019-08-08 22:39:30 140010019874560 [Note] InnoDB: Buffer pool(s) load completed at 190808 22:39:30
        
      3. 配置主從關係
      change master to master_host='10.1.61.9',master_port=3306,master_user='rep1',master_password='repl123',master_log_file='mysql-bin.000938',master_log_pos=658662639;
      
    • 開始主從複製

      啓動主從複製,並確認複製進程是否正常。

      mysql -e "start slave; show slave status\G"
      

3.2.3 增量備份與恢復

進行增量備份與恢復,首先要進行全量備份,再進行增量備份,而後將增量備份應用至全量備份。不支持壓縮過的備份。

  1. 全量備份

    mariabackup --backup --target-dir=/backup/fullbackup  -uroot -Proot
    
  2. 增量備份

    mariabackup --backup --target-dir=/backup/incremental_backup \
     --incremental-basedir=/backup/fullbackup -uroot -Proot
    
  3. prepare全量備份

    mariabackup -uroot -Proot --prepare --target-dir=/backup/fullbackup --apply-log-only
    
  4. 合併全量備份與增量備份

    mariabackup -uroot -Proot --prepare --target-dir=/backup/fullbackup/ \
      --incremental-dir=/backup/incremental_backup/   --apply-log-only
    
  5. 將合併好的文件複製到數據文件路徑 恢復以前,先確認一下目標路徑是否爲空。儘可能爲空,若確實要恢復至不爲空的路徑中, 須要額外使用參數 –force-non-empty-directories .

    恢復的目標路徑,默認是/etc/my.cnf 中的datadir配置。若是須要恢復到其餘位置 可使用 –datadir 選項從新指定數據文件路徑。

    mariabackup -uroot -Proot --copy-back --target-dir=/backup/fullbackup/
    

    恢復完成後,注意查看datadir及其中文件的屬組

Author: halberd

Created: 2019-08-23 Fri 19:00

Validate

相關文章
相關標籤/搜索