當前位置:
首頁 > 最新 > XtraBackup 備份恢復

XtraBackup 備份恢復

XtraBackup 備份恢復

已經兩天拖更,小編這周因兒女情長之事,經歷了一場蛻變,也算是浴火重生,希望大家能夠珍惜身邊的人和感情,切記一句話:辦法總比問題多。也祝願有情人終成眷屬。好了,話不多說,先說說今天的XtraBackup。

Xtrabackup 是Percona公司提供的一款第三方開源在線備份工具,所以我們可以在percona的官方網站上下載相應的壓縮包,進行解壓安裝。

解壓之後會生成這樣一個目錄:

在目錄之下會有一下bin和share倆目錄,其中bin目錄是命令目錄,我們為了方便使用,可以將bin目錄下的命令文件考到/usr/local/mysql/bin/下(或者是自己配環境變數也行,目的是為了方便使用。

這裡innobackupex就是我們使用備份的工具命令,我們先看一下具體可以添加的參數文件:

--compress:該選項表示壓縮innodb數據文件的備份。

--compress-threads:該選項表示並行壓縮worker線程的數量。

--compress-chunk-size:該選項表示每個壓縮線程worker buffer的大小,單位是位元組,默認是64K。

--encrypt:該選項表示通過ENCRYPTION_ALGORITHM的演算法加密innodb數據文件的備份,目前支持的演算法有ASE128,AES192,AES256。

--encrypt-threads:該選項表示並行加密的worker線程數量。

--encrypt-chunk-size:該選項表示每個加密線程worker buffer的大小,單位是位元組,默認是64K。

--encrypt-key:該選項使用合適長度加密key,因為會記錄到命令行,所以不推薦使用。

--encryption-key-file:該選項表示文件必須是一個簡單二進位或者文本文件,加密key可通過以下命令行命令生成:openssl rand -base6424。

--include:該選項表示使用正則表達式匹配表的名字[db.tb],要求為其指定匹配要備份的表的完整名稱,即databasename.tablename。

--user:該選項表示備份賬號。

--password:該選項表示備份的密碼。

--port:該選項表示備份資料庫的埠。

--host:該選項表示備份資料庫的地址。

--databases:該選項接受的參數為數據名,如果要指定多個資料庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某資料庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表。此外,此選項也可以接受一個文件為參數,文件中每一行為一個要備份的對象。

--tables-file:該選項表示指定含有表列表的文件,格式為database.table,該選項直接傳給--tables-file。

--socket:該選項表示mysql.sock所在位置,以便備份進程登錄mysql。

--no-timestamp:該選項可以表示不要創建一個時間戳目錄來存儲備份,指定到自己想要的備份文件夾。

--incremental:該選項表示創建一個增量備份,需要指定--incremental-basedir。

--incremental-basedir:該選項表示接受了一個字元串參數指定含有full backup的目錄為增量備份的base目錄,與--incremental同時使用。

--incremental-dir:該選項表示增量備份的目錄。

--incremental-force-scan:該選項表示創建一份增量備份時,強制掃描所有增量備份中的數據頁。

--incremental-lsn:該選項表示指定增量備份的LSN,與--incremental選項一起使用。

--incremental-history-name:該選項表示存儲在PERCONA_SCHEMA.xtrabackup_history基於增量備份的歷史記錄的名字。Percona Xtrabackup搜索歷史表查找最近(innodb_to_lsn)成功備份並且將to_lsn值作為增量備份啟動出事lsn.與innobackupex--incremental-history-uuid互斥。如果沒有檢測到有效的lsn,xtrabackup會返回error。

我們發現xtrabackup 具有好的靈活性,可以壓縮備份,增量備份,備份加密等,功能十分強大,下面通過實驗讓我們對XtraBackup進行進一步的了解:

1. 全庫備份

首先在進行備份的時候我們需要做一些準備:

我們要為備份的結果創建一個目錄

所在的環境中,一定要有perl-DBD-mysql這個包安裝在資料庫當中,這是一個集成模塊,如果沒有它的話會,innobackup命令執行失敗。可以通過rpm包安裝或者通過yum安裝。

下面我們看下執行全備

innobackupex --defaults-file=/etc/my.cnf --user root -password oracle --socket=/tmp/mysql.sock /data/xtrabackup/

innobackupex: Backup created in directory "/data/xtrabackup/2018-04-16_14-21-56"

innobackupex: MySQL binlog position: filename "mysql-bin.000034", position 11502049

180416 14:23:18 innobackupex: Connection to database server closed

180416 14:23:18 innobackupex: completed OK!

看到這裡表示我們的備份已經執行完成了。

我們將執行命令之後的提示命令截出來,看看進行了什麼操作

180416 14:21:56 innobackupex: Connecting to MySQL server with DSN "dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup;mysql_socket=/tmp/mysql.sock" as "root" (using password: YES).

180416 14:21:56 innobackupex: Connected to MySQL server

180416 14:21:56 innobackupex: Executing a version check against the server...

180416 14:21:56 innobackupex: Done.

IMPORTANT: Please check that the backup run completes successfully.

At the end of a successful backup run innobackupex

prints "completed OK!".

innobackupex: Using mysql server version 5.6.16-log

innobackupex: Created backup directory /data/xtrabackup/2018-04-16_14-21-56

180416 14:21:56 innobackupex: Starting ibbackup with command: xtrabackup_56 --defaults-file="/etc/my.cnf" --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/data/xtrabackup/2018-04-16_14-21-56 --tmpdir=/tmp

我們看到,首先是在驗證參數文件。驗證套接字是否可以登陸。

[01] Copying ./ibdata1 to /data/xtrabackup/2018-04-16_14-21-56/ibdata1

這裡顯示的數字就是當前的lsn號,因為當前資料庫沒有事物變化,所以這個數沒有向下推進。

[01] Copying ./mysql/slave_relay_log_info.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/slave_relay_log_info.ibd

[01] ...done

[01] Copying ./mysql/innodb_index_stats.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/innodb_index_stats.ibd

[01] ...done

[01] Copying ./mysql/slave_worker_info.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/slave_worker_info.ibd

[01] ...done

[01] Copying ./mysql/innodb_table_stats.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/innodb_table_stats.ibd

[01] ...done

[01] Copying ./mysql/slave_master_info.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/slave_master_info.ibd

[01] ...done

[01] Copying ./test/aaa.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/aaa.ibd

[01] ...done

[01] Copying ./test/naonao.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/naonao.ibd

[01] ...done

[01] Copying ./test/ttt.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/ttt.ibd

[01] ...done

[01] Copying ./test/mytab.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/mytab.ibd

[01] ...done

xtrabackup: Creating suspend file "/data/xtrabackup/2018-04-16_14-36-16/xtrabackup_suspended_2" with pid "27474"

這裡我們可以看出數據正在向外備份,生成對應的ibd文件。

innobackupex: Backing up file "/data/mysql/test/mytab.frm"

innobackupex: Backing up file "/data/mysql/test/aaa.frm"

innobackupex: Backing up file "/data/mysql/test/naonao.frm"

innobackupex: Backing up file "/data/mysql/test/ttt.frm"

180416 14:37:34 innobackupex: Finished backing up non-InnoDB tables and files

還將相應的.frm結構導出。

我們進入相應的目錄查看一下備份文件,這種目錄都是資料庫自動以時間進行生成的。

進入目錄後發現,將會為每個資料庫創建一個目錄放置相應的文件

進入相應的資料庫文件中也會看到生成了相應的文件

2. 全庫恢復

我們試著去刪除一張表

使用備份將其恢復

innobackup --defaults-file =/etc/my.cnf --user root --password oracle --socket=/tmp/mysql.sock --apply-log /data/xtrabackup/2018-04-16_14-13-35

這裡日誌應用完成,但是沒有回復到資料庫當中,還有一步需要操作:

將之前的mysql數據文件刪掉,將xtrabakcup的文件拷到對應的目錄下,並且授權mysql,再將資料庫重啟,即可恢復。

3. 增量備份

增量備份其實主要是針對innodb資料庫而言的,對於myisam和其他的存儲引擎而言,其實任然是全備,增量備份主要是通過拷貝innodb有變更的頁,就是說和全備的lsn號有差異的那一部分。所以想要進行增量備份的話,必須得有一次全備的過程,第一次增量備份基於之前的全備去做,之後的增備基於之前的增備。

innobackupex --defaults-file =/etc/my.cnf --user root --password oracle --no-timestamp --socket=/tmp/mysql.sock --incremental --incremental-basedir=/data/xtrbackup/2018-04-16_14-21-56 /data/xtrbackup/2018-04-16_14-21-56-incre

這裡一定要帶上--no-timestamp,否則的話沒有辦法生成新的自定義文件。

命令生成的內容不多敘述,和全備相似。

我們查看生成的文件,以test資料庫為例,生成的文件有meta文件和delta,meta記錄了具體的頁的信息,delta記錄了具體的數據信息,大小也有所不同,這裡要注意。

4. 增量備份的恢復

增量備份的恢復有很多需要注意的地方,增量備份的恢復切記要永遠基於全備去恢復。

我們先看試驗,查看錶中數據,現在刪除幾條

我們查看一下增量備份的目錄,一次增備,一次全備,現在我們進行恢復操作。

第一次:

要做一次全庫恢復

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user root --password oracle --apply-log --redo-only /data/xtrbackup/2018-04-16_14-21-56

第二次:

要做一次增量恢復

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user root --password oracle --apply-log --redo-only /data/xtrabackup/ 2018-04-16_14-21-56 --incremental-dir=/data/xtrabackup/ 2018-04-16_14-21-56-incre

第三次:

如果還有增量備份的話,再次恢復的時候要基於全備去做

innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user root --password oracle --apply-log --redo-only /data/xtrabackup/ 2018-04-16_14-21-56 --incremental-dir=/data/xtrabackup/ 2018-04-16_14-21-56-incre2

接下來和全備一樣,將之前的mysql文件替換掉,使用新的備份文件,這裡注意的是,使用的文件是全備的文件,因為這個文件已經被增量備份所增追加過了,授權重啟資料庫,數據就回來了。

That"s allBY CUI PEACE~~~


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 最帥dba工作筆記 的精彩文章:

TAG:最帥dba工作筆記 |