青蛙学Linux—MySQL备份工具XtraBackup
XtraBackup是Percona公司開發(fā)的一款免費開源的MySQL備份工具。與上一篇介紹的mysqldump不同,XtraBackup可以對MySQL進行物理備份(備份的是MySQL的文件而不是生成sql文件),且XtraBackup可以對MySQL進行在線備份。
1、安裝XtraBackup
要安裝XtraBackup,可以在Percona公司的官網(wǎng)上下載CentOS的RPM安裝包,也可以使用Percona提供的YUM源。這里介紹通過YUM進行安裝的方法。
首先在https://www.percona.com/downloads/percona-release/redhat/上下載Percona提供的YUM的RPM包,然后安裝該RPM包即可使用Percona的YUM源,通過該YUM源可以安裝所有的Percona產(chǎn)品。
通過以下命令查看可以安裝的XtraBackup版本:
[root@localhost ~]# yum list percona-xtrabackup*這里選擇2.4的版本進行安裝:
[root@localhost ~]# yum install percona-xtrabackup-24.x86_642、XtraBackup主要工具
使用XtraBackup進行備份時,主要使用以下兩個工具:
- xtrabackup
- innobackupex
xtrabackup工具只能備份InnoDB和XtraDB兩種引擎的數(shù)據(jù)庫,而且只備份idb文件不備份frm文件;同時,xtrabackup不能備份表結(jié)構(gòu)和觸發(fā)器等。
innobackupex是使用Perl腳本對xtrabackup進行的封裝和功能擴展。innobackupex可以備份和恢復MyISAM、InnoDB和XtraDB引擎的表和frm文件,所以通常使用innobackupex來備份MySQL。
這兩個工具都是根據(jù)MySQL配置文件my.cnf來獲取備份文件的,同時需要連接到數(shù)據(jù)庫和數(shù)據(jù)存儲目錄的操作權(quán)限。
注意:innobackupex在備份使用MyISAM的數(shù)據(jù)庫時,會對全庫進行加鎖操作,阻塞寫操作,若備份是在從庫上進行的話會影響主從復制,產(chǎn)生延遲。而對于使用InnoDB的數(shù)據(jù)庫,則不會阻塞讀寫。
3、XtraBackup備份恢復過程
3.1、MyISAM引擎
XtraBackup首先執(zhí)行flush tables with read lock生成鎖以阻止新的寫入,然后將表中的數(shù)據(jù)刷新使其全部保存到硬盤上,接著開始復制文件,文件復制完成后釋放鎖。
3.2、InnoDB引擎
備份
XtraBackup在開始備份時會記住log sequence number(LSN),然后開始復制文件。同時,XtraBackup會啟動一個后臺進程用于監(jiān)視事務日志,并從事務日志中復制最新的修改,該操作是持續(xù)進行的。所以XtraBackup在備份InnoDB時不會產(chǎn)生阻塞。
恢復—準備(prepare)階段
XtraBackup使用事務日志對備份的數(shù)據(jù)進行前滾和回滾操作,以保證這些數(shù)據(jù)與備份結(jié)束時的數(shù)據(jù)庫狀態(tài)一致。
恢復—恢復階段
XtraBackup在準備階段完成后,即可使用準備好的數(shù)據(jù)對InnoDB進行恢復。
4、使用XtraBackup
4.1、innobackupex語法及常用選項
innobackupex的命令語法如下:
innobackupex --選項常用選線:
- --host:指定連接的MySQL主機
- --port:指定連接的MySQL端口
- --socket:指定連接本地數(shù)據(jù)庫時使用的MySQL socket路徑
- --user:備份使用的MySQL用戶
- --password:備份使用的MySQL用戶的密碼
- --databases:對指定的數(shù)據(jù)庫進行備份,指定多個庫時使用”庫1 庫2 … 庫n”表示
- --no-timestamp:不使用以時間命名的目錄保存?zhèn)浞輸?shù)據(jù),使用名為BACKUP-DIR的目錄保存?zhèn)浞輸?shù)據(jù)
- --default-files:指定MySQL配置文件的路徑,該選項必須在所有選項之前;XtraBackup默認使用/etc/my.cnf這個配置文件
- --incremental:創(chuàng)建增量備份
- --incremental-basedir:指定基于哪個備份做增量備份
- --incremental-dir:在恢復階段的準備過程中用于指定增量備份的路徑
- --apply-log:應用xtrabackup_logfile文件,重做已提交的事務,回滾未提交的事務
- --redo-only:只重做已提交的事務,不回滾未提交的事務
- --use-memory:在恢復過程中的準備階段可以使用的內(nèi)存大小
- --copy-back:恢復備份到數(shù)據(jù)庫的數(shù)據(jù)存儲目錄
- --compact:壓縮備份
- --stream={tar|xbstream}:在備份過程中對數(shù)據(jù)進行流式化處理,不經(jīng)過中間階段直接壓縮
- --parallel:指定啟動的線程數(shù),用于提高備份速度
在使用XtraBackup進行備份時,建議創(chuàng)建一個僅用于執(zhí)行備份的MySQL用戶,只授予以下權(quán)限:
reload,lock tables,replication client,create tablespace,super,process4.2、使用innobackupex進行完全備份
這里使用一個例子來演示如何使用innobackupex對MySQL進行完全備份。
實驗環(huán)境:
- MySQL通過源碼安裝,配置文件未/etc/my.cnf,socket文件為/tmp/mysqld.sock
- 使用MySQL的backup用戶進行備份,用戶密碼為123456
- 備份數(shù)據(jù)存儲在目錄/data/backup/full目錄下
運行以下命令進行備份:
[root@localhost full]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock /data/backup/fullinnobackupex會在指定的備份目錄下產(chǎn)生一個以時間戳命名的目錄并將備份的數(shù)據(jù)存儲在該目錄中。在該目錄中除了備份的MySQL數(shù)據(jù)庫文件,還有以下幾個文件:
backup-my.cnf # 備份用到的配置選項信息 xtrabackup_checkpoints # 記錄備份的類型、起始LSN和結(jié)束LSN等信息 xtrabackup_info # 記錄備份過程中的各種詳細信息 xtrabackup_logfile # 事務日志文件,用于在恢復過程中的準備階段對備份的數(shù)據(jù)進行前滾和回滾操作4.3、使用完全備份進行恢復
這里通過將上面?zhèn)浞莸臄?shù)據(jù)進行恢復來介紹如何進行完全備份的恢復。
準備階段(prepare)
該階段僅對使用InnoDB引擎的MySQL有意義。在該階段中將調(diào)用xtrabackup_logfile對備份的數(shù)據(jù)進行前滾和回滾操作。使用以下命令執(zhí)行prepare:
[root@localhost full]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00恢復數(shù)據(jù)庫
在prepare階段執(zhí)行成功后,就可以恢復數(shù)據(jù)庫了。使用以下命令進行數(shù)據(jù)庫恢復:
[root@localhost full]# innobackupex --default-file=/etc/my.cnf --copy-back /data/backup/full/2019-01-29_15-22-00注意以下兩點:
- 進行恢復時必須先關(guān)閉MySQL服務
- MySQL的數(shù)據(jù)存儲目錄必須為空,因為innobackupex不會覆蓋已經(jīng)存在的文件
修改數(shù)據(jù)存儲目錄的權(quán)限
恢復完成后,必須修改重新生成的數(shù)據(jù)存儲目錄的權(quán)限為運行MySQL的用戶,否則MySQL將無法讀取該目錄:
[root@localhost db]# chown -R mysql:mysql mysql完成以上步驟后,啟動MySQL即可。
4.4、使用innobackup進行增量備份
第一次的增量備份必須基于一個完全備份,之后每次的增量備份都是基于上一次的增量備份進行的。
注意:增量備份主要針對InnoDB,對于MyISAM而言,仍然是完全備份。
這里通過上面的完全備份進行兩次增量備份來演示如何進行增量備份。
第一次增量備份(基于完全備份):
[root@localhost incremental]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental --incremental-basedir=/data/backup/full/2019-01-29_15-22-00第二次增量備份(基于第一次增量備份):
[root@localhost incremental]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental --incremental-basedir=/data/backup/incremental/2019-01-29_15-46-214.5、使用增量備份恢復數(shù)據(jù)庫
使用增量備份恢復數(shù)據(jù)庫相對來說步驟比較復雜,在prepare階段分為以下三個步驟:
這里使用上面生成的完全備份和兩次增量備份來演示如何使用增量備份進行數(shù)據(jù)庫的恢復:
第一次的prepare(使用完全備份):
[root@localhost backup]# innobackupex --apply-log --redo-only /data/backup/full/2019-01-29_15-22-00第二次的prepare(使用第一次的增量備份prepare到完全備份上):
[root@localhost backup]# innobackupex --apply-log --redo-only /data/backup/full/2019-01-29_15-22-00 --incremental-dir=/data/backup/incremental/2019-01-29_15-46-21第三次的prepare(使用第二次的增量備份prepare到完全備份上):
[root@localhost backup]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00 --incremental-dir=/data/backup/incremental/2019-01-29_15-50-42最后一次prepare(使用完全備份最后進行一次完整的prepare):
[root@localhost backup]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00成功執(zhí)行完以上操作后即可恢復數(shù)據(jù)庫了:
[root@localhost incremental]# innobackupex --default-file=/etc/my.cnf --copy-back /data/backup/full/2019-01-29_16-35-264.6、針對海量數(shù)據(jù)的備份優(yōu)化
針對海量數(shù)據(jù),可以使用XtraBackup提供的流式特性,在備份的過程中直接進行壓縮而不經(jīng)過中間環(huán)節(jié)。
這里通過一個例子來演示如何使用流式特性:將MySQL中的所有數(shù)據(jù)庫進行完全備份,并將備份直接打包成tar并調(diào)用gzip進行壓縮,保存在/data/bakcup/tar目錄下,運行以下命令
[root@localhost backup]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --stream=tar /data/backup/tar |gzip > /data/backup/tar/backup.tar.gz要對生成的tar.gz包進行解壓,需要添加i參數(shù):
[root@localhost tar]# tar -zixvf backup.tar.gz轉(zhuǎn)載于:https://www.cnblogs.com/yu2006070-01/p/10332626.html
總結(jié)
以上是生活随笔為你收集整理的青蛙学Linux—MySQL备份工具XtraBackup的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把2018年所有踩过的坑都记在这里。
- 下一篇: 运行SSIS包的几种方式