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~~~
TAG:最帥dba工作筆記 |