xtrabackup :只能夠備份innodb;mysql
可是咱們也須要備份myisam,而後就出來了一個工具:innobackupexsql
1.1 查看數據目錄:數據庫
[root@zhdy-03 ~]# ls /data/mysql/ auto.cnf db1 ibdata1 ib_logfile0 ib_logfile1 mysql mysql2 performance_schema test zhdy01 zhdy02 zhdy03 zhdy-03.err zhdy-03.pid
其實咱們徹底可使用mysqldump去備份myisam和innodb,可是速度有點慢,若是遇到大的數據庫很浪費時間!緩存
下面咱們就對如上的一些數據進行備份:服務器
1.2 安裝percona-xtrabackup工具:app
[root@zhdy-03 ~]# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm [root@zhdy-03 ~]# yum list | grep percona [root@zhdy-03 ~]# yum install percona-xtrabackup -y
1.3 建立一個備份的用戶:socket
先使用root帳戶登陸; mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bakuser'@'localhost' identified by 'zhangduanya'; Query OK, 0 rows affected (0.00 sec) 建立一個bakuser,且授予RELOAD,LOCK TABLES,REPLICATION CLIENT權限。 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 刷新一下權限;
1.4 備份:ide
首先建立一個備份的目錄; [root@zhdy-03 ~]# mkdir -p /data/backup/ [root@zhdy-03 ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock /data/backup --defaults-file用來根據my.cnf的信息找打聽他datadir數據存儲目錄 -S /tmp/mysql.sock指定socket,此方法只適用於本地鏈接,等同於「mysql -uroot -p123456」 /data/backup最後跟要備份到的目標目錄 [root@zhdy-03 backup]# du -sh * 92M 2017-08-23_21-23-46
若是在備份的時候有任何的錯誤,它會自動的中止,並輸出錯誤的信息!工具
1.5 備份對比:測試
[root@zhdy-03 backup]# ls /data/mysql/ auto.cnf db1 ibdata1 ib_logfile0 ib_logfile1 mysql mysql2 performance_schema test zhdy01 zhdy02 zhdy03 zhdy-03.err zhdy-03.pid [root@zhdy-03 backup]# ls /data/backup/2017-08-23_21-23-46/ backup-my.cnf ibdata1 mysql2 test xtrabackup_info zhdy01 zhdy03 db1 mysql performance_schema xtrabackup_checkpoints xtrabackup_logfile zhdy02
其實備份的文件+目錄幾乎是同樣的,可是是不能夠直接恢復使用的!
可是du -sh 的時候會小不少是由於部分數據多是緩存之類的
2.1 模擬數據庫被刪除:
先停掉數據庫; [root@zhdy-03 backup]# /etc/init.d/mysqld stop Shutting down MySQL.. SUCCESS! [root@zhdy-03 backup]# mv /data/mysql /data/mysql.bak [root@zhdy-03 backup]# ls /data/ backup mysql.bak wwwroot [root@zhdy-03 backup]# mkdir -p /data/mysql [root@zhdy-03 backup]# chown -R mysql.mysql /data/mysql
2.2 恢復數據:
第一步只是初始化了一下;
[root@zhdy-03 backup]# innobackupex --use-memory=512M --apply-log 2017-08-23_21-23-46/ -use-memory=512M:意思是恢復數據指定使用的內存爲512M; (由於這是虛擬機,因此只是測試,要是線上的服務器64G咱們可使用32G來恢復數據,這樣速度會更快些) --apply-log:指定須要恢復的日誌文件
2.3 如今進行恢復:
[root@zhdy-03 backup]# innobackupex --defaults-file=/etc/my.cnf --copy-back ./2017-08-23_21-23-46/ 便可恢復我們的備份到mysql目錄,並且是原來的位置由於這裏調用了datadir的緣故吧
再次檢查:
[root@zhdy-03 data]# du -sh * 190M backup 188M mysql 188M mysql.bak 132M wwwroot
3.1 先全量
innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password=zhangduanya -S /tmp/mysql.sock/data/backup 這裏沒有-S的指定socket其餘步驟相同,測試後不加-S不可備份,這裏需補上 xtrabackup: Transaction log of lsn (3037472) to (3037472) was copied. 170824 22:57:58 completed OK! ----------- 等待出現如上消息,意味着咱們已經對全量備份完畢。
查看全量備份:
[root@zhdy-03 ~]# ls /data/backup/ 2017-08-24_22-57-43 [root@zhdy-03 ~]# du -sh /data/backup/ 92M /data/backup/
3.2 建立增量備份
再開始以前,咱們先模擬增長一個庫,就是更改一下里面的數據庫
[root@zhdy-03 ~]# mysql -uroot -pzhangduanya -e "create database db123" //建立一個db123庫 [root@zhdy-03 ~]# mysql -uroot -pzhangduanya db123 < /tmp/mysqlbak.sql //把以前備份的數據恢復獲得db123庫 ##注意不用在意這裏備份進去的數據是什麼,這是在測試其可用性
第一次增量備份:
[root@zhdy-03 ~]# innobackupex --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir /data/backup/2017-08-24_22-57-43 ##這裏不須要指定mysql目錄了--defaults-file由於和這裏不要緊了 ##指定專門用來備份的帳號密碼,目錄和全量備份的數據 [root@zhdy-03 backup]# du -sh * 92M 2017-08-24_22-57-43 16M 2017-08-24_23-10-21 --------------------------- 第一次增量備份的數據只有16M;
3.3 模擬執行第二次增量備份
[root@zhdy-03 backup]# mysql -uroot -pzhangduanya -e "create database lalala" #建立庫 [root@zhdy-03 backup]# mysql -uroot -pzhangduanya lalala < /tmp/mysqlbak.sql #導入點數據 [root@zhdy-03 backup]# ls /data/mysql/ auto.cnf db123 ib_logfile0 lalala mysql2 test zhdy02 zhdy-03.err db1 ibdata1 ib_logfile1 mysql performance_schema zhdy01 zhdy03 zhdy-03.pid #找到咱們建立的兩個db123,和lalala [root@zhdy-03 backup]# innobackupex --user=bakuser --password='zhangduanya' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir /data/backup/2017-08-24_23-10-21 [root@zhdy-03 backup]# du -sh * 92M 2017-08-24_22-57-43 16M 2017-08-24_23-10-21 17M 2017-08-24_23-41-33 ----------------------------- 這裏特別注意,也是困擾不少人的一個關鍵操做,咱們再次作增量備份的時候要基於剛剛已經作了的基礎上面再次增量, 也就是2017-08-24_23-10-21。也就是說這樣此次的增量裏面纔會有剛剛第一次增量時添加的db123庫
4.1 爲了還原真實性,我模擬刪除數據庫,而且停掉mysql,利用我們已經備份的數據去恢復它。
[root@zhdy-03 backup]# /etc/init.d/mysqld stop Shutting down MySQL.. SUCCESS! [root@zhdy-03 data]# ls backup mysql wwwroot [root@zhdy-03 data]# mv /data/mysql/ /data/mysqlbak [root@zhdy-03 data]# ls /data/ backup mysqlbak wwwroot [root@zhdy-03 data]# mkdir /data/mysql [root@zhdy-03 data]# chown -R mysql.mysql /data/mysql [root@zhdy-03 data]# ls backup mysql mysqlbak wwwroot
爲了避免容易混淆,我先把backup目錄中的這些備份展現出來:
[root@zhdy-03 backup]# ls 2017-08-24_22-57-43 ##全量 2017-08-24_23-10-21 ##一次增量 2017-08-24_23-41-33 ##二次增量
4.2 先初始化全量備份:
[root@zhdy-03 data]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43 --apply-log:指定須要恢復的日誌文件 --redo-only:這個是整合合併的東西初始化時候用,最後一步不須要整合了 ---- /data/backup/2017-08-24_22-57-43:此爲我們第一次全量備份的數據。
4.3 初始化整合第一次的增量:
[root@zhdy-03 backup]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43 --incremental-dir=/data/backup/2017-08-24_23-10-21
4.4 初始化整合第二次的增量:
[root@zhdy-03 backup]# innobackupex --apply-log --redo-only /data/backup/2017-08-24_22-57-43 --incremental-dir=/data/backup/2017-08-24_23-41-33 ##實驗得出若是咱們再次作增量備份的時候沒有基於剛剛已經作了的基礎上面再次增量,那麼第二次備份恢復初始化就會報錯
4.5 再次把整合好的增量再次初始化一下:
[root@zhdy-03 backup]# innobackupex --apply-log /data/backup/2017-08-24_22-57-43 #這裏就沒有了--redo-only
4.6 最後一步恢復:
[root@zhdy-03 ~]# innobackupex --copy-back /data/backup/2017-08-24_22-57-43/
再次檢查數據:
[root@zhdy-03 ~]# ls /data/mysql db1 db123 ibdata1 ib_logfile0 ib_logfile1 lalala mysql mysql2 performance_schema test xtrabackup_info zhdy01 zhdy02 zhdy03
剛剛建立的db123和lalala也已經所有恢復!
[root@zhdy-03 ~]# /etc/init.d/mysqld start Starting MySQL. SUCCESS!