您好,登錄后才能下訂單哦!
開源的一款數據庫備份工具,可以去官網下載并使用
percona-backupxtra對InonoDB會進行增量備份,面對MyISAM的數據進持完全備份。
1 xtrabackup只能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
2 innobackupex是一個封裝了xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。還有就是myisam不支持增量備份。
3 另外2個工具相對小眾些,xbcrypt 是加解密用的;xbstream 類似于tar,是 Percona 自己實現的一種支持并發寫的流文件格式。兩都在備份和解壓時都會用到(如果備份用了加密和并發)。
mysql:表是MyISAM引擎,讀多寫少,性能好。
實現方式:說實話,看這個不如看備份產生的信息,產生的信息中每一步都顯示出來,能更好帶你了解innobackupex 是如何備份的。
1 首先會啟動一個xtrabackup_log后臺檢測的進程,實時檢測mysql redo的變化,一旦發現redo有新的日志寫入,立刻將日志寫入到日志文件xtrabackup_log中
2 復制innodb的數據文件和系統表空間文件idbdata1到對應的以默認時間戳為備份目錄的地方
3 復制結束后,執行flush table with read lock操作
4 復制.frm .myd .myi文件
5 并且在這一時刻獲得binary log 的位置
6 將表進行解鎖unlock tables
7 停止xtrabackup_log進程
完全備份:
# innobackupex --user=root --password=mysql /PATH/TO/BACKUP-DIR/
如果要使用一個最小權限的用戶進行備份,則可基于如下命令創建此類用戶
> CREATE USER 'bkpuser'@'localhost' IDENRIFIED BY 'PASSWORD';
> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bkpuser';
> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
> FLUSH PRIVILEGES;
The RELOAD privilege enables use of the FLUSH statement. It also enables mysqladmin commands that are equivalent to FLUSH operations: flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, and reload.
The REPLICATION CLIENT privilege enables the use of the SHOW MASTER STATUS, SHOW SLAVE STATUS, and SHOW BINARY LOGS statements.
使用innobackupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關于表結構定義的相關文件(.frm)心及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中。
在備份的同時,innobackupex還會備份目錄中創建如下文件:
(1)xtrabackup_checkpoints 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;
每個InnoDB頁(通常為16K大小)都會包含一個日志序列號,即LSN,LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁最近是如何發生改變的。
(2)xtrabackup_binlog_infomysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。
3)xtrabackup_info備份的信息集合
(4)xtrabackup_binary 備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf備份命令用到的配置選項信息;
(6)xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0 從哪個數據塊開始備份
to_lsn = 1637454備份到哪里
last_lsn = 1637454最后的數據塊
會維護每個數據塊的日志序列號,如果數據發生改變,日志序列號就會往前走一次的,所以它可以根據這個號碼來進行增量備份。發生改變就備份,沒有改變就不用備份了。
在使用innobackupex進行備份時,還可以用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄,如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。
一般情況下,在備份完成后,數據尚且不能用于恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚且未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處于一致性狀態。
3、從一個完全備份中恢復數據
innobackupex命令的--copy-back選項用于執行恢復操作,其通過復制所有數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。
# innobackupex --copy-back /PATH/TO/BACKUP-DIR/ //--copy-back 或 --force-non-empty-directories
datadir必須是為空的,innobackupex –copy-back不會覆蓋已存在的文件
還原時需要先關閉服務,如果服務是啟動的,那么就不能還原到datadir。
如果執行正確,其輸出信息的最后幾行通常如下:
innobackupex: Starting to copy InnoDB log file
...
innobackupex: Finished copying back files.
innobackupex: completed OK!
請確保如上信息的最后一行出現“completed OK!”
當數據恢復至DATADIR目錄后,還需要確保所有數據文件的屬主和屬組均為正確的用戶,如mysql,否則,在啟動mysqld之前還需要先修改文件的屬主和屬組,如:
chown -R mysql.msyql /data/
4、使用innobackupex進行增量備份
每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的甚而,即innobackupex通過備份上次完全備份之后發生改變的頁面來實現。
要實現第一次增量備份,可以使用下面的命令進行:
# innobackupex --incremental /backup --incremental-dir=BASEDIR
ex:
innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_12-32-56/ --incremental /backup/
下一個增量備份要以之前的增量備份上做備份,也就是說--incremental-basedir=上一個新增的目錄,而不是全備的。
其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束后,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。另外,在執行過增量備份之后再一次進行增量備份時,其--incremental-dir應該指向上一次完全備份所在的目錄。
需要注意的是,增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言,執行增量備份其實進行的是完全備份,
“prepare”增量備份與整理完全備份有著一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”,“重放”之后,所有的備份數據將合并到完全備份上。
(2)基于所有的備份將未提交的事務進行“回滾”。
于是,操作就變成了:
#innobackupex --apply-log --redo-only BACKUP-DIR\//每一次的BACKUP-DIR都是全量備份文件的位置
接著執行:
# innobackupex --apply-log --redo-only BACKUP-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二個增量:
# innobackupex --apply-log --redo-only BACKUP-DIR(這里的目錄不是完全備份的目錄,面是上一次增量備份的目錄,因為是在上一次增量備份的基礎上還原的) --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1 指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,第一次都要執行如上操作;
首先準備文件
我的數據庫數據在/data/下用LVM做的,我在這還要強調一下,二進制日志必須與數據不在同一個磁盤上,這一點怎么提醒都不為過,最好日志能放到raid1有鏡像的地方上去。
mkdir /backup/
1、# innobackupex --user=root --password=mysql /backup///進行完全備份
2、# innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_13-49-52/ --incremental /backup/進行第一次增量備份
3、# innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_12-49-52/ --incremental /backup/進行第二次增量備份
4、# innobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56///第一次全量恢復,但是數據沒有回/data目錄下
5、# nnobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56/ --incremental-dir=/backup/2017-03-29_13-49-52/ //恢復第一次增量備份
6、# innobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56/ --incremental-dir=/backup/2017-03-29_13-53-57///恢復第二次增量備份
7、# innobackupex --copy-back /backup/2017-03-29_12-32-56///進行回滾操作,因為之前做過perpare操作,所以直接回滾就可以了,數據就回來了
8、# chown -R mysql.mysql /data/*
9、# service mysqld start//如果這時候出現Starting MySQL.. ERROR! The server quit without updating PID file (/var/mysql/data/localhost.localdomain.pid).
你就可以killall mysqld 把之前殘留的進程殺死,在啟動
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。