MariaDB之基於Percona Xtrabackup備份大數據庫[完整備份與增量備份] node
1.Xtrabackup的安裝 mysql
percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm sql
lftp 172.16.0.1:/pub/Sources/6.x86_64/Percona> get percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm 數據庫
yum -y install percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm vim
2、Xtrabackup徹底備份的實現 app
一、前提準備 ide
(1)建立數據備份目錄 大數據
[root@node19 ~]# mkdir /backups/ spa
(2)修改二進制日誌文件存儲路徑 日誌
[root@node19 ~]# vim /etc/mysql/my.cnf
log-bin=/mydata/binlogs/master-bin
(3) 修改建立的文件的所屬主和所屬組
[root@node19 ~]#mkdir /mydata/binlogs
[root@node19 ~]#chown –R ysql.mysql /mydata/data/
(4)受權一個最小權限的用戶進行復制
MariaDB [(none)]> grant reload,lock tables,replication client on *.* to 'backup'@'localhost' identified by 'backup';
MariaDB [(none)]> flush privileges;
二、完整備份的實現
(1)導入一個數據庫,就不本身建庫了
MariaDB [hellodb]> set sql_log_bin=0; #導入數據庫過程無需記錄二進制日誌,把以先暫時關閉
MariaDB [hellodb]> source hellodb.sql;
MariaDB [hellodb]> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> set sql_log_bin=1; #開啓二進制日誌
MariaDB [(none)]> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
(2)作完整備份
[root@node19 ~]# innobackupex --user=backup --password=backup --host=localhost /backups/ #作完備
innobackupex: Backup created in directory '/backups/2015-01-22_19-47-43' #備份存儲路徑
innobackupex: MySQL binlog position: filename 'master-bin.000001', position 367 #二進制日誌及位置信息
150122 19:47:46 innobackupex: Connection to database server closed
150122 19:47:46 innobackupex: completed OK! #只有到了這裏才說明備份成功
[root@node19 ~]#
看一下備份目錄中生成的一些文件
[root@node19 backups]# pwd
/backups
[root@node19 backups]# ls
2015-01-22_19-47-43
[root@node19 backups]# cd 2015-01-22_19-47-43/
[root@node19 2015-01-22_19-47-43]# ll
total 12324
-rw-r--r-- 1 root root 357 Jan 22 19:47 backup-my.cnf
drwxr-xr-x 2 root root 4096 Jan 22 19:47 hellodb
-rw-r----- 1 root root 12582912 Jan 22 19:47 ibdata1
drwx------ 2 root root 4096 Jan 22 19:47 mysql
drwxr-xr-x 2 root root 4096 Jan 22 19:47 performance_schema
drwxr-xr-x 2 root root 4096 Jan 22 19:47 test
-rw-r--r-- 1 root root 24 Jan 22 19:47 xtrabackup_binlog_info
-rw-r----- 1 root root 89 Jan 22 19:47 xtrabackup_checkpoints
-rw-r--r-- 1 root root 581 Jan 22 19:47 xtrabackup_info
-rw-r----- 1 root root 2560 Jan 22 19:47 xtrabackup_logfile
3、使用徹底備份恢復數據
一、模擬數據誤刪除
[root@node19 ~]# cd /mydata/data/
[root@node19 data]# ls
aria_log.00000001 aria_log_control hellodb ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test xtrabackup_info
[root@node19 data]# rm -rf ./*
[root@node19 data]# ls
二、準備一個徹底備份
[root@node19 ~]# innobackupex --apply-log /backups/2015-01-22_19-47-43/
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1626134
150122 19:56:59 innobackupex: completed OK!
注意:不要在備份完成後整理,要在恢復時再去整理
三、從徹底備份中恢復數據
在此時恢復數據時,不要啓動mysql
[root@node19 ~]# innobackupex --copy-back /backups/2015-01-22_19-47-43/
.
.
.
150122 20:00:55 innobackupex: completed OK! #到了這裏就說明恢復成功了
查看下數據目錄
[root@node19 data]# pwd
/mydata/data
[root@node19 data]# ll
total 110612
drwxr-xr-x 2 root root 4096 Jan 22 20:00 hellodb
-rw-r--r-- 1 root root 12582912 Jan 22 20:00 ibdata1
-rw-r--r-- 1 root root 50331648 Jan 22 20:00 ib_logfile0
-rw-r--r-- 1 root root 50331648 Jan 22 20:00 ib_logfile1
drwxr-xr-x 2 root root 4096 Jan 22 20:00 mysql
drwxr-xr-x 2 root root 4096 Jan 22 20:00 performance_schema
drwxr-xr-x 2 root root 6 Jan 22 20:00 test
-rw-r--r-- 1 root root 24 Jan 22 20:00 xtrabackup_binlog_pos_innodb
-rw-r--r-- 1 root root 581 Jan 22 20:00 xtrabackup_info
數據是都回來了,但是數據的屬主和屬組都是root,因此應該將其所有修改成mysql
[root@node19 ~]# chown -R mysql.mysql /mydata/data/
[root@node19 ~]# ll /mydata/data/
total 110612
drwxr-xr-x 2 mysql mysql 4096 Jan 22 20:00 hellodb
-rw-r--r-- 1 mysql mysql 12582912 Jan 22 20:00 ibdata1
-rw-r--r-- 1 mysql mysql 50331648 Jan 22 20:00 ib_logfile0
-rw-r--r-- 1 mysql mysql 50331648 Jan 22 20:00 ib_logfile1
drwxr-xr-x 2 mysql mysql 4096 Jan 22 20:00 mysql
drwxr-xr-x 2 mysql mysql 4096 Jan 22 20:00 performance_schema
drwxr-xr-x 2 mysql mysql 6 Jan 22 20:00 test
-rw-r--r-- 1 mysql mysql 24 Jan 22 20:00 xtrabackup_binlog_pos_innodb
-rw-r--r-- 1 mysql mysql 581 Jan 22 20:00 xtrabackup_info
啓動mysql服務,連入mysql驗證是否正常
[root@node19 ~]# service mysqld start
Starting MySQL [ OK ]
[root@node19 ~]# mysql
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.04 sec)
一個不差,數據完美恢復成功
4、使用innobackupex進行增量備份
每一個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增加。這正是InnoDB表能夠進行增量備份的基礎,即innobackupex經過備份上次徹底備份以後發生改變的頁面來實現。
須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
一、新建一個數據庫,達到數據庫發生變化的目的
MariaDB [(none)]> create database t1;
Query OK, 1 row affected (0.05 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| t1 |
| test |
+--------------------+
6 rows in set (0.00 sec)
二、進行第一次增量備份
[root@node19 ~]# innobackupex --incremental /backups/ --incremental-basedir=/backups/2015-01-22_19-47-43/
.
.
innobackupex: Created backup directory /backups/2015-01-22_20-13-29 #增量備份也產生了一個以時間命名的目錄
innobackupex: MySQL binlog position: filename 'master-bin.000001', position 484 #記錄的二進制日誌及位置
150122 20:13:34 innobackupex: Connection to database server closed
150122 20:13:34 innobackupex: completed OK! #出現OK說明操做成功
其中,/backups/2014-04-21_11-28-06/指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backups目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
若是每一次都相對於上次的徹底備份作增量備份,那就是差別備份!
既然徹底備份出來的目錄是以日期+時間爲命名的,而增量備份也是日期+時間命名的,那應該怎麼區分這個備份出來的數據目錄是徹底備份仍是增量備份呢
其實也不少簡單,只需進入備份出來的目錄看一下它的xtrabackup_checkpoints就知道了
[root@node19 backups]# pwd
/backups
[root@node19 backups]# ls
2015-01-22_19-47-43 2015-01-22_20-13-29
[root@node19 backups]# cd 2015-01-22_19-47-43/
[root@node19 2015-01-22_19-47-43]# ls
backup-my.cnf ib_logfile0 performance_schema xtrabackup_binlog_pos_innodb xtrabackup_logfile
hellodb ib_logfile1 test xtrabackup_checkpoints
ibdata1 mysql xtrabackup_binlog_info xtrabackup_info
[root@node19 2015-01-22_19-47-43]# cat xtrabackup_checkpoints
backup_type = full-prepared #這就是徹底備份
from_lsn = 0
to_lsn = 1625632
last_lsn = 1625632
compact = 0
那再看一下剛纔備份出來的那個增量備份的目錄中的xtrabackup_checkpoints
[root@node19 backups]# ls
2015-01-22_19-47-43 2015-01-22_20-13-29
[root@node19 backups]# cd 2015-01-22_20-13-29/
[root@node19 2015-01-22_20-13-29]# cat xtrabackup_checkpoints
backup_type = incremental #這就是增量備份
from_lsn = 1625632
to_lsn = 1626144
last_lsn = 1626144
compact = 0
三、第二次增量備份
首先再建立一個數據庫,再讓數據庫變化下
MariaDB [(none)]> create database t2;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| t1 | #第一次增量備份時備份了t1這個庫
| t2 | #第一次增量備份時備份了t2這個庫
| test |
+--------------------+
7 rows in set (0.00 sec)
基於上一次增量備份再作增量備份(增量不就是這樣嗎?不是差別啊!)
[root@node19 ~]# innobackupex --incremental /backups/ --incremental-basedir=/backups/2015-01-22_20-13-29/ #指的目錄是上一次增量備份的目錄哦
innobackupex: Backup created in directory '/backups/2015-01-22_20-25-50'
innobackupex: MySQL binlog position: filename 'master-bin.000001', position 715
150122 20:25:55 innobackupex: Connection to database server closed
150122 20:25:55 innobackupex: completed OK! #看到OK才放心
第二次增量備份後又修改了數據庫,但此時修改完後還沒來得及作增量備份。像這樣的狀況,若是數據丟失了,在沒作增量備份的狀況下,就只能依靠二進制日誌文件來恢復了
MariaDB [(none)]> create database t3;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| t1 | #第一次增量備份時,備份到了t2這個庫
| t2 | #第二次增量備份時,備份到了t2這個庫
| t3 | #第三次增量備份時,備份到了t3這個庫
| test |
+--------------------+
8 rows in set (0.00 sec)
5、增量備份的還原
像準備徹底備份同樣, 增量備份的還原也須要有一個準備的過程
"準備"(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:
(1)須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行"重放"。"重放"以後,全部的備份數據將合併到徹底備份上。
(2)基於全部的備份將未提交的事務進行"回滾"。
因而,操做就變成了:
1. #innobackupex --apply-log --redo-only BASE-DIR
接着執行:
2. # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
然後是第二個增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是徹底備份所在的目錄,
而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,
INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即若是有屢次增量備份,每一次都要執行如上操做
1.刪除數據目錄下的全部文件
[root@node19 ~]# cd /mydata/data/ #刪除數據目錄下的全部
[root@node19 data]# rm -rf ./* #清空的很完全
[root@node19 data]# ls
還好有二進制日誌,這就是二進制日誌爲何要與數據目錄分開放的緣由,能夠作即時點還原
[root@node19 binlogs]# pwd
/mydata/binlogs
[root@node19 binlogs]# ll
total 16
-rw-rw---- 1 mysql mysql 946 Jan 22 20:28 master-bin.000001
-rw-rw---- 1 mysql mysql 346 Jan 22 20:06 master-bin.000002
-rw-rw---- 1 mysql mysql 68 Jan 22 20:06 master-bin.index
-rw-rw---- 1 mysql mysql 6 Jan 22 20:06 master-bin.state
二、數據還原準備過程
如今備份目錄中的狀況是這樣的,第一個文件是徹底備份,剩下的那兩個是增量備份
[root@node19 backups]# pwd
/backups
[root@node19 backups]# ls
2015-01-22_19-47-43 2015-01-22_20-13-29 2015-01-22_20-25-50
(1)準備第一次徹底備份
[root@node19 backups]# ls
2015-01-22_19-47-43 2015-01-22_20-13-29 2015-01-22_20-25-50
[root@node19 backups]# innobackupex --apply-log --redo-only 2015-01-22_19-47-43/ #準備徹底備份
.
.
.
InnoDB: Shutdown completed; log sequence number 1626134
150122 20:49:35 innobackupex: completed OK! #徹底備份準備OK
(2)準備第一次增量備份
[root@node19 backups]# ls
2015-01-22_19-47-43 2015-01-22_20-13-29 2015-01-22_20-25-50
[root@node19 backups]# innobackupex --apply-log --redo-only /backups/2015-01-22_19-47-43/ --incremental-dir=/backups/2015-01-22_20-13-29/
(3)準備第二次增量備份
[root@node19 backups]#innobackupex --apply-log --redo-only /backups/2015-01-22_19-47-43/ --incremental-dir=/backups/2015-01-22_20-25-50/
三、還原數據
(1)通過上面的三步準備,如今終於能夠還原數據了,下面就是見證奇蹟的時刻
[root@node19 backups]# ls
2015-01-22_19-47-43 2015-01-22_20-13-29 2015-01-22_20-25-50
[root@node19 backups]#innobackupex --copy-back /backups/2015-01-22_19-47-43/ #用準備好的徹底備份恢復數據
(2)查看下恢復回來的數據
通過一次徹底和兩次增量備份還原,數據已經恢復到了第二次增量備份時的狀態
[root@node19 backups]#cd /mydata/data/
[root@node19 data]# ll #第二次增量備份前的數據都回來了,只有後來哪一個t3庫沒有
#此時數據目錄中的全部文件的屬主屬組都是root,因此要修改爲mysql
[root@node19 data]# chown -R mysql.mysql *
(3)使用二進制日誌文件作即時點恢復
由於咱們在作第二次增量備份後,又修改了數據(建立了數據庫t3),因此數據只能恢復到第二次增量備份時的狀態,想要恢復之後的數據就只能依靠二進制日誌作即時點恢復了
①、 查看最後一個增量備份文件的cat xtrabackup_binlog_info,查看它的 二進制日誌,這個二進制日誌記錄數據庫最後一次操做爲備份的
[root@node19 backups]# ls
2015-01-22_22-05-03 2015-01-22_22-09-22 2015-01-22_22-10-52
[root@node19 2015-01-22_22-10-52]# cat xtrabackup_binlog_info
master-bin.000001 11331
②、 因爲二進制日誌是無法直接查看的,因此要先把它導出來,而後再看看裏面是否有咱們後來建立的hhht數據庫
[root@node19 binlogs]# pwd
/mydata/binlogs
[root@node19 binlogs]# ll
total 16
-rw-rw---- 1 mysql mysql 946 Jan 22 20:28 master-bin.000001
-rw-rw---- 1 mysql mysql 346 Jan 22 20:06 master-bin.000002
-rw-rw---- 1 mysql mysql 68 Jan 22 20:06 master-bin.index
-rw-rw---- 1 mysql mysql 6 Jan 22 20:06 master-bin.state
[root@node19 binlogs]#mysqlbinlog –-start-position=# master-bin.00000x > a.sql #導出二進制日誌
註釋:# 是查看增量最後備份文件裏 cat xtrabackup_checkpoints
查看其還原點。
③、查看使用二進制日誌導出的a.sql
[root@node19 binlogs]#vim a.sql
確實有剛纔建立的t3數據庫,那就是它了。如今把這個二進制日誌文件導出來並附加到數據庫中